这个代码错哪里了?怎么改?
我是新萌,

#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 40
#define HEIGH 12
enum direction //方向枚举类型
{
LEFT,RIGHT,UP,DOWN
};
struct structFood//食物结构体
{
int x;
int y;
};
struct structNode//蛇身的结构
{
int x;
int y;
struct structNode*pNext;
};
struct structSnake//蛇属性解构体
{
int lenth;//长度
enum direction dir;//方向
};
struct structFood*pFood;
struct structSnake*pSnake;
struct structpNode*pNode,*pTail;
int speech=200;//速度
int score=0;//分数
int smark=0;//吃食物标记
int stop=0;
void hideCursor(void);//隐藏光标
void gotoXY(int x,int y);//定位光标
void inittSnake(void);//构造蛇
void addNode(int x,int y);//增加蛇身
void initFood(void);//产生食物
void homePage(void);//主界面
void keybordHit(void);//监控键盘按钮
void move(void);//蛇移动
void draw(void);//画蛇
void eatFood(void);//吃到食物
void addTail(void);//增加蛇尾
int main(void)
{
homePage();
while(!stop)
{
keybordHit();//监控键盘按钮
move();//蛇移动
draw();//画蛇
Sleep(speech);//暂时挂起线程
}
return 0;
}
void hideCursor(void)//隐藏光标
{
CONSOLE_CURSOR_INFO cursorInfo={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo);
}
void gotoXY(int x,int y)//定位光标
{
COORD pos;
pos.X=x-1;
pos.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void addNode(int x,int y)//增加蛇身
{
struct structNode*newnode=
(struct structNode*)malloc(sizeof(struct structNode));
struct structNode*p=pNode;
newnode->pNext=pNode;
newnode->x=x;
newnode->y=y;
pNode=newnode;
if(x<2 || x>=WIDTH || y<2 || y>=HEIGH)//碰到边界,失败
{
stop=1;
gotoXY(10,19);
printf("撞墙,游戏结束,按任意键退出!\n");
getch();
free(pNode);
free(pSnake);
exit(0);
}
while(p!=NULL)
{
if(p->pNext!=NULL)
if((p->x==x)&&(p->y==y))
{
stop=1;
gotoXY(10,19);
printf("撞到自身,游戏结束,按任意键退出!\n");
getch();
free(pNode);
free(pSnake);
exit(0);
}
p=p->pNext;
}
}
void initSnake(void)//构造蛇
{
int i;
pSnake=(struct structSnake*)malloc(sizeof(struct structSnake));
pFood=(struct structFood*)malloc(sizeof(struct structFood));
pSnake->lenth=5;
pSnake->dir=RIGHT;
for(i=2;i<=pSnake->lenth+2;i++)
addNode(i,2);
}
void homePage(void)//主界面
{
hideCursor();
printf("------------------------------------------\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("------------------------------------------\n");
gotoXY(5,13);
printf("按任意键开始游戏!按W.A.S.D控制方向");
getch();
initSnake();
initFood();
gotoXY(5,13);
printf(" ");
}
void keybordHit(void)
{
char ch;
if(kbhit())
{
ch=getch();
switch(ch)
{
case 'W':
case 'w':
//如果蛇本身方向向下,则按相反方向无效
if(pSnake->dir==DOWN)
break;
else
pSnake->dir=UP;
break;
case 'A':
case 'a'://如果蛇身方向本身向右,则按相反方向无效
if(pSnake->dir==RIGHT)
break;
else
pSnake->dir=LEFT;
break;
case 'S':
case 's'://如果蛇身本来方向是向上,则按相反方向无效
if(pSnake->dir==UP)
break;
else
pSnake->dir=DOWN;
break;
case 'D':
case 'd':
//如果蛇身本来向左,则按相反方向无效
if(pSnake->dir==LEFT)
break;
else
pSnake->dir=RIGHT;
break;
case 'O':
case 'o':
if(speech>=150)//减速
speech=speech-50;
break;
case 'P':
case 'p':
if(speech<=400)//加速
speech=speech+50;
break;
case ' ':
gotoXY(15,18);
printf("游戏已暂停,按任意键恢复游戏");
system("pause>nul");
gotoXY(15,18);
printf(" ");
break;
default:break;
}
}
}
void initFood(void)//产生食物
{
struct structNode*p=pNode;
int mark=1;
srand((unsigned)time(NULL));//以时间为种子产生随机数
while(1)
{
pFood->x=rand()%(WIDTH-2)+2;//食物X坐标
pFood->y=rand()%d(HEIGH-2)+2;//食物Y坐标
while(p!=NULL)
{
//如果食物产生在蛇身上,则重新生成食物
if((pFood->x==p->x)&&(pFood->y==p->y))
{
mark=0;
break;
}
p=p->pNext;
}
if(mark==1)
{
gotoXY(pFood->x,pFood->y);
printf("%c",3);
break;
}
mark=1;
p=pNode;
}
}
void move(void)//蛇移动
{
struct structNode*q,*p=pNode;
if(pSnake->dir==RIGHT)
{
addNode(p->x+1,p->y);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==LEFT)
{
addNode(p->x-1,p->y);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==UP)
{
addNode(p->x,p->y-1);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==DOWN)
{
addNode(p->x,p->y+1);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
}
void draw(void)//画蛇
{
struct structNode*p=pNode;
while(p!=NULL)
{
gotoXY(p->x,p->y);
printf("%c",2);
pTail=p;
p=p->pNext;
}
if(pNode->x==pFood->x&&pNode->y==pFood->y)
{
smark=1;
eatFood();
initFood(); }
if(smark==0)
{
gotoXY(pTail->x,pTail->y);
printf("%c",' ');
}
else
{
gotoXY(pTail->x,pTail->y);
printf("%c",' ');
smark=0;
}
gotoXY(50,12);
printf("食物:%d,%d",pFood->x,pFood->y);
gotoXY(50,5);
printf("分数:%d",score);
gotoXY(50,7);
printf("速度:%d",speech);
gotoXY(15,14);
printf("按O键加速");
gotoXY(15,15);
printf("按P键减速");
gotoXY(15,16);
printf("按空格键暂停");
}
void eatFood(void)//吃到食物
{
addTail();
score++;
}
void addTail(void)//增加蛇尾
{
struct structNode*newnode
=(struct structNode*)malloc(sizeof(struct structNode));
struct structNode*p=pNode;
pTail->pNext=newnode;
newnode->x=50;
newnode->y=20;
newnode->pNext=NULL;
pTail=newnode;
}
#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 40
#define HEIGH 12
enum direction //方向枚举类型
{
LEFT,RIGHT,UP,DOWN
};
struct structFood//食物结构体
{
int x;
int y;
};
struct structNode//蛇身的结构
{
int x;
int y;
struct structNode*pNext;
};
struct structSnake//蛇属性解构体
{
int lenth;//长度
enum direction dir;//方向
};
struct structFood*pFood;
struct structSnake*pSnake;
struct structNode*pNode,*pTail; // 修改,没有 structpNode
int speech=200;//速度
int score=0;//分数
int smark=0;//吃食物标记
int stop=0;
void hideCursor(void);//隐藏光标
void gotoXY(int x,int y);//定位光标
void inittSnake(void);//构造蛇
void addNode(int x,int y);//增加蛇身
void initFood(void);//产生食物
void homePage(void);//主界面
void keybordHit(void);//监控键盘按钮
void move(void);//蛇移动
void draw(void);//画蛇
void eatFood(void);//吃到食物
void addTail(void);//增加蛇尾
int main(void)
{
homePage();
while(!stop)
{
keybordHit();//监控键盘按钮
move();//蛇移动
draw();//画蛇
Sleep(speech);//暂时挂起线程
}
return 0;
}
void hideCursor(void)//隐藏光标
{
CONSOLE_CURSOR_INFO cursorInfo={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo);
}
void gotoXY(int x,int y)//定位光标
{
COORD pos;
pos.X=x-1;
pos.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void addNode(int x,int y)//增加蛇身
{
struct structNode*newnode=
(struct structNode*)malloc(sizeof(struct structNode));
struct structNode*p=pNode;
newnode->pNext=pNode;
newnode->x=x;
newnode->y=y;
pNode=newnode;
if(x<2 || x>=WIDTH || y<2 || y>=HEIGH)//碰到边界,失败
{
stop=1;
gotoXY(10,19);
printf("撞墙,游戏结束,按任意键退出!\n");
getch();
free(pNode);
free(pSnake);
exit(0);
}
while(p!=NULL)
{
if(p->pNext!=NULL)
if((p->x==x)&&(p->y==y))
{
stop=1;
gotoXY(10,19);
printf("撞到自身,游戏结束,按任意键退出!\n");
getch();
free(pNode);
free(pSnake);
exit(0);
}
p=p->pNext; // 修改,往前缩进一个tab键
}
}
void initSnake(void)//构造蛇
{
int i;
pSnake=(struct structSnake*)malloc(sizeof(struct structSnake));
pFood=(struct structFood*)malloc(sizeof(struct structFood));
pSnake->lenth=5;
pSnake->dir=RIGHT;
for(i=2;i<=pSnake->lenth+2;i++)
addNode(i,2);
}
void homePage(void)//主界面
{
hideCursor();
printf("------------------------------------------\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("------------------------------------------\n");
gotoXY(5,13);
printf("按任意键开始游戏!按W.A.S.D控制方向");
getch();
initSnake();
initFood();
gotoXY(5,13);
printf(" ");
}
void keybordHit(void)
{
char ch;
if(kbhit())
{
ch=getch();
switch(ch)
{
case 'W':
case 'w':
//如果蛇本身方向向下,则按相反方向无效
if(pSnake->dir==DOWN)
break;
else
pSnake->dir=UP;
break;
case 'A':
case 'a'://如果蛇身方向本身向右,则按相反方向无效
if(pSnake->dir==RIGHT)
break;
else
pSnake->dir=LEFT;
break;
case 'S':
case 's'://如果蛇身本来方向是向上,则按相反方向无效
if(pSnake->dir==UP)
break;
else
pSnake->dir=DOWN;
break;
case 'D':
case 'd':
//如果蛇身本来向左,则按相反方向无效
if(pSnake->dir==LEFT)
break;
else
pSnake->dir=RIGHT;
break;
case 'O':
case 'o':
if(speech>=150)//减速
speech=speech-50;
break;
case 'P':
case 'p':
if(speech<=400)//加速
speech=speech+50;
break;
case ' ':
gotoXY(15,18);
printf("游戏已暂停,按任意键恢复游戏");
system("pause>nul");
gotoXY(15,18);
printf(" ");
break;
default:break;
}
}
}
void initFood(void)//产生食物
{
struct structNode*p=pNode;
int mark=1;
srand((unsigned)time(NULL));//以时间为种子产生随机数
while(1)
{
pFood->x=rand()%(WIDTH-2)+2;//食物X坐标
pFood->y=rand()%(HEIGH-2)+2;//食物Y坐标 修改 ,多写了一个d
while(p!=NULL)
{
//如果食物产生在蛇身上,则重新生成食物
if((pFood->x==p->x)&&(pFood->y==p->y))
{
mark=0;
break;
}
p=p->pNext;
}
if(mark==1)
{
gotoXY(pFood->x,pFood->y);
printf("%c",3);
break;
}
mark=1;
p=pNode;
}
}
void move(void)//蛇移动
{
struct structNode*q,*p=pNode;
if(pSnake->dir==RIGHT)
{
addNode(p->x+1,p->y);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==LEFT)
{
addNode(p->x-1,p->y);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==UP)
{
addNode(p->x,p->y-1);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==DOWN)
{
addNode(p->x,p->y+1);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
}
void draw(void)//画蛇
{
struct structNode*p=pNode;
while(p!=NULL)
{
gotoXY(p->x,p->y);
printf("%c",2);
pTail=p;
p=p->pNext;
}
if(pNode->x==pFood->x&&pNode->y==pFood->y)
{
smark=1;
eatFood();
initFood(); }
if(smark==0)
{
gotoXY(pTail->x,pTail->y);
printf("%c",' ');
}
else
{
gotoXY(pTail->x,pTail->y);
printf("%c",' ');
smark=0;
}
gotoXY(50,12);
printf("食物:%d,%d",pFood->x,pFood->y);
gotoXY(50,5);
printf("分数:%d",score);
gotoXY(50,7);
printf("速度:%d",speech);
gotoXY(15,14);
printf("按O键加速");
gotoXY(15,15);
printf("按P键减速");
gotoXY(15,16);
printf("按空格键暂停");
}
void eatFood(void)//吃到食物
{
addTail();
score++;
}
void addTail(void)//增加蛇尾
{
struct structNode*newnode
=(struct structNode*)malloc(sizeof(struct structNode));
struct structNode*p=pNode;
pTail->pNext=newnode;
newnode->x=50;
newnode->y=20;
newnode->pNext=NULL;
pTail=newnode;
}
额,有一个地方拼写错误
还有就是将getch()函数更换为_getch()函数,