linux-c语言练手——贪吃蛇小游戏

一、安装ncurse库

因为linux中自带的获取用户输入函数都不是很好用,不能快速响应用户的输入,所以这里使用ncurse库,更好地获取用户输入信息。

  1. 下载ncurse包
ncurse库下载:http://ftp.gnu.org/pub/gnu/ncurses/
  1. 移动压缩包到bin目录下
cp ncurses-6.1.tar.gz /bin/
  1. 进入到bin目录下,解压包
tar -xzvf ncurses-6.1.tar.gz
  1. 解压完后进入ncurses-6.1目录
cd ncurses-6.1
  1. 运行配置文件
./configure --without-cxx

运行完后输入make编译

make
  1. 安装
make install
  1. 完成

二、ncurse的使用

因为ncurse已经非常落后了,所以我们不需要深入学习,只会浪费时间,只能说是我们这个小游戏需要用到,小小的知道一点点函数的用法就行

#include  //ncurse头文件
int main()
{
	initscr();     //ncurse界面的初始化函数
	printw("this is test"); //ncurse界面下的printf
	getch();        //等待用户输入,如果没有这句话,程序就退出了,看不到上面打印的话
	endwin();     //程序退出,调用该函数来恢复shell终端的显示,如果没有这句话,shell终端字乱码,会坏掉
	return 0;
}

linux-c语言练手——贪吃蛇小游戏_第1张图片
可以看到我们想要的上下左右键在头文件里已经宏定义好了,这些叫做功能性按键,要使用这些按键,就必须使用keypad(stdscr,1)函数,1代表接收,
图形界面是这个样:
linux-c语言练手——贪吃蛇小游戏_第2张图片

下面附上贪吃蛇完整代码:

#include
#include
#include
#include
#include
#include

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

int dir=0;  //定义一个方向变量
typedef struct snake{
	int hang;
	int lie;
	struct snake *next;
}snake,*psnake;     //定义蛇结构体

psnake head=NULL;   //实例化蛇尾
psnake tail=NULL; 	//实例化蛇头
psnake food=NULL;	//实例化食物
int flag=0;        
int key;


void addnode();  
void initfood();
void deletenode()//删除蛇尾
{
	
	psnake p=(psnake)malloc(sizeof(snake));
	p=head;
	head=head->next;
	free(p);
	p=NULL;

}             
void initsnake() //初始化蛇
{
	dir=-2;
	initfood();
	psnake p=(psnake)malloc(sizeof(snake));
	p=head;
	while(head){
		head=head->next;
		free(p);
		p=head;
	}
	head=(psnake)malloc(sizeof(snake));
	tail=(psnake)malloc(sizeof(snake));
	head->hang=2;
	head->lie=2;
	head->next=NULL;
	tail=head;
	addnode();
	
}
void initfood()  //初始化食物
{
	
	food=(psnake)malloc(sizeof(snake));
	food->hang=(rand()%38)+2;
	food->lie=(rand()%40)+1;
	food->next=NULL;
}
int havefood(int hang,int lie)  //食物的判断
{
	if(food->hang==hang&&food->lie==lie){
		return 1;
	}
	return 0;
}
int ifeat()      //是否吃到食物的判断
{
	if((food->hang==tail->hang)&&(food->lie==tail->lie)){
		return 1;
	}
	return 0;
}
void longer() //蛇吃食后变长
{
	if(ifeat()){
		addnode();
		initfood();
	}
}
int havesnake(int hang,int lie) //蛇身判断
{
	psnake p=(psnake)malloc(sizeof(snake));
	p=head;
	while(p){
		if(p->hang==hang&&p->lie==lie){
			return 1;
		}
		p=p->next;
	}
	return 0;
}
void initjiemian()    //初始化图形界面
{
	move(0,0);
	for(int hang=1;hang<=changkuang;hang++){
		for(int lie=1;lie<=changkuang;lie++){
			if(lie==1){
				printw("|");	
			}
			if(hang==1||hang==changkuang){
				printw("--");		
			}else if(havesnake(hang,lie)){
				printw("()");

			}else if(havefood(hang,lie)){
				printw("##");
			}
			else{
				printw("  ");
			}
			if(lie==changkuang){
				printw("|");
			}
		}
		printw("\n");
	}
	printw("sct:%d\n",key);
}
void turn(int a)   //判断是否在反方向按键,如果在反方向按键
{				   //不让蛇调转
	if(abs(a)!=abs(dir)){
		dir = a;
	}
}
void *panduan()   //判断上下左右键的输入
{
	while(1){
		key=getch();
		switch(key){
			case KEY_DOWN:
				turn(-1);break;
			case KEY_UP:
				turn(1);break;
			case KEY_LEFT:
				turn(2);break;
			case KEY_RIGHT:
				turn(-2);break;
		}
	}
}
void addnode()  //增加一个节点
{
	psnake new=(psnake)malloc(sizeof(snake));
	new->next=NULL;
	switch(dir){
		case -2:
			new->hang=tail->hang;
			new->lie=tail->lie+1;break;
		
		case 1:
			new->hang=tail->hang-1;
			new->lie=tail->lie;break;
                	
		case 2:
			new->hang=tail->hang;
			new->lie=tail->lie-1;break;
		
		case -1:
			new->hang=tail->hang+1;
			new->lie=tail->lie;break;
	}
	tail->next=new;
    tail=tail->next;
	if(new->lie>changkuang||new->hang>=changkuang||new->lie==0||new->hang==1){
		initsnake();
		initjiemian();
		flag=1;
	}else{
		flag=0;
	}
}
void ifbodyandfood() //判断蛇是否吃到食物
{
	psnake p=(psnake)malloc(sizeof(snake));
	p->next=NULL;
	p=head->next;
	while(p){
		if(p->hang==food->hang&&p->lie==food->lie){
			initfood();
			return;
		}	
		p=p->next;
	}
	return;
}
void ifheadandbody() //蛇是否咬到自己
{	
	psnake p=(psnake)malloc(sizeof(snake));
	p->next=NULL;
	p=head->next;
	while(p){
		if(head->hang==p->hang&&head->lie==p->lie){
			initsnake();
			return;
		}
		p=p->next;
	}
	return;
}
void *refreshjiemian()  //里面while循环不断刷新页面,让蛇自己
{					    //动起来
	while(1){
		addnode();
		if(!flag){
			deletenode();
		}
		longer();
		ifbodyandfood();
		ifheadandbody();
		initjiemian();
		refresh();
		usleep(100000);
	}
}
int main()
{
	//使用两个线程,一个不断检测玩家的按键响应,一个让界面
	//不断刷新,让蛇动
	pthread_t th1;
	pthread_t th2;

	initscr();
	initfood();
	initsnake();
	initjiemian();
	keypad(stdscr,1);
	
	pthread_create(&th1,NULL,panduan,NULL);
	pthread_create(&th2,NULL,refreshjiemian,NULL);

	while(1);
	endwin();
	return 0;
}

你可能感兴趣的:(c语言,linux,c语言)