本人是小白,自己对着视频编了一个贪吃蛇能编译但是运行出错,求大神帮忙修改一下代码
打工的社畜 2016-03-30 10:18:34 #include<stdio.h>
#include<conio.h>
#include<time.h>
#include <graphics.h>
#define M 200
#define WD 10
#define RX 600
#define RY 400
#define LX 0
#define LY 0
#define UP 0X1177
#define DOWN 0X1F73
#define LEFT 0X1E61
#define RIGHT 0X2064
#define ESC 0x011b
struct Food
{
int x[200];
int y[200];
int yes;
}food;
struct snake
{
int x[M];
int y[M];
int node;
int direction;
int life;//0活1死
}snake;
void DrawGrid(void)//画界面
{
setcolor(DARKGRAY); //灰色
setlinestyle(PS_SOLID, 1);//设置线型
for(int i=0;i<=RY;i+=WD)
line(LX,i,RX,i);
for(i=0;i<=RX;i+=WD)
line(i,LY,i,RY);
}
int XY(int *x,int *y)//随机生成食物坐标
{
*x=rand()%(RX-LX)/WD*WD;
*y=rand()%(RY-LY)/WD*WD;
return 0;
}
void SnakeDraw(struct snake *p)
{
setcolor(RED); //画出蛇
for(int i=0; i<p->node; i++)
rectangle(p->x[i], p->y[i],
p->x[i]+WD, p->y[i]+WD); //每1节画1个方框
}
void snakemove(struct snake *p)//蛇的移动
{
for(int i=0; i<p->node-1; i++)//蛇的每个环节往前移动
{
p->x[i]=p->x[i-1];
p->y[i]=p->y[i-1];
}
switch(p->direction)//蛇头移动,0,1,2,3表示上下左右
{
case 2: p->y[0]-=WD; break;
case 4: p->y[0]+=WD; break;
case 6: p->x[0]-=WD; break;
case 8: p->x[0]+=WD; break;
}
}
void snakeinit(struct snake *p){//蛇的初始化
p->life=0;
p->direction=(int)((rand()%3)+1)*2;//2,4,6,8
p->node=2;
XY(p->x,p->y);
p->x[1]=p->x[0]+WD;
p->y[1]=p->y[0];
}
void snakecheck(struct snake *p){
for(int i=0;i<=p->node;i++){
if(p->x[0]==p->x[i]&&p->y[0]==p->y[i])
p->life=1;//蛇死
if(p->x[0]<LX||p->x[0]>RX||p->y[0]<LY||p->y[0]>RY)
p->life=1;
}
}
void foodcheck(struct snake *p){
int x=0,*m=&x;
int y=0,*n=&y;
int XY(int *m,int *n);
if(p->x[0]==x&&p->y[0]==y){
setcolor(0);//蛇吃到食物就要把食物去掉
rectangle(x,y,x+WD,y+WD);
p->x[p->node]=-10;
p->y[p->node]=-10;
p->node++;
}
}
int dircheck(int key,int dir){
if(key==UP==1 && dir!=2)
dir=2;
else if(key==DOWN==1 && dir!=8)
dir=8;
else if(key==LEFT==1 && dir!=4)
dir=4;
else if(key==RIGHT==1 && dir!=6)
dir=6;
return dir;
}
int Readkey()
{
if (_kbhit() == 0 ) //没有按键
return 0;
int ch=getch(); //读键盘扫描码
if(ch==0xE0) //表明按了扩展键(光标键是扩展键)
ch=getch (); //扩展键需要再读一次,得到扫描码
return (ch);
}
void gameplay(void){
int x=0,*m=&x;
int y=0,*n=&y;
food.yes=1;
struct snake k;
while (1){
while(!kbhit())
{
if(food.yes==1){
int XY(int *m,int *n);
setcolor(RED);
rectangle(x,y,x+WD,y+WD);
food.yes=0;
}
snakemove(&k);
snakecheck(&k);
foodcheck(&k);
if(k.life==1)
break;
SnakeDraw(&k);
}
int key=Readkey();
if(key==ESC)
break;
}
}
void main(){
struct snake p;
gameplay();
DrawGrid();
snakeinit(&p);
SnakeDraw(&p);
snakemove(&p);
snakecheck(&p);
foodcheck(&p);
Readkey();
dircheck(Readkey(),p.direction);
}