Linux下贪吃蛇的c语言实现

Posted Lewin~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下贪吃蛇的c语言实现相关的知识,希望对你有一定的参考价值。

#include<curses.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
#define UP 1
#define DOWN -1
#define LEFT  2
#define RIGHT -2

struct Snake
	int hang;
	int lie;
	struct Snake*next;
;//声明贪吃蛇结点的结构体

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

int key;
int dir;
struct Snake Food;

void initFood()

	int x=rand()%20;
	int y=rand()%20;

	Food.hang=x;
	Food.lie=y;
//初始化食物(在20x20的范围内随机生成食物)
void initNcurse()

	initscr();
	keypad(stdscr,1);//开启小键盘方向键输入捕捉支持
//初始化Ncurses(选择要使用的功能函数)

void addNode()

	struct Snake*new=(struct Snake*)malloc(sizeof(struct Snake));
	new->next=NULL;
	switch(dir)

		case UP:
			new->hang=tail->hang-1;
			new->lie=tail->lie;
			break;
		case DOWN:
			new->hang=tail->hang+1;
			new->lie=tail->lie;
			break;
		case LEFT:
			new->hang=tail->hang;
			new->lie=tail->lie-1;
			break;
		case RIGHT:
			new->hang=tail->hang;
			new->lie=tail->lie+1;
			break;
	
	tail->next=new;
	tail=new;
//增加贪吃蛇身体结点

void deleNode()

	head=head->next;
//删除贪吃蛇身体的头结点

void initSnake()
   struct Snake* p;
	dir=RIGHT;  //默认行走方向
	
	if(head!=NULL)
		p=head;
		head=head->next;
		free(p);
	
	initFood();
	head=(struct Snake*)malloc(sizeof(struct Snake));
	head->hang=2;
	head->lie=2;
	head->next=NULL;
	tail=head;
	addNode();
	addNode();
	addNode();


int hasSnakeNode(int hang,int lie)
       struct Snake*p;
	p=head;
	while(p!=NULL)       
		if(p->hang==hang && p->lie==lie)
			return 1;
		
		p=p->next;
	

	return 0;        
   //判断地图上当前坐标位置是否存在贪吃蛇身体结点

int hasFood(int hang,int lie)
 
	if(Food.hang==hang && Food.lie==lie)

		return 1;
	

	return 0;
 //判断地图上当前坐标位置是否存在食物
void initMap()
	int hang;
	int lie;
	move(0,0);


	for(hang=0;hang<20;hang++)

		if(hang==0)

			for(lie=-1;lie<20;lie++)

				printw("--");   
			
			printw("\\n");
		
		if(hang>=0 || hang<=19)

			for(lie=-1;lie<=20;lie++)

				if(lie==-1||lie==20)

					printw("|");
				

				else if( hasSnakeNode(hang,lie))

					printw("[]");
				
				else if( hasFood(hang,lie))
					printw("##");
				
				else

					printw("  ");
				

			 
			printw("\\n");            
		

		if(hang==19)
			for(lie=-1;lie<20;lie++)

				printw("--");

			 
			printw("\\n");
			printw("by chenhongming\\n");
			printw("food(%d,%d),",Food.hang,Food.lie);
			printw("snake head(%d,%d)\\n",tail->hang,tail->lie);
		  

	 
//绘制地图


int issnakedie()

	struct Snake* p;
	p=head;

	if(tail->hang<0 || tail->lie==-1 || tail->hang==20 || tail->lie==20)

		return 1;
	
	while(p->next!=NULL)
		if(p->hang==tail->hang && p->lie==tail->lie)

			return 1;
		
		p=p->next;
	
	return 0;
//判断??是否死亡 


void moveSnake()

	addNode();
	if(hasFood(tail->hang,tail->lie))
		initFood();
	

	else
		deleNode();
	  

	if(issnakedie())

		initSnake();
		

	       
//移动??身(在尾部添加结点 删除头结点 有食物则不删)
void*  refreshjiemian()
      
	while(1) 
		moveSnake();
		initMap();
		refresh();

		usleep(100000);


	 
//刷新界面(不断的移动??和刷新地图 )
void turn(int direction)

	if(abs(dir) !=abs(direction))
		dir=direction;
	
//转向


void* changeDir()


	int key;
	while(1)
		key=getch();
		switch(key)
			case KEY_DOWN:
				turn(DOWN);
				break;   
			case KEY_UP:
				turn(UP);
				break;
			case KEY_RIGHT:
				turn(RIGHT);
				break;
			case KEY_LEFT:
				turn(LEFT);        
				break; 
		
	
//不断从键盘获取方向键的命令
int main()




	//char 1byte 8bit 128
        initNcurse();
        initSnake();
        initMap();

        pthread_t t1;
        pthread_t t2;
        pthread_create(&t1,NULL,refreshjiemian,NULL);
        pthread_create(&t2,NULL,changeDir,NULL);
		//利用线程同时执行 刷新界面和获得方向的函数
        while(1);

	//    getch();
	endwin();
	return 0;

运行gcc snake.c -lpthread -lcurses
然后上下左右方向键

以上是关于Linux下贪吃蛇的c语言实现的主要内容,如果未能解决你的问题,请参考以下文章

Linux下贪吃蛇的c语言实现

c语言 贪吃蛇 程序

关于C语言写贪吃蛇时,蛇的身体以及移动该怎么写

用C语言编写 贪吃蛇的思路啥怎么样的

C语言之贪吃蛇(ncurses)

C语言课程设计,贪吃蛇应该怎么做?