当前位置: 编程技术>c/c++/嵌入式
基于C语言实现的贪吃蛇游戏完整实例代码
来源: 互联网 发布时间:2014-10-26
本文导语: 本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助。 贪吃蛇完整实现代码如下: #include #include #include #include #define NULL 0 #define...
本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助。
贪吃蛇完整实现代码如下:
#include
#include
#include
#include
#define NULL 0
#define UP 18432
#define DOWN 20480
#define LEFT 19200
#define RIGHT 19712
#define ESC 283
#define ENTER 7181
struct snake
{int centerx;
int centery;
int newx;
int newy;
struct snake *next;
};
struct snake *head;
int grade=60; /*控制速度的*******/
int a,b; /* 背静遮的 位置*/
void *far1,*far2,*far3,*far4; /* 蛇身指针 背静遮的指针 虫子*/
int size1,size2,size3,size4; /* **全局变量**/
int ch=RIGHT; /**************存按键 开始蛇的方向为RIGHT***********/
int chy=RIGHT;
int flag=0; /*********判断是否退出游戏**************/
int control=4; /***********判断上次方向和下次方向不冲突***/
int nextshow=1; /*******控制下次蛇身是否显示***************/
int scenterx; /***************随即矩形中心坐标***************/
int scentery;
int sx; /*******在a b 未改变前 得到他们的值 保证随机矩形也不在此出现*******/
int sy;
/************************蛇身初始化**************************/
void snakede()
{
struct snake *p1,*p2;
head=p1=p2=(struct snake *)malloc(sizeof(struct snake));
p1->centerx=80;
p1->newx=80;
p1->centery=58;
p1->newy=58;
p1=(struct snake *)malloc(sizeof(struct snake));
p2->next=p1;
p1->centerx=58;
p1->newx=58;
p1->centery=58;
p1->newy=58;
p1->next=NULL;
}
/*******************end*******************/
void welcome() /*************游戏开始界面 ,可以选择 速度**********/
{
int key;
int size;
int x=240;
int y=300;
int f;
void *buf;
setfillstyle(SOLID_FILL,BLUE);
bar(98,100,112,125);
setfillstyle(SOLID_FILL,RED);
bar(98,112,112,114);
setfillstyle(SOLID_FILL,GREEN);
bar(100,100,110,125);
size=imagesize(98,100,112,125);
buf=malloc(size);
getimage(98,100,112,125,buf);
cleardevice();
setfillstyle(SOLID_FILL,BLUE);
bar(240,300,390,325);
outtextxy(193,310,"speed:");
setfillstyle(SOLID_FILL,RED);
bar(240,312,390,314);
setcolor(YELLOW);
outtextxy(240,330,"DOWN");
outtextxy(390,330,"UP");
outtextxy(240,360,"ENTER to start..." );
outtextxy(270,200,"SNAKE");
fei(220,220);
feiyang(280,220);
yang(340,220);
putimage(x,y,buf,COPY_PUT);
setcolor(RED);
rectangle(170,190,410,410);
while(1)
{ if(bioskey(1)) /********8选择速度部分************/
key=bioskey(0);
switch(key)
{
case ENTER:
f=1;
break;
case DOWN:
if(x>=240)
{ putimage(x-=2,y,buf,COPY_PUT);
grade++;
key=0;
break;
}
case UP:
if(xcenterx&&scentery==p->centery||scenterx==sx&&scentery==sy)
{show=0;
jump=1;
break;
}
else
p=p->next;
if(jump==1)
break;
}
if(show==1)
{putimage(scenterx-11,scentery-11,far3,COPY_PUT);
nextshow=0;
break;
}
}
}
/***********过关动画**************/
void donghua()
{ int i;
cleardevice();
setbkcolor(BLACK);
randomize();
while(1)
{for(i=0;inewy; /************记录最后节点的坐标************/
sx=a;
sy=b;
}
p1->newx=p2->centerx;
p1->newy=p2->centery;
p2=p1;
}
p1=head;
while(p1!=NULL)
{p1->centerx=p1->newx;
p1->centery=p1->newy;
p1=p1->next;
}
/********判断按键方向*******/
if(bioskey(1))
{ ch=bioskey(0);
if(ch!=RIGHT&&ch!=LEFT&&ch!=UP&&ch!=DOWN&&ch!=ESC) /********chy为上一次的方向*********/
ch=chy;
}
switch(ch)
{
case LEFT: if(control!=4)
{head->newx=head->newx-22;
head->centerx=head->newx;
control=2;
if(head->newxnewx=head->newx+22;
head->centerx=head->newx;
control=4;
if(head->newx>377)
gameover();
}
chy=ch;
break;
case DOWN:
if(control!=1)
{ head->newy=head->newy+22;
head->centery=head->newy;
control=3;
if(head->newy>377)
gameover();
}
else
{ head->newy=head->newy-22;
head->centery=head->newy;
control=1;
if(head->newynewx=head->newx+22;
head->centerx=head->newx;
control=4;
if(head->newx>377)
gameover();
}
else
{ head->newx=head->newx-22;
head->centerx=head->newx;
control=2;
if(head->newxnewy=head->newy-22;
head->centery=head->newy;
control=1;
if(head->newynewy=head->newy+22;
head->centery=head->newy;
control=3;
if(head->newy>377)
gameover();
}
chy=ch;
break;
case ESC:
flag=1;
break;
}
/* if 判断是否吃蛇*/
if(flag!=1)
{ if(head->newx==scenterx&&head->newy==scentery)
{ p3=head;
while(p3!=NULL)
{ p4=p3;
p3=p3->next;
}
p3=(struct snake *)malloc(sizeof(struct snake));
p4->next=p3;
p3->centerx=a;
p3->newx=a;
p3->centery=b;
p3->newy=b;
p3->next=NULL;
a=500;
b=500;
putimage(409,62,far4,COPY_PUT); /********** 分数框挡住**************/
putimage(500,62,far4,COPY_PUT); /*********把以前的剩下虫子的框挡住********/
score=(++n)*100;
left--;
itoa(score,sscore,10);
itoa(left,sleft,10);
setcolor(RED);
outtextxy(415,70,sscore);
outtextxy(512,70,sleft);
nextshow=1;
if(left==0) /************判断是否过关**********/
donghua(); /*******如果过关,播放过关动画*********************/
}
p5=head; /*********************判断是否自杀***************************/
p5=p5->next;
p5=p5->next;
p5=p5->next;
p5=p5->next; /****从第五个节点判断是否自杀************/
while(p5!=NULL)
{if(head->newx==p5->centerx&&head->newy==p5->centery)
{ gameover();
break;
}
else
p5=p5->next;
}
}
}
/************snakechange()函数结束*******************/
/*****************************主函数******************************************/
int main()
{ int i;
init(); /**********初始化图形系统**********/
welcome(); /*********8欢迎界面**************/
bort(); /*********主场景***************/
snakede(); /**********连表初始化**********/
while(1)
{ snakechange();
if(flag==1)
break;
snakepaint();
ran();
for(i=0;i