linux下基于Ncurses的贪吃蛇

linux下基于Ncurses的贪吃蛇

#include<stdio.h>
#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  food;

int key;
int dir;
int score = 0;
struct Snake *head;
struct Snake *tail;

//初始化食物 通过rand函数随机产生
void initsnakefood()
{

	int x ;
	int y ;
	x= rand()%20;
	y= rand()%20;
	food.hang = x;
	food.lie  = y;

}

//判断蛇的节点是否在地图中
int judgesnakenode(int i,int j)
{
	struct Snake *p;
	p = head;
	while( p!= NULL )
	{
		if( p->hang == i && p->lie == j)
		{
			return 1;
		}
		p = p->next;
	}
		
	return 0;
}


//判断是否出现食物
int hasfood(int x,int y)
{

	if(food.hang == x && food.lie ==  y)
	{
		return 1;
	}
		return 0;
}

//初始化Ncurses
void initNcurses()
{
	initscr();
	keypad(stdscr ,1);
}


//初始化地图20x20
void GameMap()
{
	int i,j;

	move(0,0);
	for( i = 0 ;i < 20 ;i++)
	{
		if(i == 0)
		{
			for( j = 0 ;j < 20; j++)
			{
				printw("--");
			}
			printw("\n");
                }
		if(i>=0 && i<20)
		{
			for( j = 0 ;j <=20 ; j++)
			{
				if( j== 0 || j ==20)
				{
					printw("|");
				}
				
				else if(judgesnakenode(i,j)==1)
				{
					printw("[]");
				}
				else if(hasfood(i,j)==1)
				{

					printw("##");
				}
	
				else
				{
					printw("  ");
				}
			
			}
					printw("\n");
		}
			
		if( i== 19)
		{
			for( j = 0 ;j <20 ;j++)
			{
				printw("--");
			}

			printw("\n");	
			printw("By  xiao yin student  [2021-4-7]\n"); 
		}
	}
		
}

//增加节点
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 initSnake()
{
	struct Snake *p ;

	dir = RIGHT;
	while( head!= NULL)
	{
		p = head;
		head = head->next ;
		free(p);
	}

//初始化食物
	initsnakefood();
	head = (struct Snake *) malloc (sizeof(struct Snake));
	
	head -> hang = 2;
	head -> lie  = 1;
	head -> next = NULL;


	tail = head;
}

//删除节点
void deletenode()
{
	struct Snake *p ;
	p= head ;
	head = head ->next;
	free(p);

}

//判端蛇是否死亡

int ifsnakedie()
{

	struct Snake *p ;
	p = head;
	
	if(tail->hang <0 ||tail ->hang == 20|| tail->lie ==0 ||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)==1)
	{
		initsnakefood();

	}
	else
	{
		deletenode();
	}
	if(ifsnakedie())
	{

		initSnake();
	} 
}



//通过现场刷新界面
void *refreshMap()
{
	while(1)
	{
		movesnake();
		GameMap();
		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_LEFT :
				turn ( LEFT);
				break;
			
			case KEY_RIGHT :
				turn ( RIGHT);
				break;
		}

	}	
}




void startgame()
{

	printw("#############################################################\n");
	printw("|                                                           |\n");
	printw("|                     Snake  Game                           |\n");
	printw("|                                                           |\n");
	printw("|                 1.Start      2. Over                      |\n");
	printw("#############################################################\n");
	printw("|                                                           |\n");
	printw("|Author: xiao yin student [2021-4-7]      1.1.0             |\n");
	printw("-------------------------------------------------------------\n");

} 



//主函数
int main()
{

       	
	pthread_t t1;
	pthread_t t2;
//	startgame();
	initNcurses();
	initSnake();
	GameMap();
	pthread_create(&t1,NULL,refreshMap,NULL);
	pthread_create(&t2,NULL,changedir, NULL);

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值