C++课程设计:贪吃蛇游戏

上传人:r****d 文档编号:147207790 上传时间:2022-09-01 格式:DOC 页数:21 大小:347.50KB
收藏 版权申诉 举报 下载
C++课程设计:贪吃蛇游戏_第1页
第1页 / 共21页
C++课程设计:贪吃蛇游戏_第2页
第2页 / 共21页
C++课程设计:贪吃蛇游戏_第3页
第3页 / 共21页
资源描述:

《C++课程设计:贪吃蛇游戏》由会员分享,可在线阅读,更多相关《C++课程设计:贪吃蛇游戏(21页珍藏版)》请在装配图网上搜索。

1、课 程 设 计 报 告 课程名称:面向对象程序设计C+ 设计题目:用C+实现贪吃蛇游戏 专 业:计算机科学与技术 姓 名: 学 号: 指导教师:李 晓 虹2015 年 1 月 6 日1. 系统需求分析1.1 选题背景贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我们的编程能力不是很强,但是我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此我们选定了这个题目。1.2 关于编译软件

2、本程序采用Microsoft Visual C+6.0的英文版本进行编译。VisualC+6.0是Microsoft公司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C+规范,但仍有相当多的编程人员使用VisualC+6.0进行应用系统的开发。1.3 关于兼容性本程序经过调试,可以在XP系统下编译运行,也可以在Vista下运行,界面稍有不同,但不影响运行结果。2. 总体设计2.1 设计要求贪吃蛇算法程序要求:游戏时,一条蛇在密闭的围墙内,围墙内会随机出现一个食物通过键盘上的4个光标

3、键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。2.2 软件主要功能设计2.2.1 程序结构根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、停止游戏,设置游戏级别(速度),设置图片等。具体的程序结构如下面的图1-1所示。 贪吃蛇游戏开始游戏设置游戏结束开始初级中级高级结束图2-1 贪吃蛇结构图2.2.2 程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。贪吃蛇的内容主要包括: 游戏开始,随机出现食物。载入游戏并初始

4、化判断是否开始蛇开始移动根据键盘控制蛇移动方向判断蛇头和食物的坐标是否重合随机生成下一个食物判断蛇头和自身及墙、毒果是否重合游戏结束设置菜单选择游戏级别判断选择级别初级中级高级退出否否是是是否图2-2 贪吃蛇流程图3. 详细设计3.1 界面设计这个程序的关键是表示蛇的图形以及蛇的移动。用一个小表示蛇的一节身体,身体每长一节,增加一个。移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向右前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,在界面中央有个静止不动的食

5、物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加十分,界面开始更新,蛇的身体增加一节,食物的位置变化一次,当蛇碰到界面时,游戏自动结束,显示用户最后的分数。3.2 数据结构设计snack.h文件及类的设计如表3.1所示。1 Cmp类的设计。class Cmp friend class Csnake; int rSign; /横坐标 int lSign; /竖坐标 public: / friend bool isDead(const Cmp& cmp); Cmp(int r,int l)setPoint(r,l); Cmp() void setPoint(int r,int l)rSig

6、n=r;lSign=l; Cmp operator-(const Cmp &m)const return Cmp(rSign-m.rSign,lSign-m.lSign); Cmp operator+(const Cmp &m)const return Cmp(rSign+m.rSign,lSign+m.lSign); ; const int maxSize = 5; /初始蛇身长度 2 Csnake类的设计。class Csnake Cmp firstSign; /蛇头坐标 Cmp secondSign;/蛇颈坐标 Cmp lastSign; /蛇尾坐标 Cmp nextSign; /预备蛇

7、头 int row; /列数 int line; /行数 int count; /蛇身长度 vectorvector snakeMap;/整个游戏界面 queue snakeBody; /蛇身 public: int GetDirections()const; char getSymbol(const Cmp& c)const /获取指定坐标点上的字符 return snakeMapc.lSignc.rSign; Csnake(int n) /初始化游戏界面大小 if(n30)line=30+2; else line=n+2; row=line*3+2; bool isDead(const C

8、mp& cmp) return ( getSymbol(cmp)= | cmp.rSign = row-1 = 0 | cmp.lSign = line-1 | cmp.lSign = 0 ); void InitInstance(); /初始化游戏界面 bool UpdataGame(); /更新游戏界面 void ShowGame(); /显示游戏界面 ;3.3 函数设计3.3.1 文件及函数组成文件及函数的组成以及函数的功能如表3.2所示。这些函数是由两个源文件组成,main.cpp,snack.cpp。main.cpp是总控所有的函数,使得整个函数得以运行,snack.cpp的内容主要

9、是snack.h的成员函数。 表中的s是Csnack类的对象。3.3.2 函数的详细设计1. InitInstance函数函数原型:void Csnake:InitInstance()。功能:初始化游戏界面,初始化蛇身,将方向上下左右分别用4个键表示。参数:无。返回值:无。工作方式:根据命令,调用相应函数,建立内存链表,将蛇身坐标压入队列,并将蛇身作为一个数组。要求:完成初始化,界面中给出蛇的相关信息。2. UpdataGame函数函数原型:bool Csnake:UpdataGame()。功能:获取用户按键信息,产生食物,并随机产生食物的相关坐标,判断在蛇没有死亡的状态下是否碰到食物,如果碰

10、到则加10分,蛇身增长一节,返回值定为true,如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),返回值定为false,并且输出用户之前所得的分数。参数:蛇的横坐标r,蛇的列坐标l,记录用户成绩score,获取用户按键信息chioce。返回值:true或者是false。工作方式:获取用户输入按键信息,并且根据用户输入按键信息作为关键字,进行判断。要求:自动使蛇开始运动,并且及时获取用户的按键信息,随时判断是否在移动过程中碰到墙壁或者身体交叉,给出结束息。3. main函数函数原型:int main()功能:程序的入口点,总控函数。参数:没有死亡的信息noDead。返回值:0。工作要

11、求:依次调用初始化界面的成员函数,更新游戏界面的成员函数,显示游戏界面的成员函数。要求:调用程序信息。4. Csnake函数函数原型:Csnake(int n)功能:初始化游戏界面大小。参数:int n。返回值:无。5. getSymbol函数函数原型:char getSymbol(const Cmp& c)const。功能:获取指定坐标点上的字符。参数: Cmp& c。返回值:snakeMapc.lSignc.rSign。6. isDead函数函数原型:bool isDead(const Cmp& cmp)。功能:判断是否死亡。参数:Cmp& cmp。返回值:getSymbol(cmp)=

12、| cmp.rSign = row-1 | cmp.rSign= 0 | cmp.lSign = line-1 | cmp.lSign = 0。工作要求:判断条件,从而决定返回值。3.4 限制条件本程序由于经常调用Invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。玩的时候可能会碰到一定的闪屏问题。不过不会影响游戏的进行。玩家还是可以比较正常的操作此题要求的一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,并且蛇的身体加长一节的贪吃蛇游戏。本程序经过调试,可以在XP系统下编译运行,也可以在Vi

13、sta下运行,界面稍有不同,但不影响运行结果。4. 系统调试4.1 运行结果及程序测试图4-1程序开始,初始化界面,调用函数自动生成蛇和食物之后,蛇自动向右走。图4-2 图4-3 图4-4通过方向键来控制蛇的走向。游戏结束输出最终成绩。4.2 错误调试与分析本程序由于经常调用Invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。查阅了很多资料,双缓冲技术可以解决这个问题,但是如果采用双缓冲技术,暂时还不能克服背景的问题,因为在双缓冲技术的应用中,背景是被强制默认为颜色,而不是图片。我尝试改变了一下,但是没有成功,所以这个问题还没有解决。希望大家多多给予意见。问题1:速度太快。解

14、决方法:循环delay。 for(d=0;d4;d+) delay(GAME_SPEED);问题 2:食物可能出现在蛇身上。解决方法:依次判断,若重叠则重新生成食物。 void createFood() int i; label: food.position.x=left+10*(int)rand()%11);.y=top+10*(int)rand()%11); for(i=0;i=snake.length-1;i+) if(snake.nodesi.x=food.position.x&snake.nodesi.y=food.position.y) goto label;5. 结果分析程序开始

15、运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“开始”才会开始游戏。在游戏开始前,玩家可以根据自己的喜好,通过菜单或者工具栏设置游戏等级等。在游戏过程中,按下Space键就会暂停游戏,再按下Space键则会继续游戏。开始游戏了,小蛇越来越长,颜色也有所不同了。颜色的改变预示着游戏的难度加大了,并且,不同的最终得分会产生不同的死亡评语。在前面的图中显示了贪吃蛇死亡的样子,其中因为该局游戏得分比较低,因此得到的评语是“你才得了这么两分!”,而如果得分较高,就会得到更好的评语,最好的评语是“牛!”。6. 总结贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一

16、直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。这次编程我通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。 这个题目的选定是来源我学习生活的一个例子,从程序的选定到程序的构思,再到程序的编写都花了我很长的时间,几乎每天都熬夜,真得很辛苦,但完成后又有一种很踏实的感觉。编写程序很辛苦,尤其是基础不好的。不过三人行,必有我师:编程比较好的同学、编写其他程序的同学、老师都是我们相互学习的对象。感谢他们给了我很多意见,帮助了我很多,真正体会到合作的愉快。 通过这

17、次的C+程序课程设计,熟练地掌握C+语言的知识点,熟悉当前常用的软件开发环境(Visual C+),解决实际问题的能力的强化训练,正确理解掌握C+面向对象程序设计的基本特性:类、对象、继承与派生、多态、虚函数、模板、流类库等。但因为时间关系,只能把这次作为基点,有待改进,以后编程的话就不会产生恐惧心理,平时编程太少了。尤其是更熟悉文件的操作了,对C+语言也更熟悉了,也能够自己改程序中的错误,真的让我体会到编程是痛并快乐着。 下面是我的几点收获: 其一,进一步掌握和全面系统的学习面向对象程序设计的基本概念、基本语法和编程方法。正确理解掌握C+面向对象程序设计的基本特性:类、对象、继承与派生、多态

18、、虚函数、模板、流类库等。遵循软件过程的各个环节进行系统分析、设计、实现、集成、测试,并相应给出软件规格说明书等。了解当前常用的软件开发环境(Visual C+),培养了解决实际问题的能力。理解和运用了结构化程设计的思想和方法。 其二,我初步掌握开发一个小型实用系统的基本方法:就是:首先,按要求设计算法,写出流程图;接着,根据流程图,按照C+的语法规则,编写程序;而后,就是上机进行调试,调试是一个必备的步骤,通过调试将程序中的错误排除,并看看是否能实现要求的所有功能;搞完这部分以后就是写报告了,将必要的解释写进去。 其三,由于这个程序较长,故在进行调试的过程中又学会了调试一个较长程序的基本方法

19、,真正了解到实践可以让我们学到更多的知识。 其四,通过写程序的流程图,学会了利用流程图来表示算法,自顶向下、逐步细化、模块化设计、结构化编码的结构化程序设计方法,使程序更清晰化、条理化,有助于我们在编程或者以后的软件开发方向发展的成长。 其五,通过这次C+程序课程设计,学会了队友之间的相互合作的精神,和体会到集体的力量,“唱独角戏是没有人欣赏的”,这是课程设计最大的收获。 最后,通过写这次C+程序课程设计报告,掌握和培养了书写程设(软件)计开发文档的能力,虽然很累,但其中的快乐却是以前无法想象的。附录:程序清单#include #include snake.h #include using n

20、amespace std; int main() Csnake s(20); s.InitInstance(); /s.ShowGame(); int noDead; do s.ShowGame(); noDead=s.UpdataGame(); while (noDead); system(pause); return 0; #include #include #include #include snake.h using namespace std; /测试成功 void Csnake:InitInstance() snakeMap.resize(line); / snakeMap竖坐标横

21、坐标 for(int i=0;iline;i+) snakeMapi.resize(row); for(int j=0;jrow;j+) snakeMapij= ; 1; for(int m=1;mmaxSize+1;m+) /初始蛇身 snakeMapline/2m=; /将蛇身坐标压入队列 snakeBody.push(Cmp(m,(line/2); /snakeBody横坐标竖坐标 /链表头尾 firstSign=snakeBody.back(); secondSign.setPoint(maxSize-1,line/2); /测试成功 int Csnake:GetDirections(

22、)const if(GetKeyState(VK_UP)0) return 1; /1表示按下上键 if(GetKeyState(VK_DOWN)0) return 2; /2表示按下下键 if(GetKeyState(VK_LEFT)0) return 3; /3表示按下左键 if(GetKeyState(VK_RIGHT)0)return 4; /4表示按下右键 return 0; bool Csnake:UpdataGame() /- /初始化得分0 static int score=0; /获取用户按键信息 int choice; choice=GetDirections(); cou

23、tTotal score: scoreendl; /随机产生食物所在坐标 int r,l; /开始初始已经吃食,产生一个食物 static bool eatFood=true; /如果吃了一个,才再出现第2个食物 if(eatFood) do /坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间 srand(time(0); r=(rand()%(row-2)+1; /横坐标 l=(rand()%(line-2)+1;/竖坐标 /如果随机产生的坐标不是蛇身,则可行 /否则重新产生坐标 if(snakeMaplr!=) snakeMaplr=*; while (snakeMapl

24、r=); switch (choice) case 1:/向上 /如果蛇头和社颈的横坐标不相同,执行下面操作 if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign-1); /否则,如下在原本方向上继续移动 else nextSign=firstSign+(firstSign-secondSign); break; case 2:/向下 if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,

25、firstSign.lSign+1); else nextSign=firstSign+(firstSign-secondSign); break; case 3:/向左 if(firstSign.lSign!=secondSign.lSign)nextSign=firstSign+(firstSign-secondSign); else nextSign=firstSign+(firstSign-secondSign); break; case 4:/向右 if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSi

26、gn+1,firstSign.lSign); else nextSign=firstSign+(firstSign-secondSign); break; default: nextSign=firstSign+(firstSign-secondSign); /- if(getSymbol(nextSign)!=* & !isDead(nextSign) /如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头 /删除蛇尾 lastSign=snakeBody.front(); snakeMaplastSign.lSignlastSign.rSign= ; snakeBody.pop(

27、); /更新蛇头 secondSign=firstSign; /压入蛇头 snakeBody.push(nextSign); firstSign=snakeBody.back(); snakeMapfirstSign.lSignfirstSign.rSign=; /没有吃食 eatFood=false; return true; /-吃食- else if(getSymbol(nextSign)=* & !isDead(nextSign) secondSign=firstSign; snakeMapnextSign.lSignnextSign.rSign=; /只压入蛇头 snakeBody.

28、push(nextSign); firstSign=snakeBody.back(); eatFood=true; /加分 score+=10; return true; /-死亡- else coutDeadendl;coutYour last total score is scoreendl; return false; void Csnake:ShowGame() for(int i=0;iline;i+) for(int j=0;jrow;j+) coutsnakeMapij; coutendl; Sleep(1); system(cls); #include #include usi

29、ng namespace std; #ifndef SNAKE_H #define SNAKE_H class Cmp friend class Csnake; int rSign; /横坐标 int lSign; /竖坐标 public: / friend bool isDead(const Cmp& cmp); Cmp(int r,int l)setPoint(r,l); Cmp() void setPoint(int r,int l)rSign=r;lSign=l; Cmp operator-(const Cmp &m)const return Cmp(rSign-m.rSign,lSi

30、gn-m.lSign); Cmp operator+(const Cmp &m)const return Cmp(rSign+m.rSign,lSign+m.lSign); ; const int maxSize = 5; /初始蛇身长度 class Csnake Cmp firstSign; /蛇头坐标 Cmp secondSign;/蛇颈坐标 Cmp lastSign; /蛇尾坐标 Cmp nextSign; /预备蛇头 int row; /列数 int line; /行数 int count; /蛇身长度 vectorvector snakeMap;/整个游戏界面 queue snake

31、Body; /蛇身 public: int GetDirections()const; char getSymbol(const Cmp& c)const /获取指定坐标点上的字符 return snakeMapc.lSignc.rSign; Csnake(int n) /初始化游戏界面大小 if(n30)line=30+2; else line=n+2; row=line*3+2; bool isDead(const Cmp& cmp) return ( getSymbol(cmp)= | cmp.rSign = row-1 | cmp.rSign= 0 | cmp.lSign = line-1 |cmp.lSign = 0 ); void InitInstance(); /初始化游戏界面 bool UpdataGame(); /更新游戏界面 void ShowGame(); /显示游戏界面 ; #endif / SNAKE_H

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