本人是小白,自己对着视频编了一个贪吃蛇能编译但是运行出错,求大神帮忙修改一下代码

打工的社畜 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);
}






...全文
155 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-31
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。 http://www.easyx.cn
gldcpp 2016-03-30
  • 打赏
  • 举报
回复
在哪里出问题 找到相应的代码 打断点看

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧