C++《程序设计综合课程设计》报告-贪吃蛇小游戏.doc_第1页
C++《程序设计综合课程设计》报告-贪吃蛇小游戏.doc_第2页
C++《程序设计综合课程设计》报告-贪吃蛇小游戏.doc_第3页
C++《程序设计综合课程设计》报告-贪吃蛇小游戏.doc_第4页
C++《程序设计综合课程设计》报告-贪吃蛇小游戏.doc_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华科学院计算机科学与技术专业程序设计综合课程设计报告 (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附录:程序清单201.课程设计目的和要求本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计基础(c+)课程后进行的一次全面的综合设计。本课程设计的目的和任务:1.1课程设计目的1. 巩固和加深学生对c+语言课程的基本知识的理解和掌握。2. 掌握c+语言编程和程序调试的基本技能。3. 利用c+语言进行基本的软件设计。4. 掌握书写程序设计说明文档的能力。5. 提高运用c+语言解决实际问题的能力。 基本要求:1.2课程设计要求1. 分析课程设计题目的要求。2. 对系统功能模块进行分析,写出详细设计说明文档。3. 编写程序代码,代码量要求不少于300行。调试程序使其能正确运行。4. 设计完成的软件要便于操作和使用。5. 设计完成后提交课程设计报告。2. 课程设计任务内容程序要求游戏时,一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。3. 详细设计3.1设计要求贪吃蛇算法程序要求:游戏时,一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。接着又出现食物等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。3.2设计思想3.2.1界面设计:这个程序的关键是表示蛇的图形以及蛇的移动。用一个小表示蛇的一节身体,身体每长一节,增加一个。移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向右前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,在界面中央有个静止不动的食物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加十分,界面开始更新,蛇的身体增加一节,食物的位置变化一次,当蛇碰到界面时,游戏自动结束,显示用户最后的分数。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 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; /预备蛇头 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 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(); /显示游戏界面 ;3.3函数设计3.3.1文件及函数组成文件及函数的组成以及函数的功能如表3-2所示。这些函数是由两个源文件组成,main.cpp,snack.cpp。main.cpp是总控所有的函数,使得整个函数得以运行,snack.cpp的内容主要是snack.h的成员函数。 表中的s是csnack类的对象。表3-23.3.2函数的详细设计1. initinstance函数函数原型:void csnake:initinstance()。功能:初始化游戏界面,初始化蛇身,将方向上下左右分别用4个键表示。参数:无。返回值:无。工作方式:根据命令,调用相应函数,建立内存链表,将蛇身坐标压入队列,并将蛇身作 为一个数组。要求:完成初始化,界面中给出蛇的相关信息。2. updatagame函数函数原型:bool csnake:updatagame()。功能:获取用户按键信息,产生食物,并随机产生食物的相关坐标,判断在蛇没有死亡的状态下是否碰到食物,如果碰到则加10分,蛇身增长一节,返回值定为true,如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),返回值定为false,并且输出用户之前所得的分数。参数:蛇的横坐标r,蛇的列坐标l,记录用户成绩score,获取用户按键信息chioce。返回值:true或者是false。工作方式:获取用户输入按键信息,并且根据用户输入按键信息作为关键字,进行判断。要求:自动使蛇开始运动,并且及时获取用户的按键信息,随时判断是否在移动过程中碰到墙壁或者身体交叉,给出结束信息。3.main函数函数原型:int main()功能:程序的入口点,总控函数。参数:没有死亡的信息nodead。返回值:0。工作要求:依次调用初始化界面的成员函数,更新游戏界面的成员函数,显示游戏界面的 成员函数。要求:调用程序信息。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 | cmp.lsign = line-1 | cmp.lsign = 0。工作要求:判断条件,从而决定返回值。3.4限制条件 本程序由于经常调用invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。玩的时候可能会碰到一定的闪屏问题。不过不会影响游戏的进行。玩家还是可以比较正常的操作此题要求的一条蛇在密闭的围墙内, 围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,并且蛇的身体加长一节的贪吃蛇游戏。本程序经过调试,可以在xp系统下编译运行,也可以在vista下运行,界面稍有不同,但不影响运行结果。3.5.流程图3.5.1系统流程图系统流程图如图3.1所示。打开游戏时,初始化游戏界面,自动生成蛇身与食物,然后蛇开始向右走,用户可以通过键盘控制蛇的走向,此时开始计分.通过判断蛇头与食物的座标是否重合,可以决定是否生成新的食物,当蛇头与墙相撞时,输出成绩,结束游戏。图3.13.5.2函数流程图initinstance函数流程图如图3.2所示。图3.2打开运行结果后,自动调用initinstance函数,通过调用本函数,将界面生成一个二维数组,然后通过函数的调用自动生成一个蛇。 csnack函数流程图如图3.3所示。图3.3首先 获取用户按键信息,通过本函数的调用,判断用户输入的方向。判断getkeystate(vk_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语句判断生成的是不是蛇,假如是蛇,则随机生成一个食物,假如不是蛇,则再次通过do while循环生成一个蛇身。图3.5 a(序图3.5)根据用户按键信息,判断蛇的走向,如果用户发出了向上的指令,则蛇改变方向,向上运动,如果用户发出了向下的指令,则蛇改变方向,向下运动,如果用户发出了向左的指令,则蛇改变方向,向左运动,如果用户发出了向右的指令,则蛇改变方向,向右运动,如果用户没有发出方向指令,则还是按照原方向运动,以上操作均可以通过如图3.7的switch循环来实现。图3.5 b(序图3.5)initinstance函数()流程图如图3.6所示。图3.64. 测试4.1运行结果及程序测试图4.1 程序开始,初始化界面,调用函数自动生成蛇和食物之后,蛇自动向右走。图4.2图4.3图4.4通过方向键来控制蛇的走向。图4.5游戏结束输出最终成绩。4.2错误调试与分析本程序由于经常调用invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。查阅了很多资料,双缓冲技术可以解决这个问题,但是如果采用双缓冲技术,暂时还不能克服背景的问题,因为在双缓冲技术的应用中,背景是被强制默认为颜色,而不是图片。我尝试改变了一下,但是没有成功,所以这个问题还没有解决。希望大家多多给予意见。问题1:速度太快。解决方法:循环delay。 for(d=0;d4;d+) delay(game_speed);问题 2:食物可能出现在蛇身上。解决方法:依次判断,若重叠则重新生成食物。 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.课程设计设计心得与体会 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。这次编程我通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。 这个题目的选定是来源我学习生活的一个例子,从程序的选定到程序的构思,再到程序的编写都花了我很长的时间,几乎每天都熬夜,真得很辛苦,但完成后又有一种很踏实的感觉。编写程序很辛苦,尤其是基础不好的。不过三人行,必有我师:编程比较好的同学、编写其他程序的同学、老师都是我们相互学习的对象。感谢他们给了我很多意见,帮助了我很多,真正体会到合作的愉快。 通过这次的c+程序课程设计,熟练地掌握c+语言的知识点,熟悉当前常用的软件开发环境(visual c+),解决实际问题的能力的强化训练,正确理解掌握c+面向对象程序设计的基本特性:类、对象、继承与派生、多态、虚函数、模板、流类库等。但因为时间关系,只能把这次作为基点,有待改进,以后编程的话就不会产生恐惧心理,平时编程太少了。尤其是更熟悉文件的操作了,对c+语言也更熟悉了,也能够自己改程序中的错误,真的让我体会到编程是痛并快乐着。 下面是我的几点收获: 其一,进一步掌握和全面系统的学习面向对象程序设计的基本概念、基本语法和编程方法。正确理解掌握c+面向对象程序设计的基本特性:类、对象、继承与派生、多态、虚函数、模板、流类库等。遵循软件过程的各个环节进行系统分析、设计、实现、集成、测试,并相应给出软件规格说明书等。了解当前常用的软件开发环境(visual c+),培养了解决实际问题的能力。理解和运用了结构化程设计的思想和方法。 其二,我初步掌握开发一个小型实用系统的基本方法:就是:首先,按要求设计算法,写出流程图;接着,根据流程图,按照c+的语法规则,编写程序;而后,就是上机进行调试,调试是一个必备的步骤,通过调试将程序中的错误排除,并看看是否能实现要求的所有功能;搞完这部分以后就是写报告了,将必要的解释写进去。 其三,由于这个程序较长,故在进行调试的过程中又学会了调试一个较长程序的基本方法,真正了解到实践可以让我们学到更多的知识。 其四,通过写程序的流程图,学会了利用流程图来表示算法,自顶向下、逐步细化、模块化设计、结构化编码的结构化程序设计方法,使程序更清晰化、条理化,有助于我们在编程或者以后的软件开发方向发展的成长。 其五,通过这次c+程序课程设计,学会了队友之间的相互合作的精神,和体会到集体的力量,“唱独角戏是没有人欣赏的”,这是课程设计最大的收获。 最后,通过写这次c+程序课程设计报告,掌握和培养了书写程设(软件)计开发文档的能力,虽然很累,但其中的快乐却是以前无法想象的。参考文献1谭浩强著.c+程序设计(第二版)北京:清华大学出版社,2004。2刘燕君,刘振安,张一叶著.c+程序设计综合课程设计(第二版).北京:机械工业出版社,2009。3谭浩强主编.c程序设计题解与上机指导(第二版).北京:清华大学出版社,1999。4张引著.c+大学教程(第五版).北京:电子工业出版社,2007。5许兆元著.visualc+从入门到精通.北京:化学工业出版社,2011。附录:程序清单main.cpp#include #include snake.h #include using namespace std; int main() csnake s(20); s.initinstance(); /s.showgame(); int nodead; do s.showgame(); nodead=s.updatagame(); while (nodead); system(pause); return 0; snack.cpp#include #include #include #include snake.h using namespace std; /测试成功 void csnake:initinstance() snakemap.resize(line); / snakemap竖坐标横坐标 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()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(); couttotal 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 (snakemaplr=); 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,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.rsign+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(); /更新蛇头 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.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); snack.h#include #include using n

温馨提示

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

评论

0/150

提交评论