c代码 贪吃蛇...
时间:2010-08-13 来源:gilbertld
#include<graphics.h>
#include<stdlib.h>
#include<dos.h>
#include<conio.h>
#define UP 0x4800
#define DOWN 0x5000
#define RIGHT 0x4d00
#define LEFT 0x4b00
#define ESC 0x11b
#define ENTER 0x1c0d
#define SPACE 0x3920
struct Food /*食物结构体*/
{
int x;
int y;
int yes;
}food;
struct Snake /*蛇结构体*/
{
int x[100];
int y[100];
int n;
int color;
int direction;
}snake;
int speed=0000;
void main() /*主函数*/
{
void wall();
void start();
void close();
void game();
void score();
void leavl();
void select();
void sw();
int key;
while(1)
{
start();
select();
cleardevice();
wall();
sw();
game();
cleardevice();
setcolor(RED);
outtextxy(250,220,"Please press ESC Quit");
outtextxy(250,240,"Press any-key GO ON");
key=bioskey(0);
if(key==ESC) break;
}
close();
}
void close()
{
getch();
closegraph();
}
void start() /*BGI初始化*/
{
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
}
void wall()
{ /*画墙*/
int i;
randomize();
for(i=0;i<=1000;i++)
putpixel(random(640),random(480),random(14)+1);
setcolor(random(14)+1);
rectangle(60,140,580,410);
setcolor(random(14)+1);
rectangle(62,142,578,408);
setcolor(random(14)+1);
setlinestyle(0,1,3);
rectangle(68,148,571,401);
setcolor(LIGHTBLUE);
}
void game() /*主游戏*/
{
int i,key,gamespeed;
snake.color=random(14)+1;
food.yes=1;
setcolor(GREEN);
outtextxy(400,50,"Press ESC Qiut");
outtextxy(400,70,"Press ENTER Stop");
setcolor(LIGHTBLUE);
outtextxy(100,100,"score:");
outtextxy(300,100,"leavl:");
snake.x[0]=150;
snake.y[0]=200;
snake.x[1]=140;
snake.y[1]=200;
snake.n=2;
snake.direction=2;
setcolor(WHITE);
setlinestyle(0,1,1);
setfillstyle(1,snake.color);
for(i=0;i<snake.n;i++)
bar(snake.x[i],snake.y[i],snake.x[i]+9,snake.y[i]+9); /*画蛇*/
while(1)
{
key=bioskey(0); /*设置按键*/
if(bioskey(1)) key=bioskey(0);
if(key==ENTER) bioskey(0);
if(key==ESC) break;
/*if(key==SPACE) select();*/
if(key==LEFT&&snake.direction!=2) snake.direction=1;
if(key==RIGHT&&snake.direction!=1) snake.direction=2;
if(key==UP&&snake.direction!=4) snake.direction=3;
if(key==DOWN&snake.direction!=3) snake.direction=4;
while(!kbhit())
{
delay(speed);
gamespeed=60000-(snake.n-2)*1000; /*蛇每增加一节延时减少1000毫秒*/
delay(gamespeed);
leavl();
if(gamespeed==0)
{
setcolor(snake.color);
settextstyle(0,0,5);
cleardevice();
outtextxy(140,250,"You win!!");
outtextxy(220,200,"GOOD!");
settextstyle(0,0,1);
bioskey(0);
return;
}
setfillstyle(1,BLACK);
if(food.yes==1) /*如果蛇头碰到食物,不运行下面语句*/
bar(snake.x[snake.n-1],snake.y[snake.n-1],snake.x[snake.n-1]+9,snake.y[snake.n-1]+9); /*擦除蛇尾*/
food.yes=1;
setfillstyle(1,snake.color);
for(i=snake.n;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;
}
bar(snake.x[0],snake.y[0],snake.x[0]+9,snake.y[0]+9); /*在蛇头的前面画出新的一节*/
if(food.x==snake.x[0]&&food.y==snake.y[0]) /*蛇头碰到食物*/
{
food.yes=0;
snake.n++;
sw();
}
if(snake.x[0]>=570||snake.x[0]<=65||snake.y[0]>=400||snake.y[0]<=140) /*判断蛇是否撞墙*/
return;
for(i=snake.n;i>3;i--)
if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i]) /*判断蛇是否碰到自身*/
return;
score();
}
}
}
void score() /*记分*/
{
char a[10];
setcolor(LIGHTBLUE);
setfillstyle(1,BLACK);
bar(140,100,300,110);
sprintf(a,"score:%d",(snake.n-2)*10);
outtextxy(100,100,a);
} /*等级*/
void leavl()
{
char str[10];
setcolor(LIGHTBLUE);
setfillstyle(1,BLACK);
bar(340,100,400,110);
sprintf(str,"leavl:%d",(snake.n-1)/5);
outtextxy(300,100,str);
setcolor(RED);
setfillstyle(1,BLACK);
bar(200,120,300,130);
if((snake.n-1)%5==0)
outtextxy(200,120,"LEAVL UP!"),
snake.color++;
if(snake.color>15)
snake.color=1;
}
void sw() /*画食物*/
{
int i;
randomize();
food.x=random(500)+70;
food.y=random(250)+150;
for(i=0;i<=snake.n;i++)
while(snake.x[i]==food.x||snake.y[i]==food.y) /*判断食物是否出现在蛇身上*/
food.x=random(500)+70,food.y=random(250)+150;
while((food.x%10)!=0)
food.x--;
while((food.y%10)!=0)
food.y--;
setfillstyle(1,YELLOW);
bar(food.x,food.y,food.x+9,food.y+9);
}
void select()
{
int key;
static int x=129,y=148;
setcolor(LIGHTGREEN);
outtextxy(140,300,"Press ENTER Select");
setcolor(GREEN);
rectangle(x,y,x+30,y+30);
settextstyle(0,0,4);
setcolor(RED);
outtextxy(190,50,"Speed");
outtextxy(130,150,"5 4 3 2 1");
settextstyle(0,0,1);
while(1)
{
key=bioskey(0);
if(key==ENTER) break;
if(key==RIGHT&&x<=350)
{
speed+=10000;
setcolor(0);
rectangle(x,y,x+30,y+30);
setcolor(GREEN);
x+=64;
rectangle(x,y,x+30,y+30);
}
if(key==LEFT&&x>=160)
{
speed-=10000;
setcolor(0);
rectangle(x,y,x+30,y+30);
setcolor(GREEN);
x-=64;
rectangle(x,y,x+30,y+30);
}
}
}