c语言贪吃蛇问题
我在linux环境用c写的贪吃蛇,借助了ncurses,编译后可以运行,但有以下问题问题一:无法显示食物
问题二:蛇长度错误
???????
程序代码:#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<ncurses.h>
struct snake
{
int y;
int x;
struct snake* next;
};
struct food
{
int y;
int x;
};
void main()
{
int space[22][42]={0};
initscr();
srand(time(NULL));
WINDOW* win=newwin(22,42,3,6);
int dir=3; //1左, 2上, 3右, 4下
struct snake* snake_head=malloc(sizeof(struct snake));
struct snake* new_head=malloc(sizeof(struct snake));
struct food* food=malloc(sizeof(struct food));
snake_head->y=5;snake_head->x=5; //(5,5)
new_head->y=5;new_head->x=6; //(5,6)
new_head->next=snake_head;snake_head->next=NULL;
snake_head=new_head;//头指向(5,6)
food->y=10;food->x=10; //food初始位置(10,10)
halfdelay(3);
curs_set(0); //不显示 光标
keypad(win,TRUE);
noecho();
int j,i,c;
for(i=0,j=21,c=0;c<42;c++)
space[i][c]=space[j][c]=3; //3:border
for(i=0,j=41,c=1;c<22;c++)
space[c][i]=space[c][j]=3;
while(1)
{
////////input///////////////
setbuf(stdin,NULL);
int ch=wgetch(win);
if(ch==KEY_LEFT)
dir=1;
else if(ch==KEY_UP)
dir=2;
else if(ch==KEY_RIGHT)
dir=3;
else if(ch==KEY_DOWN)
dir=4;
////////process//////////////
new_head=malloc(sizeof(struct snake));
if(dir==1)
{
new_head->y=snake_head->y;
new_head->x=snake_head->x-1;
}
else if(dir==2)
{
new_head->y=snake_head->y-1;
new_head->x=snake_head->x;
}
else if(dir==3)
{
new_head->y=snake_head->y;
new_head->x=snake_head->x+1;
}
else if(dir==4)
{
new_head->y=snake_head->y+1;
new_head->x=snake_head->x;
}
new_head->next=snake_head;
snake_head=new_head;
if((snake_head->y!=food->y)||(snake_head->x!=food->x)) //没吃到食物,保持原来长度
{
while(1)
{
new_head=new_head->next;
if(new_head->next==NULL)
{
new_head=NULL;
break;
}
}
}
else if((snake_head->y==food->y)&&(snake_head->x==food->x)) //如果吃到食物,就生成新的食物位置
{
int fod=rand()%800;
food->y=fod/20+1;
food->x=fod%20+1;
}
///////////output///////////
wmove(win,food->y,food->x);
wprintw(win,"!"); //print the food
for(int i=0;i<22;i++)
for(int j=0;j<42;j++)
if(space[i][j]==3)
{
wmove(win,i,j);
wprintw(win,"#"); // print the border
}
new_head=snake_head;
while(1)
{
wmove(win,new_head->y,new_head->x);
wprintw(win,"*"); //printf the snake
new_head=new_head->next;
if(new_head==NULL)
break;
}
if((snake_head->y==0)||(snake_head->y==22))
break;
if((snake_head->x==0)||(snake_head->x==42))
break;
new_head=snake_head->next;
int death=1;
while(1)
{
if((new_head->y==snake_head->y)&&(new_head->x==snake_head->x))
{death=0;break;}
new_head=new_head->next;
if(new_head==NULL)
break;
}
if(death==0)
break;
}
int ch=wgetch(win);
endwin();
}





