贪吃蛇VC++.doc_第1页
贪吃蛇VC++.doc_第2页
贪吃蛇VC++.doc_第3页
贪吃蛇VC++.doc_第4页
贪吃蛇VC++.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1.需求分析1.1题目介绍1.1.1选题背景贪吃蛇是家喻户晓的益智类小游戏,选择这个题目是为了将自己的所学知识加以运用。我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。贪吃蛇,之所以取这样的名字,其用意很明显,贪吃蛇其实并不贪,它是人不断向前追求的象征。就像现代的人只有不断努力向前才能得到自己想要的。而食物也是随机出现的,就像现在社会存在的机会,而我们只有找好自己的目标才能成功。1.1.2题目要求设计开发一个贪吃蛇游戏系统,实现以下功能:(1)设计出合理美观的图形显示界面;(2)根据所学的CG的知识和相关的算法实现游戏的全过程。1.2设计目的1.2.1游戏实现的功能利用Microsoft Visual C+制作一个贪吃蛇的小游戏,实现:(1) 应用MFC单文档制作;(2) 能够记录游戏时间,游戏成绩;(3) 可暂停/继续并在玩家不愿游戏时停止游戏。1.2.2该游戏的意义游戏在设计方面应该本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,应始终坚持清晰明了,在性能方面应能够实现效率高,不易出错等优点。游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。1.3关于编译软件本程序采用Microsoft Visual C+6.0的英文版本进行编译。VisualC+6.0是Microsoft公司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C+规范,但仍有相当多的编程人员使用VisualC+6.0进行应用系统的开发。1.4关于兼容性本程序经过调试,可以在XP系统下编译运行,也可以在Vista下运行,界面稍有不同,但不影响运行结果。2.总体设计2.1程序结构根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及结束游戏,游戏帮助提示显示等等。具体的程序结构如下面的图2-1所示。开始游戏关于游戏帮助游戏说明贪吃蛇结束暂停/继续图2-1 贪吃蛇结构图2.2程序设计流程根据贪吃蛇程序结构,分析后设计出相应的贪吃蛇程序流程,如图2-2所示。贪吃蛇的内容主要包括: 游戏开始,随机出现食物;按下ToolBar中的“”或键盘上的F1键可以实现游戏开始功能;按下ToolBar中的 “ ” 或键盘上的Space键可以实现游戏暂停功能;按下ToolBar中的“”或键盘上的F5键可获得游戏帮助说明。载入游戏并初始化判断游戏是否开始蛇开始移动(默认初始向右移动)根据键盘控制蛇的移动方向判断蛇头和食物的坐标是否重合随机生成下一个食物判断蛇头和自身及墙的坐标 是否重合宣布死亡程序结束单击菜单游戏说明弹出游戏说明对话框NYY是否暂停是否开始暂停游戏YYYYNNNN开始计时,开始计分图2-2 贪吃蛇流程图3.详细设计3.1变量函数及资源的声明根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。3.1.1函数声明void CSnakeView:OnDraw(CDC* pDC)/在OnDraw函数中绘制游戏背景,显示游戏界面void CSnakeView:IniAim () /随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则重新产生一个void CSnakeView:IniGame() /对游戏初始化,定义游戏的初始状态void CSnakeView:ReDisplay(CPoint pPoint) /刷新游戏区域中pPoint处的一个小方格void CSnakeView:OnGameStart() /开始游戏(菜单响应消息)void CSnakeView:OnGamePause() /暂停游戏(菜单响应消息)void CSnakeView:OnGameEnd() /结束游戏(菜单响应消息)void CSnakeView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) /根据按下的方向键设置代表不同方向的值void CSnakeView:OnTimer(UINT nIDEvent)/定时器void CHelpDlg:OnGameHelp() /游戏帮助void CSnakeApp:OnAppAbout()/关于游戏3.1.2变量声明CArray m_aBody; /定义点数组作为蛇的身体CPoint m_pAim; /食物出现的点int m_nTime; /显示时间int m_nTime1; /满10则进一位使时间增加1秒int m_nDirect; /方向控制变量int m_nGameStatus; /游戏状态:0-未开始,1-开始int m_nCount; /玩家成绩变量bool m_bGamePause; /暂停控制变量bool m_bGameEnd; /结束控制变量CBrush m_brushBackground; /定义背景画刷3.1.3资源1、对话框IDD_GAME_HELP /游戏帮助说明IDD_ABOUTBOX /关于游戏版本2、位图IDB_BITMAP /游戏背景图4、菜单/工具栏 IDR_MAINFRAME /系统自带菜单3.2主要功能的实现3.2.1游戏界面贪吃蛇游戏的游戏界面包括背景图片、蛇身体的绘制、蛇移动范围的绘制等等。其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。本程序采用点数组CArray m_aBody来存储贪吃蛇,点数组的功能很强大,可以添加点,同时可以获得蛇的长度。导入位图以及菜单工具条后,游戏未开始前(XP系统下)的界面显示如图3-1所示。图3-1 游戏初始界面显示3.2.2初始化食物确定用点数组存储贪吃蛇以后,贪吃蛇的食物如何达到随机出现,并且能够按照网格式与蛇头无偏差相接就是一个亟待解决的问题。随机出现应采用rand()函数来实现,而食物与蛇头无偏差相接则利用坐标来解决。设置两个整型变量uX,uY作为食物出现的点的坐标,令uX= rand()%m_nHeight, ,uY= rand()%m_nWidth即可。使随机出现的点能够整除最小网格,也就是使食物与蛇头无偏差相接。再由食物坐标(uX,uY)与蛇头坐标是否相同判断蛇是否“吃”到了食物,设置判断标签uTag,如果吃到了,uTag为1,则再出现下一个食物,反之,如果没吃到,则不出现食物直到标签为1为止。最后,再将(uX,uY)赋给m_pAim作为食物坐标,以便在其他函数中调用。在下面的图3-2中,我们可以看到,蛇的身体是与出现的食物在一条直线上的,完全可以达到相接的目的。图3-2 蛇与食物的相接3.2.3开始游戏开始游戏后的重点是如何用键盘来控制蛇的移动并传递到OnTimer(UINT nIDEvent)函数中去以及判断蛇是否死亡。首先说明键盘与蛇的响应,设置一个方向控制变量m_nDirect,再添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数来实现键盘消息的传递,按下不同的键盘按键,m_nDirec会相应的改变,再利用switch语句在OnTimer(UINT nIDEvent)函数中对坐标进行相应改变即可。如图3-3所示。 (1)左 (2)下 (3)右 (4)上图3-3 键盘的上下左右键的效果其次来解释一下如何判断蛇的死亡,由于蛇的身体是由点坐标数组构成的,因此判断蛇是否死亡其本质就是判断蛇头的坐标是否与游戏边框相同或者蛇头坐标是否与蛇自己的身体相同。该过程也在OnTimer(UINT nIDEvent)函数中写入即可,设置一个判断死亡变量uTag,当按下向下键时,蛇纵坐标不断自加,此处仅以向下为例,具体程序如下:switch(m_nDirect) /根据键盘按下键来选择蛇移动的方向case 1: /方向变量向右uPoint.y+; /点纵坐标自加if(uPoint.y=m_nWidth) /如果纵坐标多于最下端边框uTag=1; /变量为1,判断死亡break;如果uTag为1,则说明蛇已经死亡,应当弹出对话框提示死亡,如图3-4。图3-4 贪吃蛇的死亡4.测试运行4.1程序运行程序开始运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“游戏开始”,或者单击工具条上的,或者直接按下键盘上的F1,才会开始游戏。图4-1所显示的是XP系统下菜单的样式。图4-1 菜单样式游戏开始后,可以通过键盘上的上下左右键控制蛇的运动方向,蛇头与目标成功重合后,界面上会随机出现下一食物,继续操纵方向键控制蛇的运动。在游戏过程中,单击菜单的“游戏暂停”,或者单击工具条上的,或者直接按下键盘上的Space键,就会暂停游戏,按下F1键则会继续游戏。在前面的图3-4中显示了贪吃蛇死亡的样子,蛇撞到墙或者碰到自身,游戏结束,会弹出对话框,提示“GAME OVER!”.如果不太会玩贪吃蛇这款游戏,那么可以单击菜单“帮助游戏说明”,或者单击工具条上的,或者直接按键盘上的F5,寻求帮助。图4-2 游戏说明5.结论及分析5.1功能实现利用Microsoft Visual C+制作一个MFC单文档,通过程序编写,贪吃蛇游戏的功能基本上都得到了实现。(1)画出了程序初始样式(方框,蛇身,目标及文字);(2)允许玩家用菜单项开始“开始”开始游戏;(3)蛇能自动前进,蛇身显示正确;(4)能用方向键改变蛇头方向,并且在蛇身的改变方向处正确弯曲;(5)蛇头碰到目标时可以正确计分并显示;(6)蛇头碰到目标时可以正确增加蛇身长度;(7)能正确判断游戏结束(包括蛇头碰到四壁或自身);(8)能正确显示计时。5.2问题解决本次设计既是一个学习的过程,也是一个实践的过程,对所学知识进一步巩固和加深,使理论和实践相结合,发现书本知识的不足的同时,也提高了自己的实践能力。同时它也使我们获得了一些开发小型的休闲类游戏的宝贵经验。虽然在设计前查阅了大量相关的资料,但在设计的时候,还是遇到了很多问题。(1)问题:制作游戏背景时,图片不能插入成功。原因:图片格式不符合。解决办法:将图片转换为.bmp格式,重新插入,运行后,显示正常。(2)问题:蛇运动区域与边框不匹配,造成蛇运动出边框或未到达边框而游戏结束。原因:相关数据不匹配。解决办法:重新对程序中的矩形框绘制函数数据进行修改,并修改蛇运动边界的判断条件。(3)问题:食物出现在边框外,造成游戏无法进行。原因:控制事物出现的随机函数出现问题,随机坐标超出蛇运动区域。解决办法:重新计算边界条件,修改随机函数rand()%x中的x值。5.3系统改进本系统只是简单实现了贪吃蛇游戏的基本功能,还可以在很多方面做改进,使游戏功能更全,界面更完美,更能实现其现实意义。首先,可以为游戏设置等级,将蛇运动的速度作为标准,设置初级,中级,高级,级别越高,蛇身运动速度越快,难度越高。其次,可以为游戏添加背景音乐,随着游戏难度的增加,播放不同的音乐,使玩家在玩的同时感同身受游戏的紧张气氛,增加游戏的乐趣。最后,可以为游戏添加一个排名榜,排名榜上记录总积分最高的前十位玩家姓名和积分情况,如果有玩家积分超过前面任何一位,则游戏结束后,提示玩家输入信息,将其记录到应当的位置。参考文献1 杨钦,徐永安,翟红英编著. 计算机图形学.清华大学出版社,20052 谭浩强等著. Visual C+程序设计. 中国铁道出版社,20053罗伟坚,Visual C+经典游戏程序设计,人民邮电出版社,20064刘璟、周玉龙,高级语言C+程序设计,高等教育出版社,2003附 录1.头文件/ SnakeView.h : interface of the CSnakeView class/#if !defined(AFX_SNAKEVIEW_H_0AD75A3D_FCC7_4C96_A7FF_6448CBDB291F_INCLUDED_)#define AFX_SNAKEVIEW_H_0AD75A3D_FCC7_4C96_A7FF_6448CBDB291F_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include class CSnakeView : public CViewprivate:bool m_bGameEnd;bool m_bGamePause; /游戏是否暂停CBrush m_brushBackground;void ReDisplay(CPoint pPoint);void IniGame();void IniAim();int m_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize; /起始坐标,宽高(格数0),每格大小int m_nDirect; /当前方向CPoint m_pAim; /当前坐标CArray m_aBody; /蛇身int m_nGameStatus; /游戏状态:0-未开始,1-开始int m_nCount; /吃掉目标数 int m_nTime,m_nTime1; /用掉的时间protected: / create from serialization onlyCSnakeView();DECLARE_DYNCREATE(CSnakeView)/ Attributespublic:CSnakeDoc* GetDocument();/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CSnakeView)public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:virtual CSnakeView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:/ Generated message map functionsprotected:/AFX_MSG(CSnakeView)afx_msg void OnGameStart();afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg void OnTimer(UINT nIDEvent);afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnGamePause();afx_msg void OnGameEnd();/AFX_MSGDECLARE_MESSAGE_MAP();#ifndef _DEBUG / debug version in SnakeView.cppinline CSnakeDoc* CSnakeView:GetDocument() return (CSnakeDoc*)m_pDocument; #endif/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_SNAKEVIEW_H_0AD75A3D_FCC7_4C96_A7FF_6448CBDB291F_INCLUDED_)2.实现文件/ SnakeView.cpp : implementation of the CSnakeView class/#include stdafx.h#include Snake.h#include SnakeDoc.h#include SnakeView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CSnakeViewIMPLEMENT_DYNCREATE(CSnakeView, CView)BEGIN_MESSAGE_MAP(CSnakeView, CView)/AFX_MSG_MAP(CSnakeView)ON_COMMAND(ID_GAME_START, OnGameStart)ON_WM_KEYDOWN()ON_WM_TIMER()ON_WM_ERASEBKGND()ON_COMMAND(ID_GAME_PAUSE, OnGamePause)ON_COMMAND(ID_GAME_END, OnGameEnd)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CSnakeView construction/destructionCSnakeView:CSnakeView()IniGame();/ TODO: add construction code here CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP); /加载位图 m_brushBackground.CreatePatternBrush(&bmp); /创建位图画刷CSnakeView:CSnakeView()BOOL CSnakeView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CSnakeView drawingvoid CSnakeView:OnDraw(CDC* pDC) CRect rect; GetClientRect(rect);/取得客户区域 pDC-FillRect(rect,&m_brushBackground); /用背景画刷填充区域CSnakeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/画游戏区域pDC-SelectStockObject(WHITE_BRUSH);pDC-Rectangle(CRect(m_nLeft-1,m_nTop-1,m_nLeft+m_nWidth*m_nSize+1,m_nTop+m_nHeight*m_nSize+1);/显示当前用时CString uStr;uStr.Format(当前用时:%d,m_nTime);pDC-TextOut(m_nLeft+m_nWidth*m_nSize+30,40,uStr);/显示当前得分uStr.Format(当前得分:%d,m_nCount);pDC-TextOut(m_nLeft+m_nWidth*m_nSize+30,140,uStr);/显示目标pDC-SelectStockObject(LTGRAY_BRUSH);pDC-Rectangle(CRect(m_nLeft+m_pAim.y*m_nSize,m_nTop+m_pAim.x*m_nSize,m_nLeft+(m_pAim.y+1)*m_nSize,m_nTop+(m_pAim.x+1)*m_nSize);/画蛇for(int i=0;iRectangle(CRect(m_nLeft+uPoint.y*m_nSize,m_nTop+uPoint.x*m_nSize,m_nLeft+(uPoint.y+1)*m_nSize,m_nTop+(uPoint.x+1)*m_nSize);/ CSnakeView printingBOOL CSnakeView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CSnakeView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CSnakeView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CSnakeView diagnostics#ifdef _DEBUGvoid CSnakeView:AssertValid() constCView:AssertValid();void CSnakeView:Dump(CDumpContext& dc) constCView:Dump(dc);CSnakeDoc* CSnakeView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CSnakeDoc);return (CSnakeDoc*)m_pDocument;#endif /_DEBUG/ CSnakeView message handlersvoid CSnakeView:OnGameStart() /启动游戏,启动计时器/ TODO: Add your command handler code hereif(!m_bGamePause)IniGame(); m_nGameStatus=1; SetTimer(1,100,NULL); Invalidate();m_bGamePause = FALSE;SetTimer(1,100,NULL);/ TODO: Add your command handler code herevoid CSnakeView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar)case 38:m_nDirect=4;break;case 40:m_nDirect=3;break;case 37:m_nDirect=2;break;case 39:m_nDirect=1;break;CView:OnKeyDown(nChar, nRepCnt, nFlags);void CSnakeView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultm_nTime1+; /计时if(m_nTime1=10) /达到一秒m_nTime+;m_nTime1=0;Invalidate();CPoint uPoint=m_aBody.GetAt(0); /蛇头的位置int uTag=0; /是否失败switch(m_nDirect)case 1: /向右uPoint.y+;if(uPoint.y=m_nWidth)uTag=1;break;case 2: /向左uPoint.y-;if(uPoint.y=m_nHeight)uTag=1;break;case 4: /向上uPoint.x-;if(uPoint.x0)uTag=1;break;if(uTag=0) /判断蛇是否碰到了自身for(int i=0;i=m_aBody.GetUpperBound();i+)CPoint uPoint1=m_aBody.GetAt(i);if(uPoint1.x=uPoint.x & uPoint1.y=uPoint.y)uTag=1;break;if(uTag=0)m_aBody.InsertAt(0,uPoint); /新的蛇头的位置ReDisplay(uPoint);if(uPoint.x=m_pAim.x & uPoint.y=m_pAim.y)m_nCount+;IniAim();Invalidate();elseCPoint uPoint1=m_aBody.GetAt(m_aBody.GetUpperBound();m_aBody.RemoveAt(m_aBody.GetUpperBound();ReDisplay(uPoin

温馨提示

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

评论

0/150

提交评论