贪吃蛇5.docx
- 文档编号:26394764
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:20
- 大小:38.30KB
贪吃蛇5.docx
《贪吃蛇5.docx》由会员分享,可在线阅读,更多相关《贪吃蛇5.docx(20页珍藏版)》请在冰豆网上搜索。
贪吃蛇5
贪吃蛇
一·功能分析:
贪吃蛇游戏需要解决的问题包括:
(1)整个游戏界面的图形显示;
(2)蛇的移动及蛇节数的增加;
(3)如何判断蛇是否死亡(撞墙撞自己);
(4)如何判断食物是否被吃掉以及食物的随机出现;
(5)游戏的等级的设计和得分规则;
(6)如何提高游戏的难度即速度的变化;
(7)游戏的重新开始;
(8)成绩和等级的输出;
(9)游戏的初始化;
重点:
*蛇的移动和方向的改变;
*蛇和食物的结构体;
二·程序总体结构:
初始化图形模式
开始菜单
处理和实现游戏进行过程
中的各种事件和功能
游戏是否结束
游戏是否结束
关闭图形模式
主函数:
voidmain(void)
{while
(1){
Init();
Mium();
DrawK();
GamePlay();
}
}
2.界面设计
*左边为游戏面板
*右边为当前等级及游戏得分
3.重要数据的数据结构设计
1)定义食物和蛇的结构体:
structFood
{
intx;
inty;
intyes;
}food;
structSnake
{
intx[N];
inty[N];
intnode;
intdirection;
intlife;
}snake;
食物与蛇头的数据结构设计为10*10个单位,用x和y坐标表示;
蛇的身体用数组来存储每节的坐标;
设定yes表示是否需要出现食物,yes=1表示没有食物或食物已被吃掉,需要画出食物,画出食物
后yes=0;
用1,2,3,4表示右,左,上,下;
life=0表示蛇活着,life=1表示蛇已经死了.
2)定义游戏的主界面:
宽550.高560的游戏板
4.函数设计
intGamePlay(void):
玩游戏的具体过程
intGameOver(void):
结束游戏
Voidchgamespeed(void):
调速函数
VoidMium(void):
菜单函数
VoidPrScore(void):
输出成绩
VoidDrawK(void):
开始画面
VoidInit(void):
图形驱动
函数关系图:
图形驱动
Init
菜单
Mium
源代码:
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineENTER0x1c0d
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineN800
inti,key;
intscore=0;
intrank=0;/*分数等级初始化*/
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;/*蛇的结构体*/
voidchgamespeed(void);/*调速函数*/
voidMium(void);/*菜单函数*/
voidInit(void);
voidDrawK(void);/*开始画面*/
intGameOver(void);/*结束游戏*/
intGamePlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
{while
(1){
Init();/*图形驱动*/
Mium();
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
}/*可以重复玩*/
}
/*图形驱动*/
voidInit(void)
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
cleardevice();
}
voidMium(void)
{inti,t=4,j=3,k=3,q,key;
while
(1){
setcolor(6);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=600;i+=20)/*画围墙*/
{
rectangle(i,40,i+20,60);/*上边HH*/
rectangle(i,440,i+20,460);/*下边*/
}
for(i=40;i<=450;i+=20)
{
rectangle(50,i,70,i+20);/*左边HH*/
rectangle(590,i,610,i+20);/*右边*/}
setcolor
(2);settextstyle(0,0,6);
outtextxy(200,100,"SNAKE");
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
setcolor(t);settextstyle(0,0,3);
outtextxy(220,180,"1.START");
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
setcolor(j);settextstyle(0,0,3);
outtextxy(220,250,"2.STATE");
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
setcolor(k);settextstyle(0,0,3);
outtextxy(220,320,"3.ABOUT");
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
exit
(1);
else
if(key==UP){
q=t;
t=j;
j=k;
k=q;}
else
if(key==DOWN){
q=t;
t=k;
k=j;
j=q;}
else
if(key==ENTER){
if(t==4){cleardevice();
break;}
if(j==4){Init();
cleardevice();/*清除图形界面*/
printf("贪吃蛇游戏说明\n\n");
printf("1.“↑“\n\n");
printf("2.“↑“\n\n");
printf("3.“↑“\n\n");
getch();
cleardevice();/*清除图形界面*/
}
if(k==4){Init();
cleardevice();/*清除图形界面*/
printf("制作人员:
\n\n\n(组长)梁辉\n(负责程序框架,及主程序和修复BUG)");
printf("\n\n杨万杨\n(负责菜单程序及结束菜单)");
printf("\n\n胡德杰\n(负责分数函数和调速函数)");
printf("\n\n\t\t\t\t黄山学院\n\t\t\t\t\t计算机科学与技术
(1)班");
getch();
cleardevice();/*清除图形界面*/}
}/*选择循环*/
}
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(void)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49);/*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
for(i=40;i<=450;i+=10)
{rectangle(421,i,430,i+10);/*中边*/
}
}
/*玩游戏具体过程*/
intGamePlay(void)
{score=0;
rank=0;
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while
(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{food.x=rand()%350+60;
food.y=rand()%390+60;
while(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!
=0)
food.y++;
food.yes=0;/*画面上有食物了*/
for(i=0;i { if(snake.x[i]==food.x&&snake.y[i]==food.y) {food.yes=1;} } if(food.yes==0)/*画面上有食物了就要显示*/ {setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); } } if(food.yes==0)/*画面上有食物了就要显示*/ {setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); } DrawK();/*由于蛇与边框的线粗,此为补救措施*/ /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) { case1: snake.x[0]+=10;break; case2: snake.x[0]-=10;break; case3: snake.y[0]-=10;break; case4: snake.y[0]+=10;break; } /*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*显示失败*/ snake.life=1; break; } } if(snake.x[0]<55||snake.x[0]>415||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到墙壁*/ { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ { setcolor(0);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10); snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes=1;/*画面上需要出现新的食物*/ score+=10; rank=score/40; PrScore();/*输出新得分*/ } setcolor(4);/*画出蛇*/ for(i=0;i rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); chgamespeed(); setcolor(0);/*用黑色去除蛇的的最后一节*/ rectangle(snake.x[snake.node-1],snake.y[snake.node-1], snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } }/*endwhile(! kbhit)*/ if(snake.life==1) break; key=bioskey(0);/*接收按键*/ if(key==ESC)/*按ESC键退出*/ exit(0); else if(key==UP&&snake.direction! =4)/*判断是否往相反的方向移动*/ snake.direction=3; else if(key==RIGHT&&snake.direction! =2) snake.direction=1; else if(key==LEFT&&snake.direction! =1) snake.direction=2; else if(key==DOWN&&snake.direction! =3) snake.direction=4; }/*endwhile (1)*/ } /*游戏结束*/ intGameOver(void) {charstr[10],str1[10]; intj=4,k=3,q; cleardevice(); setfillstyle(SOLID_FILL,3); bar(340,220,540,400); setcolor(9); settextstyle(0,0,3); outtextxy(380,250,"YOURS"); setcolor(6); settextstyle(0,0,2); sprintf(str,"SCORE: %d",score); outtextxy(380,300,str); sprintf(str1,"RANK: %d",rank); outtextxy(380,340,str1); setcolor(RED); settextstyle(0,0,6); outtextxy(120,100,"GAMEOVER"); setfillstyle(SOLID_FILL,1); bar(100,220,300,400); setcolor(8); while (1){ setcolor(j);settextstyle(0,0,3); outtextxy(120,260,"1.BACK"); setlinestyle(SOLID_LINE,0,THICK_WIDTH); setcolor(k);settextstyle(0,0,3); outtextxy(120,340,"2.EXIT"); setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/ key=bioskey(0);/*接收按键*/ if(key==ESC)/*按ESC键退出*/ exit (1); else if(key==UP){ q=j; j=k; k=q;} else if(key==DOWN){ q=k; k=j; j=q;} else if(key==ENTER){ if(j==4) return1; if(k==4) closegraph(); } } } voidchgamespeed(void)/*调速函数*/ { switch(rank){ case0: {delay(10000000000);setcolor(8); settextstyle(0,0,2); outtextxy(450,270,"cheer! ");};break; case1: {delay(1000000000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1");};break; case2: {delay(100000000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1");};break; case3: {delay(10000000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");};break; case4: {delay(1000000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1");};break; case5: {delay(20000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1");};break; case6: {delay(10000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1");};break; case7: case8: {delay(1000);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1"); setcolor(9); outtextxy(450,330,"\1");};break; case9: case10: case11: {delay(100);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1"); setcolor(9); outtextxy(450,330,"\1\1");};break; case12: case13: case14: case15: {delay(10);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1"); setcolor(9); outtextxy(450,330,"\1\1\1");};break; case16: case17: case18: case19: case20: {delay(5);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1"); setcolor(9); outtextxy(450,330,"\1\1\1");outtextxy(450,360,"\1");};break; case21: case22: case23: case24: case25: case26: {delay(5);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1"); setcolor(9); outtextxy(450,330,"\1\1\1");outtextxy(450,360,"\1\1");};break; case27: case28: case29: case30: case31: case32: case33: {delay(5);setcolor(8); settextstyle(0,0,3); outtextxy(450,270,"\1\1\1");outtextxy(450,300,"\1\1\1"); setcolor(9); outtextxy(450,330,"\1\1\1");outtextxy(450,360,"\1\1\1");};break; default: {delay(0);setcolor(8); settextstyle(0,0,8); outtextxy(450,270,"\1"); setcolor(8); settextstyle(0,0,1); outtextxy(450,350,"Let'moveon! ");}break; } } /*出成绩*/ voidPrScore(void) {inta[20]={460,470,480,490,500,510,520,530,540,550,560,560,560}; intb[20]={180,180,180,180,180,180,180,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃