#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;
}
贪吃蛇c版
最新推荐文章于 2024-04-23 21:04:38 发布