读书人

请过来看一下。指点一二。关于贪吃蛇的

发布时间: 2012-02-19 19:43:38 作者: rapoo

请各位高手过来看一下。指点一二。关于贪吃蛇的代码问题2
我今天用tc写了一个贪吃蛇的代码。
没有语法上的错误,但是功能上蛇不能吃食物了。请各位高手过来看一下。指点一二。
#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 40000
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]=10;snake.y[0]=50;
snake.x[1]=15;snake.y[1]=50;
snake.x[2]=20;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%5!=0) food.x++;
if(food.y%5!=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();
}

[解决办法]
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;
}
看看坐标是不是有问题
刚才简单运行了下
食物和蛇都不会重合的,说明坐标有问题

读书人网 >C语言

热点推荐