贪食蛇(贪吃蛇)源代码(C语言)

http://hi.baidu.com/amaoyuanfen/blog/item/012adcb3f9becba0d8335a7a.html

#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ESC 0x11b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00

#define Max 200 /*定义最大长度*/
#define R 10
struct snake
{
int x[Max],y[Max]; /*蛇的横纵坐标*/
int num;/*当前蛇的长度*/
int dire;/*当前运动方向(上【1】下【-1】左【2】右【-2】*/
int score;
}mao;

struct Food
{
int x,y;
}xdy;


int dx,dy,xmax,ymax;
int key,i,j,jud,flag,eflag;
void *w,*f,*head;

void init();
void play();
void over();
void main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
xmax=getmaxx();
ymax=getmaxy();
srand(time(NULL));
circle(R,R,R);
w=malloc(imagesize(0,0,2*R,2*R));
f=malloc(imagesize(0,0,2*R,2*R));
head=malloc(imagesize(0,0,2*R,2*R));
getimage(0,0,2*R,2*R,w);
setcolor(RED);
circle(R,R,R);
getimage(0,0,2*R,2*R,f);
setcolor(GREEN);
circle(R,R,R);
getimage(0,0,2*R,2*R,head);
init();
play();
over();
getch();
closegraph();
}

void init()
{
cleardevice();
mao.num=2; /*蛇的长度为2*/
mao.dire=-2; /*方向为向右*/
mao.score=0; /*初始分数为0*/
mao.x[1]=3*R;
mao.y[1]=R;
mao.x[2]=R;
mao.y[2]=R;
dx=2*R;
dy=0;
eflag=0;
xdy.x=(rand()%8)*R*2+R;
xdy.y=(rand()%5)*R*2+R; /*产生食物的位置*/
}


void play()
{
while(!0)
{
while(!kbhit())
{
if((mao.x[1]==xdy.x)&&(mao.y[1]==xdy.y))
{

mao.num++;
mao.score+=10;
for(i=mao.num;i>1;i--)
{
mao.x[i]=mao.x[i-1];
mao.y[i]=mao.y[i-1];
}
mao.x[1]=xdy.x+dx;
mao.y[1]=xdy.y+dy;
flag=0;
while(flag==0)
{
xdy.x=(rand()%30+1)*R*2+R;
xdy.y=(rand()%22+1)*R*2+R; /*产生食物的位置*/
for(i=1;i<=mao.num;i++)
if((xdy.x==mao.x[i])&&(xdy.y==mao.y[i]))break;
if(xdy.x>xmax-R||xdy.y>ymax-R)flag=0;
if(i>mao.num)flag=1;
}
}


putimage(mao.x[1]-R,mao.y[1]-R,head,0);
for(i=2;i<=mao.num;i++)
putimage(mao.x[i]-R,mao.y[i]-R,w,0);
putimage(xdy.x-R,xdy.y-R,f,0);
for(i=mao.num;i>1;i--)
{
mao.x[i]=mao.x[i-1];
mao.y[i]=mao.y[i-1];
}
mao.x[1]+=dx;
mao.y[1]+=dy;
if(mao.num>4)
for(i=4;i<=mao.num;i++)
if(mao.x[1]==mao.x[i]&&mao.y[1]==mao.y[i])
{
eflag=1;
break;
}
if(eflag==1)break;
if(mao.x[1]<0||mao.x[1]>xmax-R||mao.y[1]<0||mao.y[1]>ymax-R)
{
eflag=1;
break;
}
delay(200000000);
delay(200000000);
cleardevice();

}
if(eflag==1)break;
key=bioskey(0);
switch(key)
{
case(UP):
{
jud=1;
if((jud+mao.dire)!=0)
{
mao.dire=1;
dx=0;
dy=-2*R;
}
}break;
case(DOWN):
{
jud=-1;
if((jud+mao.dire)!=0)
{
mao.dire=-1;
dx=0;
dy=2*R;
}
} break;
case(RIGHT):
{
jud=-2;
if((jud+mao.dire)!=0)
{
mao.dire=-2;
dx=2*R;
dy=0;
}
} break;
case(LEFT):
{
jud=2;
if((jud+mao.dire)!=0)
{
mao.dire=2;
dx=-2*R;
dy=0;
}
}break;
case(ESC):;
}
if(key==ESC)break;


}
}


void over()
{
char s1[20],s[5];
cleardevice();
settextstyle(0,0,6);
setcolor(4);
sprintf(s,"%d",mao.score);
strcpy(s1,"score");
strcat(s1,s);
outtextxy(100,100,"GAME OVER!");
settextstyle(0,0,2);
outtextxy(50,50,s1);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值