贪吃蛇游戏程序设计程序Word文档格式.docx
《贪吃蛇游戏程序设计程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏程序设计程序Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![贪吃蛇游戏程序设计程序Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/13/cd88fa71-8970-455c-8ae0-4d46a5e93ae0/cd88fa71-8970-455c-8ae0-4d46a5e93ae01.gif)
握,并且能够掌握C语言编程和程序调试的基本技能。
通过游戏程序的设讣训练可以提高自己的基本技能,更好地掌握字符串的表示方法和字符吊函数的功能、Tc图形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高自己编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高运用C语言解决实际问题的能力,巩固C语言语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。
2、所用仪器设备
1、能正常工作的计算机一台;
2、WindowsXP;
3、TC程序;
4、MicrosoftWord2003;
3、具体设计过程
3.1、程序功能
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着乂出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体义蛇头撞倒自己身体游戏结束。
3.2设计思想
程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失也是画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体:
食物与蛇。
3.3(设计的具体实现
(1)函数定义
函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用
^defineN200
^include〈graphics.h>
/*图形头文件*/itinclude<
stdlib.h>
/*包含rand等函数*/ttinclude<
dos.h>
/*包含bios函数*/#defineLEFT0x4b00/*光标左键值*/^defineRIGHT0x4d00/*光标右键值*/^defineDOWN0x5000/*光标下键值*/ttdefineUP0x4800/*光标上键值*/ttdefineESC0x011b/*ESC的ASCII码*/inti,key;
/*图形坐标变量及按键变量*/intscore二0;
/*得分*/
intgamespeed二10000;
/*游戏速度自己调整*/structFood
{
intx;
/*食物的横坐标*/
inty;
/*食物的纵坐标*/
intyes;
/*判断是否要出现食物的变量*/}food;
/*食物的结构体*/
structSnake
intx[];
/*蛇的横坐标*/
inty[];
/*蛇的纵坐标*/
intnode;
/*蛇的节数*/
intdirection;
/*蛇移动方向*/
intlife;
/*蛇的生命,0活着,1死亡*/}snake;
voidInit(void):
/*图形驱动*/
voidClose(void);
/*图形结束*/
voidDrawK(void);
/♦画界面函数*/
voidGameOver(void):
/*结束游戏*/
voidGamePlay(void):
/*玩游戏具体过程*/voidPrScore(void);
/*输出成绩*/voidmain(void)/*主函数*/
(2)主函数main()
主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,
后初始化图形系统,调用函数DrawK()1EI出开始画面,调用函数GamePlay()»
即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序voidmain(void)/*主函数*/
Init();
DrawK();
/*开始画面*/
GamePlay();
/*玩游戏具体过程*/
Close();
}
voidInit(void)/*图形驱动*/
intgd二DETECT,gm;
initgraph(&
gd,&
gm,"
c:
\\tc"
);
/*第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,笫三个参数指定驱动程序所在口录。
*/
cleardevice();
(3)画界面函数DrawK()
主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽
度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
void
DrawK(void)/*开始画面,左上角坐标为(50,40),右下角坐标为(610,
460)的围墙*/
setbkcolor(O);
/*设置当前背景颜色*/
setcolor(YELLOW);
/*设置当前画线颜色*/
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);
/*右边*/
(4)游戏具体过程函数GamePlay()
这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最
后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。
GamePlay(void)/*玩游戏具体过程*/
randomize();
/*随机数发生器*/
food,yes二1;
/*1表示需要出现新食物,0表示已经存在食物*/
snake,life二0;
/*活着*/
snake,direction二1;
/*方向往右*/
snake.x[0]=100;
snake.y[0]=100;
/*蛇头*/
snake.x[l]=110;
snake.y[l]=100;
/*蛇第二节*/
snake,node二2;
/*节数*/
PrScoreO;
/*输出得分*/
while
(1)/*可以重复玩游戏,压ESC键结束*/
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
if(food.yes=l)/*需要出现新食物*/
food.x=rand()%400+60;
food.y=rand()%350+60;
wh订e(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!
=0)
food.y++;
food,yes二0;
/*画面上有食物了*/
辻(food.yes=0)/*画面上有食物了就要显示*/
setcolor(GREEN);
/*食物的颜色*/
rectangle(food,x,food,y,food,x+10,food,y-10);
for(i=snake.node-1;
i>
0;
i--)/*蛇的每个环节往前移动,贪吃蛇的关键算法*/
snake・x[i]=snake・;
snake・y[i]二snake・y[i-l];
switch(snake,direction)/*定义1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
case1:
snake・x[0]+=10;
b:
reak;
case2:
snake・x[0]-二10;
break;
case3:
snake・y[0]-二10;
case4:
snake・y[0]+=10;
for(i=3:
snake.node;
i++)/*从蛇的第四节开始判断是否撞到自己了,因为
蛇头为两节,第三节不可能拐过来*/
if(snake・x[i]二二snake・x[0]&
&
snake・y[i]二二snake・y[0])
GameOver();
/*显示失败*/
snake・life=l;
if(snake,x[0]<
551isnake,x[0]>
595Iisnake,y[0]<
551Isnake.y[0]>
455)/*蛇是否撞到墙壁*/
/*本次游戏结束*/
snake.life=l;
/*蛇死*/
if(snake,life-1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
if(snake.x[Oj~food.x&
snake.y[0]=food.y)/*吃到食物以后*/
setcolor(0);
/*把画面上的食物东西去掉*/
snake,x[snake,node]=-20;
snake,y[snake,node]=-20;
/*-20表示尾巴长一节*/
/*新的一节先放在看不见的位置,下次循环就取询一节的位置*/
snake,node卄;
/*蛇的身体长一节*/
/*画面上需要出现新的食物*/
score+=10;
/*输出新得分*/
setcolor(4);
for(i=0;
Ksnake.node;
i++)/*画出蛇*/
rectangle(snake.x[i_,snake.y[i_,snake.x[i]+10,
snake,y[i]T0);
delay(gamespeed);
/*用黑色去除蛇的的最后一节*/
rectangle(snake・x[snake・node一1],snake・y[snake・node一1],snake・x[snake・node一l]+10,snake・y[snake・node一1]一10);
}/*endwhile(〜kbhit)*/
if(snake.life==l)/*如果蛇死就跳出循环*/
key=bioskey(0);
/*接收按键*/
if(key二二ESC)/*按ESC键退出*/
else
if(key==UP&
snake・direction!
=4)
/*判断是否往相反的方向移动*/
snake・direction=3;
if(key—RIGHT&
snake.direction!
=2)
snake・direction=l;
if(key==LEFT&
=l)
snake・direction=2;
辻(key二二D0WN&
=3)
snake・direction=4;
}/*endwhile(l)*/
(5)游戏结束函数GameOver()
游戏结束,清除屏幕,输出分数,显示游戏结束信息。
GameOver(void)/*游戏结束*/
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"
guojiarT);
getch();
voidPrScore(void)/*输出成绩*/
charstr[10]:
setfillstyle(SOLID_FILL,WHITE);
bar(50,15,200,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"
scorescore);
outtextxy(55,20,str);
}
voidClose(void)/*图形结束*/
closegraph();
3.4总体流程图
3.5、程序代码编写及注释
itdefineN200
^include<
graphics.h>
^include<
^define
LEFT0x4b00ttdefineRIGHT0x4d00defineDOWN0x5000itdefineUP0x4800ttdefineESC0x011binti,key;
intscore二0;
intgamespeed二50000;
intx[N];
inty[N];
intnode:
/*蛇的节数*/
/*蛇的生命,0活着,1死亡*/}snake;
voidClose(void);
voidGameOver(void);
/*结束游戏*/voidGamePlay(void);
/*玩游戏具体过
程*/voidPrScore(void);
/*输出成绩*//*主函数*/
voidmain(void){
voidInit(void)
c:
);
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(void)
/*setbkcolor(LIGHTGREEN):
setcolor(11);
setlinestyle(SOLID.LINE,0,THICK_WIDTH):
/*设置线型*/
i+=10)/*画围墙水/
rectangle(i,451,i+10,460);
for(i=40;
i<
=450;
i+=10)
voidGamePlay(void)
snake.1辻e二0;
/*活着*/
snake.direction=l;
snake.node=2;
while(l)/*可以重复玩游戏,压ESC键结束*/
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
辻(food.yes=l)/*需要出现新食物*/
food.x=rand()%400+60:
food.y=rand()%350+60:
food・x++;
while(food.y%10!
food・y++;
setcolor(GREEN);
rectangle(food・x,food・y,food・x+10,food・y-10);
i—)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
snake・x[i]=snake・x[i-l.;
snake・y[i]二snake・y[i-l_;
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头权
switch(snake・direction)
snake.x[0]+=10;
case2:
snake.x[0]~=10;
case3:
snake.y[0]~=10;
ase4:
snake,y[0]+=10;
c
for(i=3;
i++)/*从蛇的第四节开始判断是否撞到自己了,因为
if(snake.x[i]==snake.x[0J&
snake.y[i]==snake.y[0])
if(snake,x[0]<
55)Isnake,x[0]>
595)Isnake,y[0]<
55I)
snake.y[0]>
455)/*蛇是否撞到墙壁*/
辻(snake.x[0]==food.x&
snake.y[Oj==food.y)/*吃到食物以后*/
snake・x[snake・node]二一20;
snake・y[snake・node]二一20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;
setcolor(4);
/*画出蛇*/
for(i二0;
snake・node;
i++)
rectangle(snake・x[i],snake・y[i],snake・xEi.+lO,
snake・y[i[T0);
rectangle(snake・x[snake・node一1],snake・y[snake・node一1],snake・x[snake・node一l]+10,snake・y[snake・node一1]一10);
辻(key二二ESC)/*按ESC键退出*/
if(key—UP&
二4)/*判断是否往相反的方向移动*/