首页 > 系统相关 >基于LINUX系统下多线程贪吃蛇小游戏

基于LINUX系统下多线程贪吃蛇小游戏

时间:2023-04-18 16:34:42浏览次数:48  
标签:head int tail 贪吃蛇 Snake LINUX 多线程 col row

基于LINUX系统下多线程贪吃蛇小游戏_#define

基于Ncurse图形库的C语言小游戏 。涉及到,C变量,流程控制,函数,指针,结构体等知识内容,动态链表的创建和插入, 以及释放。数组的遍历,

#include <stdlib.h>
#include <curses.h>


#define ROW 20
#define COL 20

#define ROW_Snake 2
#define COL_Snake 2

#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2

int key;
int dir;

int has_snake_node(int I,int J);
void initfood();
int if_snake_die();


struct Snake 
{
	int row_s;
	int col_s;
	struct Snake *next;
};

struct Snake *head = NULL;
struct Snake *tail = NULL;

struct Snake food;

void initNcurse()
{
	initscr();
	keypad(stdscr,1);
	noecho();
}

void game_map(int row,int col)
{
	int i;
	int j;

	move(0,0);

	for(i=0;i<row;i++)
	{
		printw("--");
	}
	printw("\n");
	for(i=1;i<row;i++)
	{
		int j = 0;
		for(j=0;j<=col;j++)
		{
			if(j==0)
			{
				printw("|");
				
			}
			else if(j==col)
			{
				printw("|\n");
			}
			else if(has_snake_node(i,j))
			{
				printw("[]");
			}
			else if(has_food(i,j))
			{
				printw("##");
			}

			else
			printw("  ");
		}
	}
	for(i=0;i<row;i++)
	{
		printw("--");
	}
	printw("\n");
	printw("BY LFF,food %d %d",food.row_s,food.col_s);
}

void add_node()
{
	struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake));
	new->next = NULL;

	switch(dir)
	{
		case UP:
			new->row_s = tail->row_s-1;
			new->col_s = tail->col_s;
			break;
		case DOWN:
                        new->row_s = tail->row_s+1;
                        new->col_s = tail->col_s;
                        break;
		case LEFT:
                        new->row_s = tail->row_s;
                        new->col_s = tail->col_s-1;
                        break;
		case RIGHT:
                        new->row_s = tail->row_s;
                        new->col_s = tail->col_s+1;
                        break;


	}
	tail->next = new;
	tail = new;
}

void delete_node()
{
	struct Snake *p;
	p = head;
	head = head->next;

	free(p);
}



void initsnake_body(int row_snake,int col_snake)
{
	struct Snake *p;
	
	dir = RIGHT;
	
	while(head!=NULL)
	{
		p = head;
		head = head->next;
		free(p);

	}
}
	initfood();
{
	head = (struct Snake *)malloc(sizeof(struct Snake));
	head->row_s = row_snake;
	head->col_s = col_snake;
	head->next = NULL;
	
	tail = head;

	add_node();
	add_node();
	add_node();
	
}

int has_snake_node(int I,int J)
{
	struct Snake *p;
	p = head;
	
	while(p != NULL)
	{
		if(p->row_s == I && p->col_s == J)
		{
			return 1;
		}
		p = p->next;
	}
	return 0;
}

void initfood()
{
	int x = rand()%18+1;
	int y = rand()%18+1;

	food.row_s = x;
	food.col_s = y;

}

int has_food(int I,int J)
{
	if(food.row_s == I && food.col_s == J)
	{
		return 1;
	}
	return 0;
}


void move_snake()
{
	add_node();
	
	if(has_food(tail->row_s,tail->col_s))
	{
		initfood();
	}
	else
	{
		delete_node();
	}
	if(if_snake_die())
	{
		initsnake_body(ROW_Snake,COL_Snake);
	}

}



void refresh_map()
{
        while(1)
        {
                move_snake();
                game_map(ROW,COL);
                refresh();
                usleep(100000);
        }

}

void turn(int direction)
{
	if(abs(dir) != abs(direction))
	{
		dir = direction;
	}
}


void chang_dir()
{
	while(1)
	{
		key = getch();
		switch(key)
		{
		case KEY_DOWN:
			turn(DOWN);
			break;
		case KEY_UP:
                        turn(UP);
                        break;
		case KEY_LEFT:
                        turn(LEFT);
                        break;
		case KEY_RIGHT:
                        turn(RIGHT);
                        break;


		}

	}

}

int if_snake_die()
{
	struct Snake *p;
	p = head;

	if(tail->row_s == 0 || tail->col_s == 0 || tail->row_s == 20 || tail->col_s == 20)
	{
		return 1;	
	}

	while(p->next!=NULL)
	{
		if(p->row_s == tail->row_s && p->col_s == tail->col_s)
		{
			return 1;
		}
		
		p = p->next;
	}
	return 0;
}

int main()
{

	pthread_t t1;
	pthread_t t2;

	initNcurse();
//	initscr();	

	initsnake_body(ROW_Snake,COL_Snake);
	game_map(ROW,COL);

	pthread_create(&t1,NULL,refresh_map,NULL);
	pthread_create(&t2,NULL,chang_dir,NULL);

	while(1);

	getch();
	endwin();
	return 0;
}




标签:head,int,tail,贪吃蛇,Snake,LINUX,多线程,col,row
From: https://blog.51cto.com/u_15906483/6203655

相关文章

  • linux——misc杂项设备
    简介Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。正因为简单,所以它通常嵌套在platform总线驱动中,配合总线驱动达到更复杂,多功能的效果。源码[[05.miscdevice源码]]![[Pastedimage79.png]]parent这个指针决......
  • linux安装两个python版本
    1.下载python3安装包wgethttps://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz2.解压python的tgz压缩包文件tar-xzvfPython-3.7.2.tgz3.进入解压的文件cdPython-3.7.24.在python文件路径下编译pythonprefix=/usr/local/python37,指定python安装路径,这个路径......
  • Linux操作系统网络模块
    Linux操作系统的网络模块是负责网络通信的核心部分。它通过实现各种协议和算法,使得计算机能够在网络中进行数据交换和通信。网络模块主要包括以下几个方面的功能:(1)IP协议栈:负责处理网络层的数据包,实现IP地址的分配、路由选择等功能。IP协议栈是网络模块中最基本的部分,它负责处理......
  • Redis Linux环境 安装,卸载,启动,通用名令,数据结构,字符串类型操作
    目录Redis高级Linux下安装redis卸载教程redis启动方式1.在redis目录下的src文件路径下2.动态参数启动3.配置文件启动客户端连接命令配置文件redis通用命令redis数据结构Redis字符串类型操作redis单线程为什么这么快Redis高级速度快:10wops(每秒10w读写),数据存在内存中,c语言实现,单......
  • linux——file_operations
    结构体源码[[03.file_operations结构体源码]]![[Pastedimage78.png]]Linux使用file_operations结构访问驱动程序的函数,这个结构的每一个成员的名字都对应着一个调用。Linux的设备驱动程序工作的基本原理用户进程利用在对设备文件进行诸如read/write操作的时候,系统调用通过......
  • linux——I2C驱动
    HKA_S32ISPWriteI2CData(HKA_U8u8I2cDev,HKA_U8u8DevAddr,HKA_U32u32RegAddr,HKA_U32u32RegAddrByteNum,HKA_U32u32Data,HKA_U32u32DataByteNum){intret=0;structi2c_adapter*padap=NULL;structi2c_msgmsg;......
  • linux蚁剑入门到熟悉文档地址整理
    linux蚁剑入门到熟悉文档地址收录蚁剑GetHub地址帮助文档kali安装出现问题的解决方式kali安装记录linuxdebian下载解压后进入文件内,使用root身份执行./AntSword后选择下载运行环境,新建并选择位置即可之后再次./AntSword即可......
  • Qt多线程之QMutex
    QMutex同一个QMutexlock()时,其他的lock()操作要等待locked的地方unlock()(可以保证顺序执行)测试代码:#include<iostream>#include<QThread>#include<QMutex>usingnamespacestd;classmyThread1:publicQThread{public:myThread1(int&num,QMutex&......
  • linux——堆、栈、内存映射
    C的虚拟内存区域划分CodeArea(代码区):程序代码指令、常量字符串,只可读。StaticArea(静态区、全局区):存放全局变量/常量、静态变量/常量。该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以改的。Heap(堆):由程序员控制,使用malloc/free来操作。(空间最大)Stack(栈......
  • Linux服务器怎么关闭防火墙
    Linux服务器怎么关闭防火墙在很多情况下,防火墙都会组织一些端口号的通讯。比如我们的tomcat,nginx,redis明明安装的没问题,但在外部就是访问不了,那很有可能就是防护墙的原因了。我是艾西,今天跟大家分享下Linux服务器怎么关闭防火墙一、重启后永久性生效:开启:chkconfigiptableson关闭:c......