C++课程设计——贪吃蛇.doc_第1页
C++课程设计——贪吃蛇.doc_第2页
C++课程设计——贪吃蛇.doc_第3页
C++课程设计——贪吃蛇.doc_第4页
C++课程设计——贪吃蛇.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

迷宫贪吃蛇用户签名: 开发成员: 开发时间: 2009年12月7日 目录0. 引言(3)1. 工作计划(3)1.1 主要任务阶段划分(3)1.2 工作任务分工(3)2. 需求分析(4)2.1 概述(4)2.2 用户分析(4)2.3 约束条件(4)2.4 功能需求(4)2.5 用户界面需求(5)3. 设计与实现 (5)3.1 概述 (5)3.2 详细设计(5)3.2.1类的抽象与设计(5)3.3 主要程序文件(6)3.4开发环境以及部署环境要求 (8)3.5主要源码 (8)4. 测试(12)4.1 概述(12)4.2 测试环境(12)4.3 测试计划(12)4.4测试项目及结果 (12)5. 工作总结(13)5.1 工作成果(13)5.2 过程分析(13)5.3 经验教训及其分析(13)0引言由于传统的贪吃蛇只是在一个宽阔的用户区进行游戏。对于蛇只是在区域四周有障碍墙壁,这样也许在一开始不会有太大的难度和成就感。又由于人们曾经也钟爱一种迷宫游戏,它主要是考察玩家的观察力,看能否在最短的时间里走出迷宫。基于以上两个游戏,我们准备利用本学期学到的windows界面程序设计方法将两个游戏有机结合起来,使用户既能体验贪吃蛇中看着蛇身不断加长而绕出各种折线的成就感,又能感受到在迷宫中找寻出路的紧张心情,而且迷宫的出现使蛇遇到的障碍遍布游戏区,这样用户就更能展示一下自己操作的高水平。1 工作计划1.1主要工作阶段划分项目名称时间安排需求分析2009.12.72009.12.8设计与实现2009.12.82009.12.10测试与维护2009.12.102009.12.121.2工作任务分工阶段名称任务名称任务描述负责人协助人 需求分析现有游戏的分析对现有的贪吃蛇游戏进行分析趣味性分析对游戏的趣味性、休闲性分析功能需求对游戏的功能、方式进行分析设计与实现系统结构设计游戏的功能、结构分析界面设计用户与游戏交互的设计编码实现具体的编程实现测试与维护功能测试对游戏的功能进行测试性能测试对游戏的性能进行测试2需求分析2.1概述本人进行了对现有游戏代码的分析,借鉴了其中的部分实现思想,进而在组内进行讨论,根据我们的需求参与了程序中两个主要类的设计及类中接口的功能定义。并实现了CTable类的代码;实现了对游戏界面框架的部分搭建,诸如对话框的实现等均有本人根据自己的现有知识,再加上网上查些信息、查看MSDN进行编写,而实现的接口则预留出来等待后期的具体核心代码来调用;对游戏进行了测试,发现了问题并通过老师的帮助进行了解决。2.2用户分析1.该游戏至少支持贪吃蛇的基本玩法,创新可以有,但贪吃蛇游戏的经典玩法是不能少的;2.该游戏对键盘输入要有较快的反应速度;3.该游戏界面要漂亮一些;4.该游戏要支持速度选择;5.该游戏运行要比较稳定。2.3 约束条件1.该游戏比较简单,要求在一周进行进行完从分析到设计到编码再到测试;2.提交游戏要有相应的文档。2.4功能需求1.贪吃蛇的基本玩法:即可以用上、下、左、右键控制游戏区蛇的运动方向,使之向着食物方向运动,并吞吃食物使身体增长;2.调节蛇的运动速度:即用户可以调节蛇的运动速度来选择不同的难度;3.选择关卡功能:即游戏分多个难度级别(关卡),用户可以选择不同的难度级别进行游戏;4.背景颜色变换功能:即用户可以选择一种自己喜欢的颜色作为游戏区的背景色,避免对一种颜色产生视觉疲劳。2.5用户界面需求1.选择速度和关卡最好不用人手工输入,只是用鼠标点一点2.界面的有些东西最好可变,不要总是一种界面,让用户自己选择也可以。3设计与实现3.1概述1.界面的设计只是体力活和个人审美的问题,没有什么深奥的问题。虽说本游戏比较简单,但也是有其核心思想的。2.本游戏的核心代码即处理蛇的运动吃食的思路是:把游戏区纵横分成许多小方格,每一个小方格的属性可以是蛇身、食物、空白、墙壁几个属性之一。蛇运动时用一个数组结构记录蛇的各个蛇身所处的小方格坐标,通过对坐标的处理使蛇的位置不断变化,反应在游戏区中即蛇在不断运动。3.2详细设计3.2.1类的抽象及设计基于需求的分析,该游戏主要由两个类构成:蛇类用于处理蛇的运动等操作;桌子类用于对桌面上的墙、蛇、食物进行控制。class CSnakeprivate:int m_length; /蛇的长度SPoint* m_pOldPos; /移动前的位置SPoint* m_pNewPos; /移动后的位置MoveState m_oldHeadDir; /蛇头旧的运动方向MoveState m_newHeadDir; /蛇头新的运动方向bool m_bSnakeDied; /蛇是否还存活int m_oldLength; /蛇的上一状态长度public:Object Move(); /蛇的运动函数void ChangeDirect(MoveState Direction); /改变蛇的运动方向int GetLength(); /得到蛇当前长度SPoint* GetOldPos(); /得到蛇上一状态坐标数组SPoint* GetNewPos(); /得到蛇新状态坐标数组MoveState GetHeadDir(); /得到蛇头方向void SetDied(bool died); /设置蛇的生死void InitSnake(); /初始化蛇int GetOldLength(); /得到蛇上一状态长度void IsAddBody(); /判断是否增加蛇身长度CSnake(); /构造函数CSnake(); /析构函数;class CTableprivate:int m_width; /桌子宽int m_height; /桌子高CSnake m_snake; /桌子上的蛇int* m_board; /桌子各位块状态public:CTable(); /构造函数CTable(); /析构函数void InitTable(); /初始化桌子bool AddFood(); /随机增加食物bool Clear(); /清除桌子 void SnakeMove(); /蛇移动void ChangeSnakeDir(MoveState dir); /改变蛇运动方向bool IsSnakeDied(); /判断蛇是否死亡void SnakeDied(HWND hwnd); /蛇死亡CSnake* GetSnake(); /得到蛇坐标数组int* GetBoard(); /得到桌子数组;3.3 主要程序文件头文件有Map.h,其中只是保存游戏区二维数组中各个位置的属性信息,如果要更改地图布局,只需更改数组中的数字即可,数字的含义在全局变量中都有定义:enum ObjectEMPTY, FOOD, WALL, SNAKE; /标识物体头文件SnakeGame.h中主要定义了来两个主要的类CSnake、CTable;实现文件SnakeGame.cpp中对了类中定义的函数以及一些全局的处理函数进行了实现。主要类只有两个,即CSnake类和CTable类,其全部成员变量即成员函数已在上面一一列举,在这里针对一些主要的数据结构和处理方法进行说明:struct SPointint x;int y; /蛇的一个结点的坐标位置结构,该类型变量用于记录蛇的一节身体在一个二维数组中的下标值,即蛇身在桌子上的格子的横向和纵向的位置class CSnakeprivate:SPoint* m_pOldPos; /移动前的位置,该变量为一个数组的指针,数组在蛇的初始化函数中/分配SPoint* m_pNewPos; /移动后的位置,同上。这两个变量是用于在更新蛇的坐标时将用旧的 /蛇身坐标来计算新的蛇身坐标用的MoveState m_oldHeadDir; /蛇头旧的运动方向MoveState m_newHeadDir; /蛇头新的运动方向,这两个变量的作用是用于判断新的蛇头运动方 /向是否与旧的运动方向相反的,相反是不允许的public:Object Move(); /蛇的运动函数 /*说明:该函数用于在定时器到达时对蛇的身体各段进行变化处理,处理过程为将未更新前蛇的各点坐标保存在旧态中,根据移动方向改变蛇头坐标值,然后判断新的蛇头所在方格的属性并返回给CTable类处理*/void ChangeDirect(MoveState Direction); /改变蛇的运动方向 /*说明:根据传进来的方向值改变蛇头方向,但不能跟当前蛇头方向相反*/void InitSnake(); /初始化蛇 /*说明:用于在游戏中再次初始化蛇,只需设置蛇的初始两个身体坐标,初始运动方向,设置游戏开始即可*/void IsAddBody(); /判断是否增加蛇身长度 /*说明:用于在分配给蛇身坐标数组填充满时再一次性多分配若干个长度的空间*/;class CTableprivate:int* m_board; /桌子各位块状态,这是一个二维数组,其中用于填充桌子各方格的属性public:void InitTable(); /初始化桌子,针对不同的游戏难度级别从Map.h中调入不同的地图bool AddFood(); /在桌子上空白区域随机增加一个食物bool Clear(); /清除桌子上除了墙以外的其他方格的属性 void SnakeMove(); /蛇移动,只要调用CSnake的相应函数就可以了,根据返回的蛇头位置属性 /信息对蛇的坐标进行变换;3.4开发环境以及部署环境要求 开发环境:VS2008,WindowsXP SP33.5 主要源码Object CSnake:Move() /处理蛇运动的方法m_oldLength = m_length; /未更新前的长度成为旧值for (int i = 0; i m_length; i +)m_pOldPosi.x = m_pNewPosi.x;m_pOldPosi.y = m_pNewPosi.y; /将未更新前蛇的各点坐标保存在旧态中switch(m_newHeadDir) /蛇头当前要移动的方向,根据移动方向改变蛇头坐标值 case S_UP:m_pNewPos0.y -; break;case S_DOWN:m_pNewPos0.y +;break;case S_LEFT:m_pNewPos0.x +;break;case S_RIGHT:m_pNewPos0.x -;break;int m = m_pNewPos0.x;int n = m_pNewPos0.y;int iObject = GetData(m, n); /判断蛇头移动后到什么地方switch(iObject)case EMPTY: /蛇头所在位置为空,则蛇顺利移动for (int i = 1; i m_length; i +)m_pNewPosi.x = m_pOldPosi - 1.x;m_pNewPosi.y = m_pOldPosi - 1.y; /从旧态复制相应坐标到新态 return EMPTY;break;case FOOD: /蛇头所在位置有食物IsAddBody(); /判断是否需要增加蛇最大长度m_length +; /蛇长度加for (int i = 1; i m_length; i +)m_pNewPosi.x = m_pOldPosi - 1.x;m_pNewPosi.y = m_pOldPosi - 1.y;return FOOD;break;case WALL: /撞墙就挂了m_bSnakeDied = true;return WALL;break;case SNAKE: /自残也得死m_bSnakeDied = true;return SNAKE;break;return EMPTY; /这个其实不会被执行,但不写编译时总提示,反正写了也不费事void CTable:SnakeMove() /CTable中对蛇运动的处理for (int x = 2; x 28; x +)for (int y = 2; y 43; y +)if (m_boardxy = FOOD) continue;if (m_boardxy = SNAKE)continue;if (m_boardxy = EMPTY)continue;if (m_boardxy = WALL)continue; m_boardxy = EMPTY; /蛇移动先把旧的蛇清理掉int i = m_snake.GetLength() - 1;int m = (m_snake.GetNewPos()i.x;int n = (m_snake.GetNewPos()i.y;m_boardnm = EMPTY;if (+ iFirst = 0) /如果是第一次启动则自动先加个食物,以后吃掉才加 AddFood();Object HeadObject = m_snake.Move(); /蛇要动了switch(HeadObject) /根据返回的蛇头状态相应摆放桌子上的东西case EMPTY: /空的就没有什么可摆的了int x = (m_snake.GetNewPos()0.x;int y = (m_snake.GetNewPos()0.y;m_boardyx = SNAKE;break;case FOOD: /吃了食物要再给加的int x = (m_snake.GetNewPos()0.x;int y = (m_snake.GetNewPos()0.y;m_boardyx = SNAKE;AddFood();break;case WALL:case SNAKE: /这两种就没的说了,只能死了m_snake.SetDied(true);bGameOver = true;bGameBegin = false; SnakeDied(hwndonly);m_snake.InitSnake(); /这是为下一次重新玩作准备Clear();return;break;for (int i = 1; i m_snake.GetLength(); i +)int m = (m_snake.GetNewPos()i.x;int n = (m_snake.GetNewPos()i.y;m_boardnm = SNAKE; /该有蛇的地方放好void CSnake:IsAddBody() /增加蛇身的代码if (m_length % 100) = 0)SPoint* temp1;temp1 = new SPointm_length + 100;for (int i = 0; i m_length; i +)temp1i.x = m_pNewPosi.x;temp1i.y = m_pNewPosi.y;delete m_pNewPos;m_pNewPos = temp1;SPoint* temp2;temp2 = new SPointm_length + 100;for (int i = 0; i m_length; i +)temp2i.x = m_pOldPosi.x;temp2i.y = m_pOldPosi.y;delete m_pOldPos;m_pOldPos = temp2;else return;4 测试4.1概述1.测试速度选择菜单是否可以正常使用并对游戏效果产生需求所要求的影响;2.测试背景色选择菜单是否可以正常使用并对游戏效果产生需求所要求的影响;3.测试难度级别菜单是否可以正常使用并对游戏效果产生需求所要求的影响;4.测试游戏是否可以正常操作5.测试游戏是否有较好的响应速度。4.2 测试环境 个人笔记本电脑一台,windowsXP操作系统;1G内存。4.3测试计划1.对基本的菜单功能进行测试:点击相应菜单,看是否能够进行正确的响应并对游戏进行了预期的设置;2.对对话框的测试,打开对话框,对对话框内的控件进行点击测试,看是否能够正确响应并对游戏进行预期的设置;3.对游戏控制键的测试:开始游戏,用键盘对游戏进行控制测试,看游戏是否及时正确处理键盘输入事件;4.对游戏整体测试:进行每一关的游戏测试,看是否能正确进入相应关卡并正确运行,看违反游戏规则时游戏是否会结束;5.对游戏占用内存的测试:运行游戏,看游戏占用的内存资源是否处于一个稳定的范围内,以此测试游戏是否有申请内存没有释放的问题。4.4测试项目及结果测试

温馨提示

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

评论

0/150

提交评论