贪吃蛇c++实验报告(共12页)

上传人:晚**** 文档编号:50929853 上传时间:2022-01-24 格式:DOC 页数:12 大小:123KB
收藏 版权申诉 举报 下载
贪吃蛇c++实验报告(共12页)_第1页
第1页 / 共12页
贪吃蛇c++实验报告(共12页)_第2页
第2页 / 共12页
贪吃蛇c++实验报告(共12页)_第3页
第3页 / 共12页
资源描述:

《贪吃蛇c++实验报告(共12页)》由会员分享,可在线阅读,更多相关《贪吃蛇c++实验报告(共12页)(12页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上三、实验步骤1、编程环境的选择本程序采用Microsoft Visual C+6.0的英文版本进行编译。VisualC+6.0是Microsoft公司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C+规范,但仍有相当多的编程人员使用VisualC+6.0进行应用系统的开发。2、 概要设计2.1软件主要功能设计2.1.1程序结构的设计根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,音乐音效的添加与控制,游戏帮助提示

2、与英雄榜的显示等等。具体的程序结构如下面的图2-1所示。图2-1 贪吃蛇结构图2.1.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。贪吃蛇的内容主要包括: 游戏开始,随机出现食物;按下ToolBar中的暂停按钮或Space键可以实现暂停功能;按下帮助键或ToolBar中的“?”键可获得游戏帮助说明;可播放背景音乐和音效并可通过菜单以及ToolBar控制其播放或停止等等。图2-2 贪吃蛇流程图3 、软件实现3.1变量函数及资源的声明根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。3.1.1函数声明void CYuShuoView:OnDraw(CDC* pDC) /在OnDr

3、aw函数中绘制游戏背景、游戏文字以及控制蛇的样式颜色。void CYuShuoView:YsInitFood() /初始化贪吃蛇的食物,使其随机生成void CYuShuoView:YsInitGame() /初始化贪吃蛇游戏参数void CYuShuoView:YsReDisplay(CPoint ysPoint) /重绘游戏窗口void CYuShuoView:OnYsBegin() /开始游戏(菜单响应消息)void CYuShuoView:OnYsPause() /暂停游戏(菜单响应消息)void CYuShuoView:OnYsStop() /停止游戏(菜单响应消息)void CYu

4、ShuoView:OnYsExit() /退出游戏(菜单响应消息)void CYuShuoView:OnYsEffect() /控制游戏音效void CYuShuoView:OnYsMusicbkg() /控制游戏背景音乐void CYuShuoView:OnYsLevel1() /控制游戏等级为初级void CYuShuoView:OnYsLevel2() /控制游戏等级为中级void CYuShuoView:OnYsLevel3() /控制游戏等级为高级void CYuShuoView:OnYsHelpgame() /游戏帮助void CYuShuoView:OnYsBest() /英雄榜

5、的显示3.1.2变量声明CArray m_ysBody; /定义点数组作为蛇的身体CPoint m_ysFood; /食物出现的点int m_ysTime; /显示时间int m_ysTime1; /满10则进一位使时间增加1秒int m_ysDirect; /方向控制变量int m_ysScore; /玩家成绩变量int m_yspausectrl; /暂停控制变量int m_yslevelctrl; /等级控制变量CString m_ysPlayer; /玩家姓名int m_yseffectctrl; /音效控制变量int m_ysmusicctrl; /背景音乐控制变量3.1.3资源1、

6、对话框IDD_YS_HELPGAME /游戏帮助说明IDD_YS_BEST /英雄榜IDD_YS_RETRY /停止游戏确认IDD_ABOUTBOX /关于游戏版本2、音乐IDR_YS_BKGMUSIC /游戏背景音乐IDR_YS_EAT /贪吃蛇吃到食物的音乐IDR_YS_LOWSCORE /游戏结束后得低分音乐IDR_YS_HIGHSCORE /游戏结束后得高分音乐3、位图IDB_YS_BITMAP /游戏背景图4、菜单/工具栏 IDR_MAINFRAME /系统自带菜单IDR_YS_TOOLBAR /自己创建的工具条5、 头文件mmsystem.h /播放音乐的相应文件 fstream.

7、h /文件流文件 3.2主要功能的实现3.2.1游戏界面贪吃蛇游戏的游戏界面包括背景图片、蛇身体的绘制、蛇移动范围的绘制等等。其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。本程序采用点数组CArray m_ysBody来存储贪吃蛇,点数组的功能很强大,可以添加点,同时可以获得蛇的长度,对于而后进行游戏中控制蛇的颜色以及音效的播放等都有很大的帮助。3.2.2初始化食物确定用点数组存储贪吃蛇以后,贪吃蛇的食物如何达到随机出现,并且能够按照网格式与蛇头无偏差相接就是一个亟待解决的问题。随机出现应采用

8、rand()函数来实现,而食物与蛇头无偏差相接则利用坐标来解决。设置两个整型变量m_ysX,m_ysY作为食物出现的点的坐标,令m_ysX= rand()%30, ,m_ysY= rand()%40即可。使随机出现的点能够整除最小网格,也就是使食物与蛇头无偏差相接。再由食物坐标(m_ysX,m_ysY)与蛇头坐标是否相同判断蛇是否“吃”到了食物,设置判断标签ysTag,如果吃到了,ysTag为1,则再出现下一个食物,反之,如果没吃到,则不出现食物直到标签为1为止。最后,再将(m_ysX,m_ysY)赋给m_ysFood作为食物坐标,以便在其他函数中调用。蛇的身体是与出现的食物在一条直线上的,完

9、全可以达到相接的目的。3.2.3开始游戏开始游戏后的重点是如何用键盘来控制蛇的移动并传递到OnTimer(UINT nIDEvent)函数中去以及判断蛇是否死亡。首先说明键盘与蛇的响应,设置一个方向控制变量m_ysDirect,再添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数来实现键盘消息的传递,按下不同的键盘按键,m_ysDirect会相应的改变,再利用switch语句在OnTimer(UINT nIDEvent)函数中对坐标进行相应改变即可。其次来解释一下如何判断蛇的死亡,由于蛇的身体是由点坐标数组构成的,因此判断蛇是否死亡其本质就

10、是判断蛇头的坐标是否与游戏边框相同或者蛇头坐标是否与蛇自己的身体相同。该过程也在OnTimer(UINT nIDEvent)函数中写入即可,设置一个判断死亡变量ysTag1,当按下向下键时,蛇纵坐标不断自加,此处仅以向下为例,具体程序如下:switch(m_ysDirect) /根据键盘按下键来选择蛇移动的方向case 1: /方向变量向下ysPoint2.y+; /点纵坐标自加if(ysPoint2.y=40) /如果纵坐标多于最下端边框ysTag1=1; /变量为1,判断死亡break;如果ysTag1为1,则说明蛇已经死亡,应当弹出对话框提示死亡,输出得分,同时还可以根据玩家的得分数相应

11、的改变对话框中的话语(XP系统下)。我们看到图3-4的蛇身体的颜色发生了变化,不再是初始状态的绿色,而是变为了蓝色,这是在OnDraw(CDC* pDC)函数中设置的,设置变量获取蛇身长度,随着长度的增加,蛇的颜色发生相应改变,最终会变为表示危险的红色。并且伴随着贪吃蛇挂掉,播放不同的音乐,如果高于70分,则放带有掌声鼓励的高分音乐的IDR_YS_HIGHSCORE,反之,则播放蛇被撞死的电子音乐IDR_YS_LOWSCORE。播放音乐的函数用包含在头文件mmsystem.h中的PlaySound函数。此外,游戏开始还需要计时、计分以及暂停等功能。这些功能都比较简单,游戏时间和分数分别用两个变

12、量m_ysTime和m_ysScore来记录,应用pDC-TextOut函数来输出即可。至于暂停和继续的功能实现,只需要暂停和恢复计时器就可以了,实现暂停功能即KillTimer(1)并同时令控制暂停变量为m_yspausectrl为0即可。3.2.4英雄榜很多游戏都有英雄榜这一个功能。贪吃蛇这个游戏也不例外,为了下一次开始新游戏的玩家也能够看到别人的成绩,所以采用文件来存储游戏记录。首先加入头文件fstream.h包含文件写入读出函数ifstream、ofstream。定义文件及变量存储成绩,将对话框中EditBox的变量设置成为对应类型。例如:CYsBestRecord dlg;dlg.m

13、_ysbestscore1=m_1bestscore;上面所写的就是变量的传递,传递完毕后,对话框控件中就有了初值,可以正常显示分数。而后进行游戏相应等级的玩家成绩判断,如果玩家成绩与英雄榜成绩相同,则根据时间来判断,若游戏时间短,则进入英雄榜。判断条件如下:(m_ysScorem_1bestscore|m_ysScore=m_1bestscore&m_ysTimem_1besttime)&m_yslevelctrl=1 本程序默认游戏结束即显示英雄榜,但玩家如果想在没有游戏时查看也可以点击菜单“帮助英雄榜”查看。3.2.5游戏设置这里的游戏设置主要是指游戏的等级以及音效音乐的播放控制。前面在

14、变量声明中已经看到,关于这三个量,我们已经予以了定义,只需要在按下相应键盘或鼠标消息的时候,将变量值进行改变,再利用这些值控制相应功能的运行。以游戏音效为例,在按下菜单中的“游戏设置音乐音效开/关” 后(即菜单消息void CYuShuoView:OnYsEffect()),代码如下:switch(m_yseffectctrl) /根据音效控制变量选择case 1: /音效选择开m_yseffectctrl=0; /将音效控制变量改为0break;case 0: /音效选择关m_yseffectctrl=1; /将音效控制变量改为1 break;其中在构造函数CYuShuoView:CYuSh

15、uoView()中已经将m_yseffectctrl的初值设置为1。4、实验代码#include #include #include #include #include /使用当前时间做种子;enum dirup,down,left,right; /枚举类型enum dir;/围墙;class Fencepublic:void InitFence();void OutputF();public:char game2020;f; /定义对象;/画框框;void Fence:InitFence()for(int i=0; i20; i+)for(int j=0; j20; j+)if(i=0|i=

16、19|j=0|j=19)gameij= *;else gameij= ;/显示框框;void Fence:OutputF()for(int i=0; i20; i+)for(int j=0; j20; j+)coutgameij ;coutx =x; q-y =y;q-next =head;q-prior =NULL;if(head) head-prior =q;head =q;if(!tail) tail =head;f.gamexy= *; /f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义;int SnakeNode:get_x()return x;int

17、 SnakeNode:get_y()return y;/删除尾结点;void SnakeNode:delete_tail()SnakeNode *p =tail;f.gametail-get_x()tail-get_y()= ;/把尾结点的坐标表示的*置为空格;if(tail=head)tail= head= NULL;elsetail= tail-prior;tail-next= NULL;delete p;/move移动;class movepublic:dir point; /枚举变量point: 控制方向;int food_x;int food_y;public:void moving

18、();void change_point(char); /改变方向;void get_food();void move:moving()int a,b;a= head-get_x(); /取得头结点横坐标b= head-get_y(); /头结点纵坐标switch(point)case up: -a; break;case down: +a; break;case left: -b; break;case right: +b; break;if(a=19|b=19|a=0|b=0|gameab=*)/判断是否撞墙;coutgame over!add_head(a,b);get_food();e

19、lsehead-add_head(a,b); /插入头结点;head-delete_tail(); /删除尾结点;void move:change_point(char keydown)switch(keydown)case w: point= up; break;case s: point= down; break;case a: point= left; break;case d: point= right; break;void move:get_food()srand(unsigned int) time(NULL); /做种子(程序运行时间); food_x= rand()%18+1

20、; food_y= rand()%18+1;f.gamefood_xfood_y= *;/main();int main()coutadd_head(4,3);head-add_head(4,4);head-add_head(4,5);m.get_food();f.OutputF();while (true)char keydown= getch(); /getch()返回键盘上读取的字符;包含头文件m.chan四、实验结果程序开始运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“开始”才会开始游戏。在游戏开始前,玩家可以根据自己的喜好,通过菜单或者工具栏设置游戏等级等。在游戏过程中,按

21、下Space键就会暂停游戏,再按下Space键则会继续游戏。开始游戏了,小蛇越来越长,颜色也有所不同了。颜色的改变预示着游戏的难度加大了,并且,不同的最终得分会产生不同的死亡评语。在前面的图3-4中显示了贪吃蛇死亡的样子,其中因为该局游戏得分比较低,因此得到的评语是“你才得了这么两分!”,而如果得分较高,就会得到更好的评语,最好的评语是“牛!”。五、实验体会通过本次实验,我控股了之前学习的知识,如数据结构和c+语言规范,也更加熟练地掌握了Microsoft Visual C+6.0环境上网配置和操作,但是仍有不足,本程序由于经常调用Invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。查阅了很多资料,双缓冲技术可以解决这个问题,但是如果采用双缓冲技术,暂时还不能克服背景的问题,因为在双缓冲技术的应用中,背景是被强制默认为颜色,而不是图片。我尝试改变了一下,但是没有成功,所以这个问题还没有解决。希望老师多给予指导多多给予意见。专心-专注-专业

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!