Linux下的贪吃蛇小游戏

251 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Linux下的贪吃蛇小游戏

用c语言做个贪吃蛇小游戏

最近在学习linux,通过做贪吃蛇小游戏来熟悉命令行的使用。

以下是本游戏的源代码

注意:在linux上是可以运行的

用到了ncurse,也用到了线程。

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

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

struct Snake
{
	int row;
	int col;
	struct Snake *next;	
};

struct Snake *head=NULL;
struct Snake *tail=NULL;
int key;
int dir;
struct Snake food;

int HasSnakeNode(int i,int j)
{	
	struct Snake *p;
 	p=head;
	while(p!=NULL)
	{
		if(p->row==i&&p->col==j)
			return 1;
		p=p->next;
	}
	return 0;
}

int hasFood(int i,int j)
{
	if(food.row==i&&food.col==j)
		return 1;
	return 0;
	
}


void initFood()
{
	int x = rand()%20;
	int y = rand()%20;
	food.row=x;
	food.col=y;

}

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

void GameMap()
{
	move(0,0);
	int row,volume;
	for(row=0;row<20;row++)
	{	
		if(row==0)
		{
			for(volume=0;volume<20;volume++)
			{
				printw("--");			
			}
			printw("\n");
		}
		if(row>=0&&row<=19){
			for(volume=0;volume<=20;volume++)
			{
				if(volume==0||volume==20)
				printw("|");
				else if(HasSnakeNode(row,volume))
					printw("[]");
				else if(hasFood(row,volume))
					printw("$$");
				else printw("  ");	
			}
			printw("\n");
		}
		if(row==19)
		{
			for(volume=0;volume<20;volume++)
			{
				printw("--");
			}
			printw("\n");
			printw("Create by LiZhenKai key=%d\n",key);
		}
	}

}

void addNode()
{
	struct Snake *new=(struct Snake *)malloc(sizeof(struct Snake));
	new->next=NULL;
	switch(dir){
		case UP:	
			new->row=tail->row-1;
			new->col=tail->col;
			break;
		case DOWN:	
			new->row=tail->row+1;
			new->col=tail->col;
			break;
		case LEFT:	
			new->row=tail->row;
			new->col=tail->col-1;
			break;
		case RIGHT:	
			new->row=tail->row;
			new->col=tail->col+1;
			break;
	}
	tail->next=new;
	tail=new;
}

void deleNode()
{
	struct Snake *p;
	p=head;
	head=head->next;
	free(p);
}

void initSnake()
{
	dir = RIGHT;
	struct Snake *p;
	while(head!=NULL){
		p=head;
		head=head->next;
		free(p);
	}
	initFood();
	head=(struct Snake *)malloc(sizeof(struct Snake));
	head->row=2;
	head->col=2;
	head->next=NULL;
	tail=head;
	addNode();
	addNode();	
}

int ifDie()
{
	struct Snake *p;
	p=head;
	if(tail->row<0||tail->col==0||tail->row==20||tail->row==20)
		return 1;
	while(p->next!=NULL){	
		if(p->row==tail->row&&p->col==tail->col)
			return 1;		
		p=p->next;
	}
	return 0;
}

void moveSnake()
{
	struct Snake *p;
	
	addNode();
	if(hasFood(tail->row,tail->col))
		initFood();	
	else
		deleNode();
	if(ifDie()){
		initSnake();
	}
}

void refreshMap()
{

	while(1){
			moveSnake();
			GameMap();	
			refresh();
			usleep(200000);	
	}
}

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

void changeDir()
{
	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 main()
{
	pthread_t t1;
	pthread_t t2;
	Init();
	initSnake();
	GameMap();

	pthread_create(&t1,NULL,refreshMap,NULL);
	pthread_create(&t2,NULL,changeDir,NULL);
	while(1);

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