首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于贪吃蛇的代码有关问题

2012-02-15 
关于贪吃蛇的代码问题我开始是用tc写了一个能自己移动的程序。下面是用c语言写的代码:/* Note:Your choice

关于贪吃蛇的代码问题
我开始是用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();
}

可是编译的时候老是有一个错误。
请高手指点一二。
谢谢了。

[解决办法]
我不知道怎么运行,但我分别编译时,你的好像少了个{。
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(); 

热点排行