关于贪吃蛇的代码问题

hznydx 2007-10-07 07:09:23
我开始是用tc写了一个能自己移动的程序。下面是用c语言写的代码:
/* Note:Your choice is C IDE */
#include<stdio.h>
#include<bios.h>
#include<graphics.h>
#define LEFT 19200
#define UP 18432
#define RIGHT 19712
#define DOWN 20480
#define ESC 283
#define N 150
#define gamespeed 50000
struct Snake
{ int x[N],y[N];
int life;
int length;
int direction;
}snake;
void Init(void);
void Draw(void);
void GamePlay(void);
void GameOver(void);
void Close(void);
void main()
{ Init();
Draw();
GamePlay();
Close();
}
void Init(void)
{ int gd=DETECT;int mode=0;
initgraph(&gd,&mode,"d:\\tc");

}
void Draw(void)
{
setcolor(4);
rectangle(0,0,getmaxx(),getmaxy());
}
void GamePlay(void)
{ int i,key;
snake.length=3;
snake.direction=1;/*方向向右*/
snake.life=0;
snake.x[0]=50;snake.y[0]=50;
snake.x[1]=55;snake.y[1]=50;
snake.x[2]=60;snake.y[2]=50;
while(1)
{ while(!kbhit())/*在没有按键的情况下蛇身自己移动*/

/*蛇身自己向前移的核心算法*/
{ for(i=snake.length-1;i>0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{ case 1: snake.x[0]+=10;break; /*向右*/
case 2: snake.x[0]-=10;break; /* 向左*/
case 3: snake.y[0]-=10;break; /*向上*/
case 4: snake.y[0]+=10;break; /*向下*/
}
if(snake.x[0]<10||snake.x[0]>getmaxx()||snake.y[0]<10||snake.y[0]>getmaxy())
{ GameOver();
snake.life=1;
}
if(snake.life==1) break;
/*画蛇的代码*/
setcolor(4);
for(i=0;i<snake.length;i++)
circle(snake.x[i],snake.y[i],5);
delay(gamespeed);
setcolor(0);
circle(snake.x[snake.length-1],snake.y[snake.length-1],5);
}/*end while(!kbhit)*/
if(snake.life==1) break;
key=bioskey(0);
if(key==ESC) break;
if(key==UP&&snake.direction!=4)
snake.direction=3;
if(key==DOWN&& snake.direction!=3)
snake.direction=4;
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
if(key==RIGHT&& snake.direction!=2)
snake.direction=1;
} /*end while(1)*/

}
void GameOver(void)
{ cleardevice();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GameOver");
/* getch();*/
}
void Close(void)
{ getchar();
closegraph();
}
运行没有错误,
于是我再加上了一个产生食物的代码:

/* Note:Your choice is C IDE */
#include "stdio.h"
#include<bios.h>
#include<graphics.h>
#include<stdlib.h>

#include<stdlib.h>
#define LEFT 19200
#define UP 18432
#define RIGHT 19712
#define DOWN 20480
#define ESC 283
#define N 150
#define gamespeed 50000
struct Snake
{ int x[N],y[N];
int life;
int length;
int direction;
}snake;
struct Food
{int x,y;
int yes;
}food;
void Init(void);
void Draw(void);
void GamePlay(void);
void GameOver(void);
void Close(void);
void main()
{ Init();
Draw();
GamePlay();
Close();
}
void Init(void)
{ int gd=DETECT;int mode=0;
initgraph(&gd,&mode,"d:\\tc");

}
void Draw(void)
{
setcolor(4);
rectangle(0,0,getmaxx(),getmaxy());
}
void GamePlay(void)
{ int i,key;
randomize();
snake.length=3;
snake.direction=1;/*方向向右*/
snake.life=0;
food.yes=1; /*要产生食物*/
snake.x[0]=50;snake.y[0]=50;
snake.x[1]=55;snake.y[1]=50;
snake.x[2]=60;snake.y[2]=50;
while(1)
{ while(!kbhit())/*在没有按键的情况下蛇身自己移动*/
if(food.yes==1)
{ food.x=rand()%500+40;
food.y=rand()%450+40;
if(food.x%10!=0) food.x++;
if(food.y%10!=0) food.y++;
food.yes=0;
}
if(food.yes==0)
{setcolor(8);
circle(food.x,food.y,5);
}
/*蛇身自己向前移的核心算法*/
for(i=snake.length-1;i>0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{ case 1: snake.x[0]+=10;break; /*向右*/
case 2: snake.x[0]-=10;break; /* 向左*/
case 3: snake.y[0]-=10;break; /*向上*/
case 4: snake.y[0]+=10;break; /*向下*/
}
for(i=3;i<snake.length;i)
{ if(snake.x[0]+10==snake.x[i]&&snake.y[0]+10==snake.y[i])
{ GameOver();
snake.life=1;
break;
}
}
if(snake.x[0]<10||snake.x[0]>getmaxx()||snake.y[0]<10||snake.y[0]>getmaxy())
{ GameOver();
snake.life=1;
}
if(snake.life==1) break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{ setcolor(0);
circle(food.x,food.y,5);
snake.x[snake.length]=-20;
snake.y[snake.length]=-20;
snake.length++;
food.yes=1;
}
/*画蛇的代码*/
setcolor(4);
for(i=0;i<snake.length;i++)
circle(snake.x[i],snake.y[i],5);
delay(gamespeed);
setcolor(0);
circle(snake.x[snake.length-1],snake.y[snake.length-1],5);
}/*end while(!kbhit())*/

key=bioskey(0);
if(key==ESC) exit(0);
if(key==UP&&snake.direction!=4)
snake.direction=3;
if(key==DOWN&& snake.direction!=3)
snake.direction=4;
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
} /*end while(1)*/
} /*end void gameplay*/
void GameOver(void)
{ cleardevice();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GameOver");
getch();
}
void Close(void)
{ getchar();
closegraph();
}

可是编译的时候老是有一个错误。
请高手指点一二。
谢谢了。
...全文
188 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
clf0420 2007-10-12
  • 打赏
  • 举报
回复
为什么我编译的时候老是提示:错误 noname.c 61: 表达式语法错在 GamePlay 函数中
光标停在: if(snake.x[0] <10 | |snake.x[0] >getmaxx() | |snake.y[0] <10 | |snake.y[0] >getmaxy())
Anne_Mike 2007-10-12
  • 打赏
  • 举报
回复
请问下,两个主函数怎么一起运行呢?如果一个主函数要调用另一个模块怎么编译,连接,运行,楼主指点下!!!
hznydx 2007-10-12
  • 打赏
  • 举报
回复
多谢你的回贴。我的问题以经解决了。是的确的掉了一个{
Anne_Mike 2007-10-11
  • 打赏
  • 举报
回复
我不知道怎么运行,但我分别编译时,你的好像少了个{。
food.yes=1; /*要产生食物*/
snake.x[0]=50;snake.y[0]=50;
snake.x[1]=55;snake.y[1]=50;
snake.x[2]=60;snake.y[2]=50;
while(1)
{ while(!kbhit())/*在没有按键的情况下蛇身自己移动*/
**{** if(food.yes==1)
{ food.x=rand()%500+40;
food.y=rand()%450+40;
if(food.x%10!=0) food.x++;
if(food.y%10!=0) food.y++;
food.yes=0;
}
if(food.yes==0)
{setcolor(8);
circle(food.x,food.y,5);
}
/*蛇身自己向前移的核心算法*/
for(i=snake.length-1;i >0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{ case 1: snake.x[0]+=10;break; /*向右*/
case 2: snake.x[0]-=10;break; /* 向左*/
case 3: snake.y[0]-=10;break; /*向上*/
case 4: snake.y[0]+=10;break; /*向下*/
}
for(i=3;i <snake.length;i)
{ if(snake.x[0]+10==snake.x[i]&&snake.y[0]+10==snake.y[i])
{ GameOver();
snake.life=1;
break;
}
}
if(snake.x[0] <10 ¦ ¦snake.x[0] >getmaxx() ¦ ¦snake.y[0] <10 ¦ ¦snake.y[0] >getmaxy())
{ GameOver();
snake.life=1;
}
if(snake.life==1) break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{ setcolor(0);
circle(food.x,food.y,5);
snake.x[snake.length]=-20;
snake.y[snake.length]=-20;
snake.length++;
food.yes=1;
}
/*画蛇的代码*/
setcolor(4);
for(i=0;i <snake.length;i++)
circle(snake.x[i],snake.y[i],5);
delay(gamespeed);
setcolor(0);
circle(snake.x[snake.length-1],snake.y[snake.length-1],5);
}/*end while(!kbhit())*/

key=bioskey(0);
if(key==ESC) exit(0);
if(key==UP&&snake.direction!=4)
snake.direction=3;
if(key==DOWN&& snake.direction!=3)
snake.direction=4;
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
} /*end while(1)*/
} /*end void gameplay*/
void GameOver(void)
{ cleardevice();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GameOver");
getch();
}
void Close(void)
{ getchar();
closegraph();
}

69,371

社区成员

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

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