1、辽 宁 工 业 大 学 软件实践设计报告题目: 手机游戏贪吃蛇 院(系): 电子与信息工程学院 专业班级: 计算机 081 学 号: 学生姓名: 指导教师: 教师职称: 起止时间: 2011.7.4-2011.7.15软件实践任务及评语院(系):电子与信息工程学院 教研室:软件工程学 号 3 学生姓名 专业班级 计算机 081软件实践题 目 手机游戏贪吃蛇设计与实现软 件 实 践 任 务1.实现实现手机游戏贪吃蛇,要求具有吃食物,计分,图形界面等功能2.采用工程化思想进行设计:需求分析;总体设计;详细设计;实现3.最终结果要求经过测试与发布指导教师评语及成绩成绩: 指导教师签字: 年 月 日目
2、 录第 1 章 绪论 .11.1 背景分析 .11.2 设计的意义 .11.3 设计目标及结论 .2第 2 章 需求分析 .32.1 综合介绍 .32.2 数据流图 .3第 3 章 系统设计 .53.1 功能结构 .53.2 设计思路 .63.3 数据结构设计及用法说明 .63.4 各模块的功能及程序说明 11第 4 章 详细设计与实现 .12第 5 章 程序源代码及注释 .14第 6 章 课程设计总结 .17参考文献 .18辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)1第 1 章 绪论1.1 背景分析“贪吃蛇”是一个产生于 1970 年代中后期的计算机游戏,也叫贪吃蛇。该游戏
3、在于 1990 年代一些手机将其引入而一时间再度流行起来。在游戏中,玩家操控一条细长的蛇爬行于一个带边界的平面之上,一路拾起碰到之事物或其他类似的物件,并要避免触到自身或者包围着游戏区的“墙” 。每次贪吃蛇吃到一件食物,它的身体便增长一些,这让游戏的难度逐渐变大。操控贪吃蛇时,玩家操控贪吃蛇头部的朝向(向上、向下、向左或向右)控制贪吃蛇的进行方向,贪吃蛇的身体将跟着其头部移动。另外,玩家不可在游戏中途停止贪吃蛇的进行。随着贪吃蛇的成功移植到手机系统,贪吃蛇的操作按键要求与手机按键的完美匹配,使贪吃蛇游戏风靡起来。随着科技的发展,现在手机的功能已不仅仅是简单的打接电话、收发短信了,更多的手机用户
4、希望在工作、学习之余通过方便灵巧可随身携带的仪器休闲娱乐。因此,为了迎合众多用户的需求并适应手机的规模,我们开发出一套适合各阶层人士的具有很强的娱乐和交互性的贪吃蛇小游戏。1.2 设计的意义贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇的设计比较复杂,它涉及的面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用 c 语言的图形库函数。因此,在设计开发过程中,要对c 语言的图形库函数有一定的了解,利用图形库函数实现一些功能。辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)2贪吃蛇
5、之所以取这样的名字,其用意还是很明显的,贪吃蛇其实并不贪,它是人不断地追求的象征,就像现代的人只有不断努力向前才能得到自己想要的。而食物也是随机出现的,就像现在社会存在的机会,而我们只有找好自己的目标才能成功。虽然现在市面上存在各种各样的游戏版本,可是贪吃蛇市场还是相当的大。因为它的特殊在于吸引人更深入,爱不释手。随着游戏速度不断加快,其刺激也更强。可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机。都能很快顺利的运行。对于在外忙碌的人,不可能花费大量的时间在娱乐上,大型游戏是行不通的。这样的小游戏刚好迎合他们的需求。1.3 设计目标及结论 在如今的社会,人们的工作学习压力逐渐增大,
6、生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的手机游戏,可以让我们随时随地都能享受游戏,让我们从繁重的日常生活中解脱出来。游戏的主界面应该力求美观,爽心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)3第 2 章 需求分析2.1 综合介绍1. 系统功能介绍:贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记 10 分,接着又出现食物,等待蛇来吃,
7、如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。2. 整体设计说明:一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的) 。2.2 数据流图手机游戏贪吃蛇顶层数据流程图:游戏开始 游戏运行 计分 游戏结束图 2.1 手机游戏贪吃蛇流程图贪吃蛇的业务流程图:辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)4是否是是是否否否否游戏开始碰壁碰到自己蛇吃到食物身体增加,分数增加玩家没有按退出键游戏结束初始化界面产生食物方向按键蛇正常移动蛇行进方向为按下的方向图 2.2 贪吃蛇的业务流程图辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)5第 3 章
8、 系统设计3.1 功能结构经过可行性分析、需求分析,对系统要求已经十分明确,下一步进行到总体设计阶段。总体设计过程首先寻找实现目标系统的各种不同的方案;需求分析阶段得到的数据流图是设想各种可能方案的基础。然后从这些供选方案中选取合理的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本/效益分析,并且制定实现这个方案的进度计划。应该综合分析比较这些合理的方案,从中选出一个最佳方案设计软件结构,通常,设计出初步的软件结构后还要进行多方面的改进,从而得到更合理的结构,确定测试要求并且制定测试计划。为这个最佳方案设计软件结构。总体设计的原则:1. 全
9、面性:考虑到软件的可行性,要对游戏的功能全面的考虑。2. 规范性:本系统遵循一般软件设计思想进行设计。3. 科学性:既要有现代化的先进技术,又要考虑到今后的发展,留有可以扩充的空间又慎重选择成熟的技术。4. 实用性:根据实际情况,考虑用户的需求,设计友好且易于操作的界面。辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)63.2 设计思路这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方
10、向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。3.3 数据结构设计及用法说明开始部分:游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些
11、重 要变量的初始化。运行部分:作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:首先在界面上画上围墙,蛇必须在界面内移动,当蛇超过界面的时候就意味着蛇的生命结束了,游戏也就结束了。在界面中随机产生食物,我们可以通过键盘来控制蛇的移动方向,当蛇到达食物的时候就会将食物吃掉,其身体的长度就会加一,此时界面上又会出现食物,这样蛇在不断的移动吃食物的时候身体的长度会不断的增加,当蛇头和蛇身体的任何一部位相撞辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)7的时候蛇的生命也就结束了。第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是
12、撞到自己或墙壁;由第四步起游戏有两条支线(A 、B ):A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;B:第四步,蛇碰到自己或墙壁,终止游戏。结束部分:游戏结束时,显示“游戏结束”四个中文汉字,这四个汉字是采用中文点阵,首先算出这四个字的偏移量,然后通过偏移量在汉字库 HZK16 中将其提取出来,然后在屏幕上显示。另外在游戏结束的时候,还将本次游戏的最终分数显示出来。通过对上述整个软件的分析,我把可
13、以整个程序划分成若干个个模块(其实就是函数) 。本程序可分为以下几个模块:食物 Food() ,围墙 wall() ,中文点阵hanzi16() ,游戏开始 Game_start() ,游戏结束 Gameover() ,主程序通过调用这些子函数来实现其功能。以下是程序的模块流程图。程序结构:辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)8nonoyesnoyesyesStartWall()Food()While(1)kbhit()snakemoveLife=0eatfoodhanzi16()Gameover()endFood()图 3.1 程序结构图辽 宁 工 业 大 学 课 程
14、 设 计 说 明 书(论 文)9依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。语言中数据结构集中体现在数据类型上,因此在进行语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:蛇:基本描述:长度,颜色,位置。对应数据与数据类型:长度虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位节数,以固定长度的每节描述;坐标-整型;颜色- 整型; 位置- ,坐标。增加的描述:蛇运动的方向,蛇的生
15、命。对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应 0 或 1。食物: 基本描述:颜色,位置。对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置X 、Y坐标。增加的描述:食物的存在。对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0 或 1(没有食物或有食物)其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。辽 宁 工 业 大 学 课
16、程 设 计 说 明 书(论 文)10还需要的变量:键盘键入的键值(作为全局变量,整型) ;经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度。4 向右3 向左2 向下1 向上yesnoi=蛇的节数-1i0第 i 节的 x 坐标=第 i-1 节的 x 坐标第 i 节的 y 坐标=第 i-1 节的 y 坐标i-Direction 蛇的方向第 0节的y 坐标减 10第 0节的y 坐标加 10第 0节的x 坐标减 10第 0节的x 坐标加 10图 3.2 蛇的不停运动的关键算法的流程图辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)113.4 各模块的功能及
17、程序说明关键所在蛇不停移动的:蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有 i+1 节,由 0 到 i 节,第 i 节的坐标取第 i-1 节的坐标,第 i-1 节的坐标取第 i-2 节的坐标直到第 1 节取第 0 节的坐标。而第 0 节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。 在该程序中函数 Game_start()是整个程序的重点,蛇的移动,吃食物,产生食物,蛇的死亡等都是在这个程序中进行控制的,在这个程序
18、中调用食物Food() ,围墙 wall() ,游戏开始 Game_start() ,游戏结束 Gameover()等函数来实现其各部分的功能。辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)12第 4 章 详细设计与实现游戏开始的时候蛇在界面自由移动,其运行的结果如图所示:当蛇吃到食物的时候身体长度增加:辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)13当蛇头碰到身体任何一部位的时候游戏结束:游戏结束时显示“游戏结束”:辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)14第 5 章 程序源代码及注释#include #include #define ES
19、C 0x011b#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define N 100struct food /*食物结构体*/int x;int y;int m;food;struct snake /*蛇的结构体*/int xN;int yN;snake;void Game_start()int i,key;int life,num,direction;num=2;life=1;direction=2;辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)15snake.x0=11
20、0;snake.y0=100;snake.x1=100;snake.y1=100;randomize();Food();while(1)while(!kbhit()for(i=num-1;i0;i-) /*蛇的每一节都跟着它前一节移动*/snake.xi=snake.xi-1;snake.yi=snake.yi-1;switch(direction)case 1:snake.y0-=10;break; /*上方*/case 2:snake.y0+=10;break; /*下方*/case 3:snake.x0-=10;break; /*左方*/case 4:snake.x0+=10;break
21、; /*右方*/if(snake.x0600|snake.y0400) /*判断蛇是否超过围墙范围*/Gameover();life=0;break;for(i=3;inum;i+) /*判断蛇头是否和蛇的任意一节相连*/if(snake.xi=snake.x0Gameover();life=0;break;辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)16if(life=0) break;if(snake.x0=food.xFood();num+;for(i=0;inum;i+)setcolor(7);rectangle(snake.xi,snake.yi,snake.xi+1
22、0,snake.yi-10);delay(500000);setcolor(YELLOW);rectangle(food.x,food.y,food.x+10,food.y-10);setcolor(0);rectangle(snake.xnum-1,snake.ynum-1,snake.xnum-1+10,snake.ynum-1-10);key=bioskey(0);if(key=ESC) break;else if(key=UPelse if(key=DOWNelse if(key=LEFTelse if(key=RIGHTvoid main()int gdriver=DETECT, g
23、mode;registerbgidriver(EGAVGA_driver);辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)17initgraph(wall();Food();Game_start();getch();第 6 章 课程设计总结通过这次课程设计,我对以前所学的 C 语言程序设计有了一个更深刻的了解,将所学的知识应用于实践,由于所学的只是有限,为了使游戏能够实现自己预先的构想,我又在网上查找了关于 c 语言图形库函数的使用,通过调用图形库函数,绘制出图形界面达到预期所要实现的目标,完成课程设计后,可以感觉到自己对C 语言程序设计又有了新的认识,可以学到很多书本上没有的东
24、西,这是这次课程设计最大的收获。这次课程设计我还了解到了开发一个软件所需的步骤,一个软件的开发需要经过可行性研究,需求分析,系统设计,编码的单元测试,调试等功能,在软件开发的每一个阶段都有它的关键之处,它们都为后面软件的开发设计打下了基础,其中的任何一个环节出错都将导致软件开发失败,它们是相辅相成的。在此次的课程设计中我学到了很多书本上没有学到的东西,通过此次课程设计使我更加的明白了,分析问题比解决问题更重要,把问题分析好了以后就按照自己的思路一步一步的来实现,这样可以锻炼自己的逻辑思维能力,对以后分析问题有很大的帮助。通过短短一周的课程设计使我受益匪浅,理论结合实际,这样可以锻炼自己分析问题
25、解决问题的能力。辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)18辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)19参考文献1 谭浩强C 程序设计题解与上机指导1998 年版北京:清华大学出版社,19922 廖雷C 语言程序设计第 2 版北京:高等教育出版社,20063 贾学斌,宋海民C 语言程序设计06 年版北京:中国铁道出版社,20074 赵海廷C 语言程序设计05 年版北京:人民邮电出版社,20055 何光明,杨静宇C 语言程序设计与应用开发06 年版北京:清华大学出版社,20066张强华. C 语言程序设计.2001 年版.北京. 人民邮电出版社.2001.
26、7徐新华. C 语言程序设计教程.1999 年版.北京. 清华大学出版社.1999.8谭浩强. C 语言程序设计.1999 年版.北京. 清华大学出版社.1999.9徐建民. C 语言程序设计.2002 年版.北京. 电子工业出版社.2002.10李大友. C 语言程序设计.1999 年版. 北京. 清华大学出版社.1999.11毕万新. C 语言程序设计.2005 年版.大连. 大连理工大学出版社.2005.12刘 燕. C 语言程序设计.2008 年版.北京. 中国铁道出版社.2008.13廖 雷. C 语言程序设计.2006 年版.北京. 高等教育出版社.2006.14方少卿. C 语言程序设计. 2007 年版.北京. 中国铁道出版社.2007.15 谭浩强. C 语言程序设计. (第二版).北京.清华大学出版社.2007.16 吴文虎. 程序设计基础.2003 年版.北京. 清华大学出版社.2003.17 钱启平. C 语言程序设计基础. 2000 年版.北京. 铁道出版社.2000.