已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 设 计 报 告 课程名称:面向对象程序设计C+ 设计题目: 贪吃蛇 专 业:计算机科学与技术 姓 名: 学 号: 指导教师: 李 晓 虹 2016 年 1 月 6 日1. 系统需求分析1.1选题背景贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。1.2关于编译软件本程序采用Microsoft Visual C 6.0的英文版本进行编译。VisualC 6.0是Microsoft公司推出的基于Windows操作系统的可视化C 编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C 规范,但仍有相当多的编程人员使用VisualC 6.0进行应用系统的开发。1.3关于兼容性本程序经过调试,可以在XP系统下编译运行,也可以在Vista下运行,界面稍有不同,但不影响运行结果。2. 总体设计 界面简单明了,有游戏和帮助两个菜单条,游戏菜单条可以控制游戏的开始停止。右方可以显示你所得的分数,还有相应的提示按键。上方用w,下方用s键,作坊用A键,右方用D键,空格表示暂停与开始。2.1 贪吃蛇游戏详细设计开发 2.1.1 贪吃蛇游戏的可行性分析 在进行编写贪吃蛇游戏之前,所做的必须是可行性分析,因为一旦进行贪吃蛇游戏项目的开发,就必须保证在规定的时间内能够独立的完整整个程序的所有功能,而且必须是最优的,因此,在开发贪吃蛇游戏之前,必须要做的是可行性分析。通过查找相关文档和技术支持,熟悉了C+语言的开发技巧,通过以下几个方面,进行可行性分析: 1.参考文献 :贪吃蛇游戏用户描述文档、软件工程等书,确定 能够在能力范围内开发出这个贪吃蛇游戏项目。2. 功能要求:在进行整个项目开发之前,要做的就是确定贪吃蛇游戏的主要功能,必须明确贪吃蛇游戏的功能,因为要进行游戏功能可行性分析,经过查阅相关资料,确定了贪吃蛇游戏的具体功能,详见后续部分详细设计。 3. 性能需求:必须保证开发的贪吃蛇游戏能够整体尽可能做到高效 快速,不占用大量的使用资源,因为做的是一个嵌入式的游戏开发项目,必须要考虑资源使用情况,要求尽可能少用资源,在有限的资源范围内实现最大的可利用价值。 4. 运行环境:visual c+ 6.0开发平台,模拟器上进行调试,经过安装软件,确定可以进行项目程序的编写。 5. 界面要求:采用Windows标准界面,只需要使用键盘和鼠标。6. 完成期限:两周完成整个系统,包括程序的编写,以及最终的调试,测试阶段 2.1.2贪吃蛇游戏的需求分析 编写目的:为了提高动手能力,完成evc大作业,参考了很多嵌入式方面的书籍以及对VC+语言的熟练程度,决定编写贪吃蛇游戏嵌入式项目。文档范围:文档包括了嵌入式技术领域的介绍,嵌入式国内外环境的探索与简介,主要从我国嵌入式领域发展的最新阶段来探讨,与国际对比得出相应发展的前景,同时,针对对嵌入式方面的兴趣爱好,以及所掌握的有限知识来对嵌入式方面的一些看法等,另外还有winCE环境的简介,以及用法,还有关于嵌入式基于winCE的开发流程的一些相关文档,还有EVC+4.0开发工具的使用方法的介绍,以及游戏的详细代码的功能简介等。 游戏具有以下功能:能够实现贪吃蛇自动前线移动,也就是贪吃蛇能够“活动”的外观效果,根据相同的时间间隔,每一次将贪吃蛇自身的蛇头向前移动一个小格子,同时蛇尾向前移动一个小格子,移动方向为贪吃蛇行走的方向。对游戏中规则进行判断,当游戏中的贪吃蛇遇到墙壁和自身时,根据规则判断应为死亡,宣告当前游戏结束,记录当前游戏的分数值。根据每次所得的分数值不同,判断玩家的能力。贪吃蛇的相关操作,根据鼠标点击标有上、下、左、右四个按钮来控制贪吃蛇游戏的前进方向,还有另外一个功能,那就是暂停游戏功能,这样玩家就可以根据暂停游戏来处理当前需要处理的事情,当游戏结束时,可以重新开始游戏的初始化界面。食物的出现,每次贪吃蛇吃到食物时,于此同时,应该出现一个食物在背景中,那么怎么实现这个功能呢?我采用的是随机函数出现食物的横纵坐标,然后判断这个店得坐标是不是在蛇身上,如果是那么就得重现出现上一个过程,直到食物的坐标不在蛇身上为止。这样就出现了食物。游戏分数的统计方法,当贪吃蛇吃到食物时,玩家的分数就应该随着吃到的食物而增加,增加的规则就是每次吃到食物分数就递增10分。 2.1.3 贪吃蛇游戏的实现的功能模块 在贪吃蛇游戏中,本论文设计的贪吃蛇游戏的大致可以分为五个功能模块,以下是对这五个模块的具体介绍: 游戏规则模块功能设计:游戏规则包括蛇的运动范围、蛇的生命周期问题、分数统计、关卡判断。其中蛇的运动范围是在一个已经划定的矩形中,蛇运动的地图抽象成为一个的二维整形数组,每个数组值代表一个小方块的坐标值,这样,蛇只能在规定好的二维数组内运动,当蛇遇到数组边界值时,宣告蛇生命周期结束,贪吃蛇死亡,这个是第一个规则;另外,当蛇自己吃到自己身体的某一部分时,也宣告游戏结束,在程序里通过循环判断蛇头下一个前进方向的节点是不是蛇身上的某一部分节点即可,如果是那么蛇死亡,否则继续运行游戏。分数统计算法的思想是每次蛇吃到一个食物时,相加的分数为每次递增10分,这样可以随着游戏进行,分数值也随之增多。关卡功能设置通过与分数相关联而体现的,初始化游戏为初级模式,计时器的暂停间隔时间为300毫秒。当玩家选择中级模式时,暂停间隔时间为150毫秒。最后可以选择的一个是高级模式,这是暂停间隔时间为70毫秒。蛇前进速度相应地会根据暂停间隔时间而变快或慢,这样就实现了不同难度,不同速度的贪吃蛇,从而增加了游戏的乐趣性。 蛇身操作模块功能的设计: 首先得到当前点击按钮对应的移动方向,此时有两种情况需要考虑,如果遇到的是一个食物,则蛇身长度增加一个单位,表现在程序中是存放蛇身数组值增加一位,如果没遇到食物,则不断更新蛇身数组中的相应坐标值。 按键功能模块:游戏是通过点击按钮控制,其中可以选择点击窗体上的上下左右按钮控制游戏上、下、左、右键进而控制蛇头前进方向,可以点击菜单栏选项控制游戏的暂停开始以及游戏的分数统计显示,程序内部是通过消息响应函数实现。 主界面控制模块:贪吃蛇游戏的主界面是通过窗体初始化事件进行实现的,运用MFC类库中的FillSoldRect ()库函数通过程序内部的二维数组进行绘制地图,地图然后可以改变,这样在游戏运行后就会在窗体上显示游戏初始化的效果。 帮助模块:通过窗体的调用另外一个窗体显示游戏的开发作者及游戏的相关信息。 2.1.4 贪吃蛇游戏的主要功能设计思路初始化界面设计思路:Windows MFC在程序执行时,会动态的调用窗口资源,在程序自动生成函数中,添加相应的函数实现程序初始化界面,本程序的具体思路是:程序在开始执行时会调用BOOL CSnakeDlg:OnInitDialog()函数,进行窗体的初始化,我们在此窗体客户区求得窗体长和宽的值,记录在width和height 变量中,因为我们设计的游戏地图是一个小方格组成的矩形区域,因为我们在这需要求出小矩形的长度和高度,在这,根据width和height 等分为24部分,求出每个小矩形的边长存放在height 和width变量中,然后调用绘图函数void CSnakeDlg:MyDraw()进行地图的绘制,这样在程序执行时,就动态绘制了贪吃蛇游戏地图。 食物出现的设计思路:首先,食物时通过一个坐标记录下在地图上的位置,通过绘图函数绘制这点坐标的小矩形,程序中采用的是随机数生成食物出现的坐标。其次,程序中必须增加一个判断,判断当前生成的食物坐标是否在贪吃蛇身体范围内,如果当前生成的坐标在蛇身坐标范围内,那么必须重新随机产生食物坐标直到不在为止。如果坐标不在蛇身坐标范围内,则把坐标位置返回给调用对象。程序中本模块具体功能是在void InitFoods()函数中实现。具体代码参见程序主要代码说明。 更新蛇身的具体的设计思路:程序执行的步骤,首先接受玩家按下方向键消息,并把当前要前进的方向保存在方向变量snake_direct中,记录贪吃蛇下一个状态前进的方向,通过方向判断头节点下一个节点的坐标值。先判断下一个节点坐标值是不是符合游戏规则之内(也就是判断蛇是不是死亡)的坐标,此时调用IS_GameOver()函数判断游戏是否结束,如果结束宣告游戏结束,否则程序继续执行;如果下一个节点的坐标值与当前食物节点坐标值(snake_foods)相同,则调用void MyDraw()函数重绘蛇头和蛇尾节点颜色,因为此时蛇吃到一个食物,蛇身长度加一,动态的现实,将食物重绘为蛇身颜色(红色),蛇尾节点颜色不变,蛇身变量长度snake_body_length自加,动态记录当前蛇头节点snake_head和蛇尾节点snake_rear的坐标;如果下一个节点不是食物节点,重绘蛇头蛇尾颜色,蛇身长度不变,动态的蛇头和蛇尾节点坐标改变。 分数统计和改变游戏难度的设计思路:在本程序设计的贪吃蛇游戏中,分数统计采用的是如下公式进行的统计,贪吃蛇游戏分数 = (当前蛇身长度-初始贪吃蛇蛇身长度 )* 定制变量(本程序设置的是整形常量10),这样可以动态的根据蛇身长度不同,每次得到食物的分数也就随之不同,体现了游戏难度的差异; 按键响应功能的设置思路:贪吃蛇游戏的控制通过点击按钮来控制,通过点击按钮控制,其中可以选择点击窗体上的上下左右按钮控制游戏上、下、左、右键进而控制蛇头前进方向,可以点击菜单栏选项控制游戏的暂停开始以及游戏的分数统计显示,程序内部是通过消息响应函数实现,所以必须实现按钮响应功能,这些按键消息响应是通过函数BOOL CSnakeDlg:OnbuttonClick()来实现,从而实现相应功能。3. 系统调试3.1系统规则测试本程序制定的规则是贪吃蛇撞墙死亡,撞到自己身体任意一部分死亡。 按照预先设计应出现的结果是当蛇头下一个移动节点的位置是地图四周的墙壁时,或者是蛇自身的某一个位置节点时,应该显示出一个对话框,标志着蛇死亡。下面进行测试。 开始游戏,让蛇自身开始移动,首先让蛇头撞到地图周围的墙壁,观察结果是不是出现应该出现的结果。下图是我们运行程序后的结果截图,观察出现的结果如图3-1所示:图3-1通过上图我们可以发现,当贪吃蛇由于“贪吃”而不小心撞到了地图周围的墙壁上,出现了一个对话框,宣告程序游戏结束,玩家记录分数如上图所示。 3.2 暂停功能测试 当用户点击菜单栏中的暂停选项的时候,就可以去干别的事了,预期结果是可以停止当前贪吃蛇的活动,测试结果如图3-2: 图3-24. 结果分析 虽然界面过于简单,但是游戏的基本功能完全实现。游戏的暂停,开始,以及分数的计算,相关按键的控制。5. 总结程序的开发,体现了一个完整的过程,程序的编写直至最后程序调试运行带给自己带来了一个整体的指导,方便学习基于winCE嵌入式。然而,目前设计的基于嵌入式winCE贪吃蛇游戏还处于较原始的阶段,实现的功能还不够完善,但随着相关技术的成熟和软硬件平台的发展,完善相关的游戏功能,使之更加完善,界面更加可视化,这样相信可以把嵌入式学的越来越好。6. 系统截图截图:打开的页面,图6-1:图6-1点击游戏的页面,图6-2:图6-2点击帮助的页面,图6-3:图6-3游戏结束的界面,图6-4:图6-4计分的界面,图6-5:图6-5空格暂停的界面,图6-6:图6-67. 源代码主要代码:food类的带代码:/ snakeDlg.cpp : implementation file/#include stdafx.h#include snake.h#include snakeDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Abouttypedef struct SnakeNodeint x;int y;SnakeNode;typedef struct SnakeSnakeNode data100;int curr;Snake;typedef struct foodint x;int y;SnakeFood;Snake snake;SnakeFood food;int x, y;int direct;int nGameState;int score;int speed;int d; / 该变量用于控制蛇身不能后退void InitSnake(Snake *snake);void MoveSnake(Snake *snake);void AddSnake(Snake *snake);void DrawSnake(CDC *pDC , Snake snake);void UnDrawSnake(Snake snake);void DrawFood(CDC *pDC, SnakeFood f);int GameOver();void InitSnake(Snake *snake)int t;direct=0;nGameState=0;score=0;speed=200;d=0;snake-curr=2;x=4;y=4;snake-data0.x=x;snake-data0.y=y;food.x=rand()%20;food.y=rand()%30;switch(direct)case 0: x+=1;break; /右case 1: y+=1;break;case 2: x-=1;break;case 3: y-=1;break;snake-data1.x=x;snake-data1.y=y;t=snake-curr-1;while(t)if(snake-datat.x=food.x&snake-datat.y=food.y)food.x=rand()%20;t=snake-curr-1;food.y=rand()%31;t=snake-curr-1;t=snake-curr-1;t-;void DrawFood(CDC *pDC, SnakeFood f)CString ss;pDC-SetBkColor(RGB(210,215,210);ss.Format(得分:%d,score);pDC-TextOut(220,30,ss);pDC-Rectangle(f.x*10+11,f.y*10+11,f.x*10+18,f.y*10+18);void AddSnake(Snake *snake)int t=1,tx,ty,xx,yy;if(snake-currcurr+;xx=snake-data0.x;yy=snake-data0.y;dotx=snake-datat.x;ty=snake-datat.y;snake-datat.x=xx;snake-datat.y=yy;xx=tx;yy=ty;t+;while(tcurr);int GameOver()int t;if(x19|y30)return 1;t = snake.curr-2;while(t)if(snake.datat.x=x&snake.datat.y=y)return 1;t-;return 0;void MoveSnake(Snake *snake)int t, xx, yy;int tx, ty;switch(direct)case 0: x+=1;break; /右case 1: y+=1;break;case 2: x-=1;break;case 3: y-=1;break;if(GameOver()return ;xx=x;yy=y;if(xx=food.x&yy=food.y)t=snake-curr-1;food.y=rand()%31;food.x=rand()%20;while(t)if(snake-datat.x=food.x&snake-datat.y=food.y)food.y=rand()%31;food.x=rand()%20;t=snake-curr-1;t-;score+=1;if(score%10)=0)speed-=20;AddSnake(snake);t=snake-curr-1;dotx=snake-datat.x;ty=snake-datat.y;snake-datat.x=xx;snake-datat.y=yy;xx=tx;yy=ty;t-;while(t=0);void DrawSnake(CDC *pDC,Snake snake)int t;t=snake.curr-1;pDC-SelectStockObject(BLACK_BRUSH);pDC-SelectStockObject(BLACK_PEN);pDC-Rectangle(snake.datat.x*10+11,snake.datat.y*10+11,snake.datat.x*10+18,snake.datat.y*10+18);t-;pDC-SelectStockObject(HOLLOW_BRUSH);while(t=0)pDC-Rectangle(snake.datat.x*10+11,snake.datat.y*10+11,snake.datat.x*10+18,snake.datat.y*10+18);t-;void UnDrawSnake(CDC *pDC, Snake snake)pDC-Rectangle(10,10,210,320);class CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSnakeDlg dialogCSnakeDlg:CSnakeDlg(CWnd* pParent /*=NULL*/): CDialog(CSnakeDlg:IDD, pParent)/AFX_DATA_INIT(CSnakeDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CSnakeDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSnakeDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSnakeDlg, CDialog)/AFX_MSG_MAP(CSnakeDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(IDM_HELP_ABOUT, OnHelpAbout)ON_WM_TIMER()ON_COMMAND(IDM_GAME_START, OnGameStart)ON_WM_KEYDOWN()ON_COMMAND(IDM_GAME_PAUSE_START, OnGamePauseStart)ON_COMMAND(IDM_GAME_EXIT, OnGameExit)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSnakeDlg message handlersBOOL CSnakeDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small iconInitSnake(&snake);/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a controlvoid CSnakeDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CSnakeDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();CDC *pDC = GetDC();pDC-SetBkColor(RGB(210,215,210);pDC-TextOut(220,30,得分:0);pDC-TextOut(220,80,上:W);pDC-TextOut(220,100,下:S);pDC-TextOut(220,120,左:A);pDC-TextOut(220,140,右:D);pDC-TextOut(220,160,空格暂停);/pDC-Rectangle(10,10,210,320);UnDrawSnake(pDC,snake);DrawSnake(pDC,snake);/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CSnakeDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CSnakeDlg:OnHelpAbout() / TODO: Add your command handler code hereCAboutDlg dlg;KillTimer(1);dlg.DoModal();if(!GameOver()&nGameState)SetTimer(1,speed,NULL);void CSnakeDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCDC *pDC =GetDC();CBrush bus;if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承包商安全准入管理规范
- 2025年塔吊操作员劳动合同范本
- 2025年铁路考试试题及答案案
- 2025工贸行业安全知识考试题库及答案
- 2025年挖掘机司机劳务承包合同示范文本
- 2025年下半年嘉兴桐乡市城管执法局崇福分局招考(10人)易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年嘉兴市湘家荡发展投资集团限公司招聘4名易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年嘉兴市平湖市林埭镇人民政府招考合同制人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年嘉兴市南湖区参加浙江应届师范类招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年喀什地区直机关事业单位综合易考易错模拟试题(共500题)试卷后附参考答案
- (2025年)广东省食品安全管理人员知识考试题库特殊食品生产带答案
- 2025年湖南郴州资兴市第二次招聘城市社区专职工作者33人考试笔试参考题库附答案解析
- 品誉咨询绩效考核方案(3篇)
- 班组管理知识技能培训课件
- 2025年山西省公务员录用考试《行测》真题及答案
- 第六单元第二节化石燃料的利用说课稿-2024-2025学年九年级化学鲁教版上册
- 2025年事业单位招聘考试综合类专业知识试卷:人工智能产业政策知识篇
- 烟草局安全员培训课件
- 有特殊本领的鸟类课件
- 慈溪拆除施工方案
- 房产资产管理培训课件
评论
0/150
提交评论