C++《程序设计综合课程设计》报告贪吃蛇小游戏.doc
《C++《程序设计综合课程设计》报告贪吃蛇小游戏.doc》由会员分享,可在线阅读,更多相关《C++《程序设计综合课程设计》报告贪吃蛇小游戏.doc(28页珍藏版)》请在三一办公上搜索。
1、 华科学院计算机科学与技术专业程序设计综合课程设计报告 (2011/2012学年 第一学期)学生姓名: 学生班级: 学生学号: 指导教师: 年 月 日贪吃蛇小游戏目 录1.课程设计目的和要求11.1课程设计目的11.2课程设计要求12. 课程设计任务内容13.详细设计13.1设计要求13.2设计思想23.2.1界面设计:23.2.2数据结构23.3函数设计43.3.1文件及函数组成43.3.2函数的详细设计53.4限制条件73.5.流程图73.5.1系统流程图73.5.2函数流程图94. 测试134.1运行结果及程序测试144.2错误调试与分析165.课程设计设计心得与体会17参考文献19附录
2、:程序清单201.课程设计目的和要求本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计基础(C+)课程后进行的一次全面的综合设计。本课程设计的目的和任务:1.1课程设计目的1. 巩固和加深学生对C+语言课程的基本知识的理解和掌握。2. 掌握C+语言编程和程序调试的基本技能。3. 利用C+语言进行基本的软件设计。4. 掌握书写程序设计说明文档的能力。5. 提高运用C+语言解决实际问题的能力。 基本要求:1.2课程设计要求1. 分析课程设计题目的要求。2. 对系统功能模块进行分析,写出详细设计说明文档。3. 编写程序代码,代码量要求不少于300行。调试程序使其能正确运行。
3、4. 设计完成的软件要便于操作和使用。5. 设计完成后提交课程设计报告。2. 课程设计任务内容程序要求游戏时,一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。3. 详细设计3.1设计要求贪吃蛇算法程序要求:游戏时,一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计
4、10分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。3.2设计思想3.2.1界面设计:这个程序的关键是表示蛇的图形以及蛇的移动。用一个小表示蛇的一节身体,身体每长一节,增加一个。移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向右前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,在界面中央有个静止不动的食物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加十分,界面开始更新,蛇的身体增加一节,食物的
5、位置变化一次,当蛇碰到界面时,游戏自动结束,显示用户最后的分数。3.2.2数据结构snack.h文件及类的设计如表3-1所示。表3-11 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)rSign=r;lSign=l; Cmp operator-(const Cmp &m)const r
6、eturn 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; /预备蛇头 int row; /列数 int line; /行数 int count; /蛇身长度 v
7、ectorvector 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 Cmp& cmp) return ( getSymbol(cmp)= | cmp.rSign =
8、 row-1 | cmp.rSign= 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的内容主要是snack.h的成员函数。 表中的s是Csnack类的对象。表3-23.3
9、.2函数的详细设计1. InitInstance函数函数原型:void Csnake:InitInstance()。功能:初始化游戏界面,初始化蛇身,将方向上下左右分别用4个键表示。参数:无。返回值:无。工作方式:根据命令,调用相应函数,建立内存链表,将蛇身坐标压入队列,并将蛇身作 为一个数组。要求:完成初始化,界面中给出蛇的相关信息。2. UpdataGame函数函数原型:bool Csnake:UpdataGame()。功能:获取用户按键信息,产生食物,并随机产生食物的相关坐标,判断在蛇没有死亡的状态下是否碰到食物,如果碰到则加10分,蛇身增长一节,返回值定为true,如果蛇在移动过程中,
10、撞到墙壁或身体交叉(蛇头撞到自己的身体),返回值定为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)= | cmp.rSign = row-1 | cmp.rSign= 0 |
12、 cmp.lSign = line-1 | cmp.lSign = 0。工作要求:判断条件,从而决定返回值。3.4限制条件 本程序由于经常调用Invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。玩的时候可能会碰到一定的闪屏问题。不过不会影响游戏的进行。玩家还是可以比较正常的操作此题要求的一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,并且蛇的身体加长一节的贪吃蛇游戏。本程序经过调试,可以在XP系统下编译运行,也可以在Vista下运行,界面稍有不同,但不影响运行结果。3.5.流程图3.5.1系
13、统流程图系统流程图如图3.1所示。打开游戏时,初始化游戏界面,自动生成蛇身与食物,然后蛇开始向右走,用户可以通过键盘控制蛇的走向,此时开始计分.通过判断蛇头与食物的座标是否重合,可以决定是否生成新的食物,当蛇头与墙相撞时,输出成绩,结束游戏。图3.13.5.2函数流程图InitInstance函数流程图如图3.2所示。图3.2打开运行结果后,自动调用InitInstance函数,通过调用本函数,将界面生成一个二维数组,然后通过函数的调用自动生成一个蛇。 Csnack函数流程图如图3.3所示。图3.3首先 获取用户按键信息,通过本函数的调用,判断用户输入的方向。判断GetKeyState(VK_
14、UP)0如果是,返回1,如果不是,如果不满足,接着往下判断GetKeyState(VK_DOWN)0,如果满足返回2,如果不满足,接着判断GetKeyState(VK_LEFT)0,如果满足,返回3,不满足接着判断GetKeyState(VK_RIGHT)0,如果满足返回4,不满足返回0。主函数流程图如图3.4所示。图3.4判断蛇是否死亡,如果没有死亡,调用更新游戏界面函数,显示游戏界面函数。 UpdataGame函数流程图如图3.5所示。图3.5首先判断是否吃到食物,如果吃到食物,然后通过do while循环再次生成一个蛇身,通过if语句判断生成的是不是蛇,假如是蛇,则随机生成一个食物,假如
15、不是蛇,则再次通过do while循环生成一个蛇身。图3.5 a(序图3.5)根据用户按键信息,判断蛇的走向,如果用户发出了向上的指令,则蛇改变方向,向上运动,如果用户发出了向下的指令,则蛇改变方向,向下运动,如果用户发出了向左的指令,则蛇改变方向,向左运动,如果用户发出了向右的指令,则蛇改变方向,向右运动,如果用户没有发出方向指令,则还是按照原方向运动,以上操作均可以通过如图3.7的switch循环来实现。图3.5 b(序图3.5)InitInstance函数()流程图如图3.6所示。图3.64. 测试4.1运行结果及程序测试图4.1 程序开始,初始化界面,调用函数自动生成蛇和食物之后,蛇自
16、动向右走。图4.2图4.3图4.4通过方向键来控制蛇的走向。图4.5游戏结束输出最终成绩。4.2错误调试与分析本程序由于经常调用Invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。查阅了很多资料,双缓冲技术可以解决这个问题,但是如果采用双缓冲技术,暂时还不能克服背景的问题,因为在双缓冲技术的应用中,背景是被强制默认为颜色,而不是图片。我尝试改变了一下,但是没有成功,所以这个问题还没有解决。希望大家多多给予意见。问题1:速度太快。解决方法:循环delay。 for(d=0;d4;d+) delay(GAME_SPEED);问题 2:食物可能出现在蛇身上。解决方法:依次判断,若重
17、叠则重新生成食物。 void createFood() int i; label: food.position.x=left+10*(int)rand()%11); food.position.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.课程设计设计心得与体会 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计综合课程设计 程序设计 综合 课程设计 报告 贪吃 小游戏
链接地址:https://www.31ppt.com/p-2384354.html