贪吃蛇c版

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

struct snack
{
	int heng;
	int shu;
	struct snack *next;
};
struct snack *head=NULL;
struct snack *tail=NULL;
struct snack food;
int light;
int h=20;
int s=22;
int count=1;
int c_count;
void curses_init()
{
	initscr();
	keypad(stdscr,TRUE);
	noecho();
}
void snack_food()
{
	int x,y;
	x=rand()%20;
	y=rand()%20;
	if(x==0 || x==19 ||y==0)
	{
		food.heng=5;
		food.shu =5;
	}
	else{
		food.heng=x;
		food.shu =y;
	}
}
int snackfood_traverse(int i,int j)
{
	if(food.heng==i && food.shu==j)
	{
		return 1;
	}
	return 0;
}
int snack_traverse(int i,int j)
{
	struct snack  *p;
	p=head;
	while(p!=NULL)
	{
		if(p->heng==i && p->shu==j)
		{
			c_count=count;
			return c_count;
		}
		p=p->next;
	}
	return 0;
}
void snack_map()
{
	move(0,0);
	int i,j;
	int x;
	int c_x,x_y;
	for(i=0;i<h;i++)
	{
		if(i==0)
		{
			for(j=0;j<s;j++)
			{
				printw("* ");
			}
			printw("\n");
		}
		if(i>=0 && i<=h-2)
		{
			for(j=0;j<s;j++)
			{
				if(j==0)
				{
					printw("* ");
				}
				else if(j==s-1)
				{
					printw("*");
				}
				else if(x=snack_traverse(i,j))
				{
					if(x>=1 &&x<=9)
					{
						printw("0%d",x);
					}else if(x>=10 && x<=99)
					{
						printw("%d",x);
					}
					else{
						printw(" %d",x%20);
					}
				}
				else if(snackfood_traverse(i,j))
				{
					printw("op");
				}
				else 
				{
					printw("  ");
				}
			}
			printw("\n");
		}
		if(i==h-1)
		{
			for(j=0;j<s;j++)
			{
				printw("* ");
			}
			printw("\n");
		}
	}
	printw("food.heng:%d\n",food.heng);
	printw("food.shu:%d\n",food.shu);
	printw("count:%d\n",count);
	printw("c_count:%d\n",c_count);
}
void snack_del()
{
	struct snack *p;
	p=head;
	head=head->next;
	free(p);
}
void snack_abs(int i)
{
	if(abs(light) != abs(i))
	{
		light=i;
	}
}
void snack_add()
{
	struct snack *new;
	new=(struct snack*)malloc(sizeof(struct snack));
	switch(light)
	{
		case UP   :
			new->heng=tail->heng-1;
			new->shu =tail->shu;
			break;
		case DOWN :
			new->heng=tail->heng+1;
			new->shu =tail->shu;
			break;
		case RIGHT:
			new->heng=tail->heng;
			new->shu =tail->shu+1;
			break;
		case LEFT :
			new->heng=tail->heng;
			new->shu =tail->shu-1;
			break;
	}
	new->next=NULL;
	tail->next=new;
	tail=new;
}
void snack_head()
{
	struct snack *p;
	while(head !=NULL)
	{
		p=head;
		head=head->next;
		free(p);
	}
	light=RIGHT;
	head=(struct snack*)malloc(sizeof(struct snack));
	head->heng=3;
	head->shu =3;
	head->next=NULL;
	tail=head;
}
void snack_again()
{
	if(tail->heng<0 || tail->heng == h-1 ||tail->shu==0 || tail->shu==s-1)
	{
		snack_head();
		count=1;
	}
}
void *snack_refresh()
{
	usleep(200000);
	while(1)
	{
		snack_add();
		if(tail->heng==food.heng && tail->shu==food.shu)
		{
			count++;
			snack_food();
		}
		else{
			snack_del();
		}
		snack_again();
		snack_map();
		refresh();
		usleep(200000);
	}
}
void *snack_move()
{
	int key;
	while(1)
	{
		key=getch();
		switch(key)
		{
			case KEY_RIGHT:
				snack_abs(RIGHT);
				break;
			case KEY_LEFT:
				snack_abs(LEFT);
				break;
			case KEY_UP:
				snack_abs(UP);
				break;
			case KEY_DOWN:
				snack_abs(DOWN);
				break;
		}
	}
}
int main()
{
	pthread_t refresh;
	pthread_t move;
	curses_init();
	snack_head();
	snack_food();
	snack_map();
	pthread_create(&refresh,NULL,snack_refresh,NULL);
	pthread_create(&move,NULL,snack_move,NULL);
	while(1);
	getch();
	endwin();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值