贪吃蛇游戏-------实习报告Word下载.doc
《贪吃蛇游戏-------实习报告Word下载.doc》由会员分享,可在线阅读,更多相关《贪吃蛇游戏-------实习报告Word下载.doc(22页珍藏版)》请在冰豆网上搜索。
![贪吃蛇游戏-------实习报告Word下载.doc](https://file1.bdocx.com/fileroot1/2022-10/22/654a294e-1727-47c7-aaca-744d8aaf6494/654a294e-1727-47c7-aaca-744d8aaf64941.gif)
本人因水平有限,只能设计简单的贪吃蛇游戏。
不过,在功能上,比传统贪吃蛇游戏更丰富。
蛇可以反向运动,操作起来,显得更为灵活。
界面的颜色选用绿色,不易使眼睛疲劳。
关键词:
3D版;
传统;
灵活;
1
目录
1、概述
1.1、用TC设计程序的方法
1.2、简要说明
2、设计要求
3、系统分析与模块设计
3.1、算法设计
3.2、数据结构
3.3、模块设计
3.4、模块枝干图
4、程序流程图
4.1、图形驱动
4.2、开始画面
4.3、显示食物
4.4、蛇向前移动
4.5、判蛇死
4.6、吃到食物后处理
4.7、判蛇反向移动
4.8、游戏结束
4.9、图形结束
5、程序设计及关键源代码
6、运行结果分析
7、实习心得
贪吃蛇游戏的设计
1.概述
首先应了解设计要求,然后按照功能设计模块,每个模块完成特定的功能,要使模块间的耦合性小,内聚性高;
设计模块是相当重要的一个环节。
模块的数量不宜太多,也不宜太少,要使每个模块都能比较简单的转换成流程图。
模块设计完成后,就该给每个模块绘制流程图了。
流程图要简单,容易理解,多用中文。
不宜写过长的代码,增加理解难度。
流程图与模块枝干图均可用绘图软件绘制,可适当加些背景色,用以区分。
此外,流程图应容易转换成代码。
绘制好了流程图,就要编写代码了。
直接在TC环境里输入代码,然后运行测试,检查错误,最终,将设计出可行的程序。
1.2、简要说明
我设计的贪吃蛇游戏具有很多独特性。
例如,墙壁不用实体,而用中空的墙,颜色为绿色,显得更美观,且不易使眼疲劳。
操作上,做了些简化,游戏开始时便可以自动运行,且速度较快,属中等难度。
玩游戏的过程相当简单,只需按键盘上的上下左右方向键,便可改变蛇的行进方向。
食物随机产生。
贪吃蛇吃到一个食物后便得到10分。
得分显示在左上角。
当蛇撞到墙壁或自己时,蛇死,游戏结束,输出得分。
2.设计要求
外观为矩形,食物随机产生,添加注释,统计得分、每吃到一个食物获得10分。
蛇碰到自己或墙壁,游戏均结束。
游戏结束时输出得分。
画出模块枝干图与每个模块的程序流程图。
修改某些代码,改变其外观及功能。
游戏操作应尽量简单。
界面美观,让人看了觉得舒服。
玩游戏过程采用递归算法,由WHILE
(1)控制循环过程,可使游戏重复玩,在蛇死之前不停的玩。
判断蛇死的算法是通过判断蛇有没有碰到自己及墙壁。
使蛇向前移动采用递归算法,通过递归将蛇的每一节依次向前移动,横坐标与纵坐标依次向前赋值,从而达到使蛇前移的目的。
蛇的前进方向通过IF结构判断。
蛇与食物信息分别用两个结构体存储与表示。
将食物的横坐标X、纵坐标Y和判断是否要出现食物的变量YES分别作为食物的结构体的成员。
蛇的横坐标数组X[N],纵坐标数组Y[N],蛇的节数NODE,蛇的移动方向DIRECTION、蛇的生命LIFE分别作为蛇的结构体的成员。
结构体内每个成员的存储类型均为整型。
模块应具有高内聚性,低耦合性。
这样,程序运行才更稳定,效率更高。
据功能将贪吃蛇游戏划分成四个大模块,九个小模块。
每个模块均具有自己的功能,而且,比较容易画出各个模块的流程图。
简要说明:
图形驱动即完成初始化图形系统功能;
开始画面模块的主要作用是根据设置绘制出玩游戏区域四周的墙壁;
玩游戏的过程是游戏此游戏程序的核心,又可细分为好多小的功能模块;
其中,显示食物模块仅完成显示食物功能;
蛇前移模块即通过递归算法实现蛇的向某方向移动;
判蛇死模块的功能是通过判断蛇是否碰到自己或墙壁来判断蛇有没有死亡。
吃到食物后小模块只有蛇吃到食物后才起作用。
即当蛇吃到食物后,蛇自身延长一节并绘出蛇,同时加10分。
通过键盘操控来玩游戏主要由判反向移动模块完成,即当蛇不是反向移动时,按照键盘上方向键指示移动。
游戏结束模块功能简单,仅完成输出得分与提示语功能。
最后图形结束模块完成关闭图形功能。
4.3、显示食物
4.4、蛇向前移动
4.5、判蛇死
4.6、吃到食物后处理
4.7、判蛇反向移动
4.8、游戏结束
4.9、图形结束
定义上下左右控制方向:
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
设定游戏速度:
intgamespeed=60000;
用结构体定义食物与蛇:
structFood
{
intx;
/*食物的横坐标*/
inty;
/*食物的纵坐标*/
intyes;
/*判断是否要出现食物的变量*/
}food;
/*食物的结构体*/
structSnake
intx[N];
inty[N];
intnode;
/*蛇的节数*/
intdirection;
/*蛇移动方向*/
intlife;
/*蛇的生命,0活着,1死亡*/
}snake;
主函数:
voidmain(void)
Init();
/*图形驱动*/
DrawK();
/*开始画面*/
GamePlay();
/*玩游戏具体过程*/
Close();
/*图形结束*/
}
图形驱动:
voidInit(void)
intgd=DETECT,gm;
initgraph(&
gd,&
gm,"
c:
\\tc"
);
cleardevice();
开始画面,左上角坐标为(50,40),右下角坐标为(620,460)的围墙:
voidDrawK(void)
setcolor(10);
/*绿色*/
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
/*设置线型*/
for(i=50;
i<
=610;
i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49);
/*上边*/
rectangle(i,451,i+10,460);
/*下边*/
}
for(i=40;
=450;
i+=10)
{
rectangle(50,i,59,i+10);
/*左边*/
rectangle(611,i,620,i+10);
/*右边*/
}
玩游戏具体过程:
voidGamePlay(void)
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()%400+60;
food.y=rand()%350+60;
while(food.x%10!
=0)/*使食物在整格内*/
food.x++;
while(food.y%10!
=0)
food.y++;
food.yes=0;
/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
setcolor(BROWN);
rectangle(food.x,food.y,food.x+10,food.y-10);
for(i=snake.node-1;
i>
0;
i--)/*蛇的每个环节前移动,关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];