Linux环境下的贪吃蛇小游戏

首先引入curses和pthread库用于实现键盘读取与多线程

#include <curses.h>
#include <stdlib.h>
#include <pthread.h>
#define Hang 20
#define Lie 20


#define UP    1
#define DOWN  2
#define LEFT  3
#define RIGHT 4

首先创建一个地图

 void printmap(){

  int hang;
  int lie;

  move(0,0);
 for(hang=0;hang<=Hang;hang++){
    if(hang==0){
	 for(lie=0;lie<Lie;lie++){
		printw("--");
         }
	    printw("\n");
               }
        if(hang>0&&hang<20) 
     {
	for(lie=0;lie<=Lie;lie++){
		if(lie==0||lie==Lie)
		printw("|");
		else if(have_snakebody(hang,lie))
	    {
		printw("[]");
	 }
		else if(have_snakefood(hang,lie))
	{
		printw("##");
	}
		else
		printw("  ");
	}
                printw("\n");
	
}
  	 if(hang==20)  
       {
         for(lie=0;lie<Lie;lie++){
		printw("--");
              }    
	 printw("\n");
	 printw("make by zsw");
	 printw("%d",dir);	
       }	

		
 }		

}

接着创建蛇身及食物的结构体并初始化头结点和尾结点

 struct Snake
{
	int hang;
	int lie;
	struct Snake *next;
};
struct Snake food;
struct Snake *head=NULL;
struct Snake *tail=NULL;
void initfood()
{
	int x=rand()%20;
	int y=rand()%20;
	food.hang=x;
	food.lie=y;
}

采用尾插法来增加一个结点使蛇变长

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 deletnode()
{	
	struct Snake *p;
	p=head;
	head=head->next;
	free(p);	
}

初始化一只蛇

void snakebodyinit(){
struct Snake *p;
    dir=4;  
initfood(); 
while(head!=NULL)
{
	p=head;
	head=head->next;
	free(p);
}
head=(struct Snake*)malloc(sizeof(struct Snake));
head->hang=2;
head->lie=2;
head->next=NULL;

tail=head;
addnode();
addnode();
addnode();

}

扫描蛇身与食物位置在printmap中显示

int have_snakebody(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 have_snakefood(int i,int j)
{
	if(food.hang == i && food.lie == j){
		return 1;
	}

	return 0;
                
	
}

撞墙检测

void moveSnake()
{
 struct Snake *new;

 addnode();
if(have_snakefood(tail->hang,tail->lie))
{initfood();
food.hang=food.hang+1;}
else
 deletnode();
 if(tail->hang==20||tail->lie==20||tail->hang==0||tail->lie==0)
	{
		snakebodyinit();
	}
}

游戏基本元素初始化与按键扫描

void  snake_int(){
  initscr();
  keypad(stdscr,1);

}
void* get_dir()
 {
	
	while(1)
     {
        
                          key = getch();
                switch(key){
                        case KEY_DOWN:
                                dir = DOWN;
				break;
                        case KEY_UP:
                                dir = UP;
                                break;
                        case KEY_LEFT:
                                dir = LEFT;
                                break;
                        case KEY_RIGHT:
                                dir = RIGHT;
                                break;

                }


        
     }
 }

刷新控制蛇的速度

void *refreshinterface()
{	while(1)
	{
		moveSnake();
		printmap();
                refresh();
	        usleep(100000);
	}
		 	
}

在主函数使用pthrea_t开辟多线程空间实现多线程同时扫描按键刷新屏幕

int main(){

	int control;
	pthread_t th1,th2;
	snake_int();
	snakebodyinit();
	printmap();
	pthread_create(&th1, NULL, refreshinterface, NULL);
	pthread_create(&th2, NULL, get_dir, NULL);
	while(1);
	
	 	
        
		
	
	
   
 getch();
 endwin();

  return 0;
}

项目已开源需要源码请留言

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值