本科毕业设计论文--贪吃蛇游戏的实现.doc

上传人:红**** 文档编号:91481611 上传时间:2023-05-27 格式:DOC 页数:17 大小:284.50KB
返回 下载 相关 举报
本科毕业设计论文--贪吃蛇游戏的实现.doc_第1页
第1页 / 共17页
本科毕业设计论文--贪吃蛇游戏的实现.doc_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《本科毕业设计论文--贪吃蛇游戏的实现.doc》由会员分享,可在线阅读,更多相关《本科毕业设计论文--贪吃蛇游戏的实现.doc(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、面向对象程序设计课程设计设计名称 贪吃蛇游戏的实现 姓 名 蒋 欢 指导教师 张 静 班 级 15级信息管理与信息系统 2016年06月18日目 录第一章 引言11.1研究背景11.1.1背景内容11.2研究方案1第二章 概述12.1程序流程图1第三章 设计的具体实现23.1 InitInstance函数23.2UpdataGame函数33.3 main函数33.4 Csnake函数33.5 getSymbol函数43.6 isDead函数4第四章 调试及解决方法4第五章 测试结果5第六章 设计新的体会7致 谢8参考文献8附 录9第一章 引言1.1研究背景贪吃蛇是家喻户晓的益智类小游戏,选择这

2、个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的 C+语言程序设计。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力,因此我选定了这个题目。1.1.1背景内容贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体

3、游戏结束 C语言附 录 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 st

4、d; /测试成功 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();

5、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

6、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;/竖坐标 /如果随机产生的坐标不是蛇身,则可行

7、 /否则重新产生坐标 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.r

8、Sign!=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(firstSig

9、n.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();

10、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; sna

11、keMapnextSign.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; c

12、outendl; Sleep(1); system(cls); snack.h #include #include using 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; C

13、mp 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; /初始蛇身长度 class Csnake Cmp firstSign; /蛇头坐标 Cmp secondSign;/蛇颈坐标 Cmp lastSign; /蛇尾坐标 Cmp nextSign; /预备蛇头 int row; /列数 int line; /行

14、数 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

15、(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.2研究方案 这个程序的关键是表示蛇的图形以及蛇的移动。用一个小表示蛇的一节身体,身体每长一节,增加一个。移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向右前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节

16、身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,在界面中央有个静止不动的食物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加十分,界面开始更新,蛇的身体增加一节,食物的位置变化一次,当蛇碰到界面时,游戏自动结束,显示用户最后的分数。第二章 概述2.1程序流程图图1所示:开始初始化界面和蛇身放置食物蛇开始运动蛇吃到食?蛇长大蛇死亡?继续?退出界面NNYNY游戏者按键选择Y图1 程序流程图第三章 设计的具体实现3.1 InitInstance函数函数原型:void Csnake:InitInstance()。 功能:初始化游戏界

17、面,初始化蛇身,将方向上下左右分别用4个键表示。 参数:无。 返回值:无。 工作方式:根据命令,调用相应函数,建立内存链表,将蛇身坐标压入队列,并将蛇身作为一个数组。要求:完成初始化,界面中给出蛇的相关信息3.2UpdataGame函数函数原型:bool Csnake:UpdataGame()。 功能:获取用户按键信息,产生食物,并随机产生食物的相关坐标,判断在蛇没有死亡的状态下是否碰到食物,如果碰到则加10分,蛇身增长一节,返回值定为true,如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),返回值定为false,并且输出用户之前所得的分数。 参数:蛇的横坐标r,蛇的列坐标l,记

18、录用户成绩score,获取用户按键信息chioce。 返回值:true或者是false。 工作方式:获取用户输入按键信息,并且根据用户输入按键信息作为关键字,进行判断。 要求:自动使蛇开始运动,并且及时获取用户的按键信息,随时判断是否在移动过程中碰到墙壁或者身体交叉,给出结束信息。3.3 main函数函数原型:int main() 功能:程序的入口点,总控函数。 参数:没有死亡的信息noDead。 返回值:0。 工作要求:依次调用初始化界面的成员函数,更新游戏界面的成员函数,显示游戏界面的 成员函数。要求:调用程序信息。3.4 Csnake函数函数原型:Csnake(int n)功能:初始化游

19、戏界面大小。参数:int n。返回值:无。3.5 getSymbol函数函数原型:char getSymbol(const Cmp& c)const。功能:获取指定坐标点上的字符。 参数: Cmp& c。 返回值:snakeMapc.lSignc.rSign。3.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。 工作要求:判断

20、条件,从而决定返回值。第四章 调试及解决方法此程序的在调试过程中曾先后出现蛇不吃仔等问题,比如: 问题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.nod

21、esi.x=food.position.x&snake.nodesi.y=food.position.y)goto label; 第五章 测试结果图2 程序开始,初始化界面,调用函数自动生成蛇和食物之后,蛇自动向右走图3图4图5通过方向键来控制蛇的走向图6游戏结束输出最终成绩第六章 设计新的体会在设计这个程序中我主要学会了如何运用以下有关C语言和C+的知识。1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。2)分析函数先从main()函数入手。Main()函数是C+源程序编译时的开始, 从ma

22、in()函数开始读函数可将其他函数的功能理解得更透彻。3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,其功能我都有所了解。5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。6)通过这次的C+程序课程设计,熟练地掌握C+语言的知识点,熟悉当前常用的软件开发环境(Visual C+),解决实际问题的能力的强化训练,正确理解掌握C+面向对象程序设计的基本特性:类、对象、继承与派生、多态、虚函数、模板、流类库等。但因为时间关系,只能把这次作为基点,有待改进,以后编程的话就不会产生恐惧心理,平时编程太少了。尤其是更熟悉文件的操作了,对C+语言也更熟悉了,也能够自己改程序中的错误,真的让我体会到编程是痛并快乐着。致 谢 感谢张老师一学期的教导,让我在C+面向对象程序设计这门课程中学到很多东西,为我以后的专业课打下很好的基础,希望今后的学习中继续激励我进步,在此谨向张老师致以诚挚的谢意和崇高的敬意。参考文献15

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com