




免费预览已结束,剩余26页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows 程序设计程序设计 -课程考核报告课程考核报告 课题名称:课题名称: 贪食蛇小游戏贪食蛇小游戏 学学 号:号: 20090302237 班班 级:级: 09 计本计本 (2) 学生姓名:学生姓名: 尹尹 富富 源源 得得 分分: 2011 年年 12 月月 10 日日 1 目目 录录 一、一、 课程设计目的及要求课程设计目的及要求 .3 3 1.1. 设计目的及问题描述设计目的及问题描述 .3 (1) 设计目的:.3 (2) 问题描述:.3 2.2. 设计要求:设计要求: .3 3.3. 软件、硬件环境软件、硬件环境 .4 二、二、 课程设计的步骤课程设计的步骤 .4 4 三、三、 课程设计的内容课程设计的内容 .4 4 1.1. 概要设计概要设计 .4 (1) 程序总体框架描述.4 贪食蛇游戏功能架构 .4 贪食蛇游戏功能流程图 .5 游戏主要类结构 .6 游戏主界面设计 .6 英雄榜界面设计 .7 (2) 程序常用类声明.7 2.2. 主要技术主要技术 .7 (1) 主游戏类的实现.7 2 (2) 游戏规则.19 (3) 播放背景音乐.20 播放音乐菜单响应函数 .21 指定并播放文件 .21 (4) 记录游戏最高分的英雄榜.21 创建配置文件 hero.ini.21 英雄榜对话框类的声明 .22 “英雄榜”的显示与记录 .22 3.3. 系统设计结果系统设计结果 .25 (1) 界面截图.25 (2) 操作流程.25 四、四、 课程设计总结课程设计总结 .2727 1.1. 遇到的问题及如何解决遇到的问题及如何解决 .27 (1) 如何判断贪食蛇死亡?.27 (2) 如何在游戏中播放音乐?.27 (3) 如何实现英雄榜功能,记录游戏最高得分?.28 2.2. 设计感想设计感想 .28 五、五、 参考资料参考资料 .2828 3 VisualVisual C+C+ 贪食蛇游戏设计贪食蛇游戏设计 一、一、课程设计目的及要求课程设计目的及要求 1.1. 设计目的及问题描述设计目的及问题描述 (1)设计目的: 提高和加强自己的计算机应用与软件开发能力,使自己由初学者向专业的程 序员过渡。 培养自己独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机 产业日新月异发展的形势。 学习和掌握 Visual C+程序设计方法以及上机调试技巧,为今后学习其它专 业课程打好坚实的基础。 检测自己在这一学期对 MFC 的学习及掌握情况。知道自己的不足,及时的 弥补。为以后的学习打下一定的基础,也为自己以后如何制定学习计划做一 铺垫。 (2)问题描述: 1.贪食蛇游戏的由来: 在圣经中,蛇引诱夏娃吃了苹果后,就贬为毒虫,是阴险的象征。 而且由于蛇吃东西的时候,是整只动物吞进去的。所以,在文艺复兴的 时候,有人发明了一种游戏,即现在贪食蛇游戏的前身,后来慢慢演变 为今天的贪食蛇游戏。 2.贪食蛇游戏操作方法: 游戏通过上、下、左、右方向键控制贪食蛇移动并吃掉屏幕上出现 的果实。 3.贪食蛇游戏的基本规则: 整个贪食蛇自动向前移动,当迟到果实时就得分,并将身体增加一 小节。在游戏中不能碰到墙壁和自己的身体。当碰到墙壁或身体时,宣 告贪食蛇死亡,并结束当前游戏,记录当前得分。 2.2. 设计要求:设计要求: 利用 Microsoft Visual C+制作一个贪吃蛇的小游戏。 要求: (1)应用 MFC 单文档制作 (2)有“开始” 、 “退出”菜单 4 (3)可选择游戏等级并能显示当前等级 (4)游戏时能显示当前得分 (5)蛇的身体能够随着蛇的长度增长而变色 (6)能够显示英雄榜 (7)有背景音乐和音效 3.3. 软件、硬件环境软件、硬件环境 硬件:Intel(R) Core(TM)2 Duo CPU P8800 2.66GHz(2667 MHz) 4.00 GB 内存 500GB 硬盘 软件:Microsoft Windows 7 旗舰版 (32 位/Service Pack 1) Microsoft Visual C+6.0 二、二、课程设计的步骤课程设计的步骤 贪食蛇游戏的设计大致分为以下几个步骤: (1)可实施性分析 (2)总体设计 (3)接口设计 (4)界面及菜单设计 (5)类结构设计 (6)出错处理设计 三、三、课程设计的内容课程设计的内容 1.1. 概要设计概要设计 (1)程序总体框架描述 贪食蛇游戏功能架构 5 贪食蛇 随机果实出现 分数统计 更新最高分 贪食蛇自动移动 贪食蛇移动方向控制 贪食蛇移动功能 游戏规则判断功能 播放音乐功能 主界面显示功能 英雄榜功能 帮助功能 贪食蛇游戏功能流程图 6 判断选择级 别 高 载入游戏并初始化 帮助 判断是否超 过记录 游戏设置 判断游戏 是否开始 英雄榜 移动蛇身(初始 时向右移动) 根据键盘控制蛇 移动方向 判断蛇是否 吃到食物 随机生成下一个 食物 判断蛇头坐标和自身 或者墙坐标是否重合 是否超过记录 游戏结束 设置游戏等级 播放音乐 中低 弹出游戏说明对话框 写入文件 否 否 否 是 是 是 是 否 是 否 游戏主要类结构 7 贪食蛇游戏 游戏规则类 主游戏类 蛇身操作类 英雄榜类 音乐播放类 帮助类 游戏主界面设计 游戏等级 当前分数 游戏界面 英雄榜界面设计 8 (2)程序常用类声明 void CMy2237SnakeDlg:InitMenu() /初始化菜单 void C2237SnakeGame:InitGame() /初始化游戏 void C2237SnakeGame:InitFoods() /初始化果实 void CMy2237SnakeDlg:OnUpdateStartGame(CCmdUI* pCmdUI) /开始游戏菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateExitGame(CCmdUI* pCmdUI) /退出游戏菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateHigh(CCmdUI* pCmdUI) /游戏等级|高菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateLow(CCmdUI* pCmdUI) /游戏等级|低菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateNor(CCmdUI* pCmdUI) /游戏等级|中菜单栏响应函数 Void CMy2237SnakeDlg:OnUpdatePlayMusic(CCmdUI* pCmdUI) /播放音乐菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateHelp(CCmdUI* pCmdUI) /游戏帮助菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateAbout(CCmdUI* pCmdUI) /游戏关于菜单栏响应函数 void CMy2237SnakeDlg:OnUpdateHeroList(CCmdUI* pCmdUI) /英雄榜菜单栏响应函数 2.2. 主要技术主要技术 (1)主游戏类的实现 主游戏类的声明中包含了绘制蛇身函数、初始化游戏函数、随 机分配果实函数及设置当前游戏等级函数等声明。 其代码如下所示: 01#ifndef _SNAKE_GAME_H_ 02#define _SNAKE_GAME_H_ 9 03/主游戏类 04 05#include Afxtempl.h /插入模板头文件 06 07#define GAME_LEVEL_LOW 2 08#define GAME_LEVEL_NOR 4 09#define GAME_LEVEL_HIGH 8 10 11#define DIREC_UP 1 12#define DIREC_DOWN 2 13#define DIREC_RIGHT 3 14#define DIREC_LEFT 4 15 16#define LOW_LEVEL_SLEEP100 17#define NOR_LEVEL_SLEEP50 18#define HIGH_LEVEL_SLEEP30 19 20class C2237SnakeGame:public CWnd 21 22public: 23void HeroWrite(); /弹出英雄榜,并写入 24void ReDrawBody(CPoint pt); /重绘一个点 25void InitGame(); /初始化游戏 26C2237SnakeGame(); /构造函数 27virtual C2237SnakeGame(); /析构函数 28 29BOOL GameStart(); /游戏开始函数 30void InitFoods(); /初始化果实函数 31void SetGameLevel(int level); /设置游戏等级 32 33private: 34 35CPointm_psFood; /当前食物坐标 36intm_nDirect; /当前蛇先进方向 37intm_nScore; /当前游戏分数 38intm_nlevel; /当前游戏等级 39int m_nHighScore; /当前游戏最高分 40 41CArray m_body; /蛇身向量 42protected: 43 afx_msg void OnPaint(); 44afx_msg void OnTimer(UINT nIDEvent); 45afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); 46 DECLARE_MESSAGE_MAP() 10 47; 48 49#endif 通过前面类的声明,已经知道主游戏类中包含了几个基本类函数,如构 造、析构、绘图、和接收键盘输入等。这些函数是游戏窗口类的基础,用于 构成对话框、处理图片的显示及人机交互过程。 其代码如下: 01C2237SnakeGame:C2237SnakeGame() 02 03m_nScore = 0; 04m_psFood.x = 30; 05m_psFood.y = 30; 06m_nHighScore = 0; 07 08C2237SnakeGame:C2237SnakeGame() 09 10 11/ 消息映射表 12BEGIN_MESSAGE_MAP( C2237SnakeGame, CWnd ) 13/AFX_MSG_MAP(C2237SnakeGame) 14ON_WM_PAINT() 15ON_WM_TIMER() 16ON_WM_KEYUP() 17/AFX_MSG_MAP 18END_MESSAGE_MAP() 19/ 初始化果实 20void C2237SnakeGame:InitFoods() 21 22int m_ysX,m_ysY; 23while(1) 24 25m_ysX=rand()%28; /随机生成横坐标使其与贪吃蛇的身体可以接上 26m_ysY=rand()%28; /随机生成纵坐标使其与贪吃蛇的身体可以接上 27for(int i=0;i=m_body.GetUpperBound();i+) 28 29CPoint ysPoint1=m_body.GetAt(i); /获取贪吃蛇的身体坐标 30if(ysPoint1.x!=m_ysX|ysPoint1.y!=m_ysY) /如果身体的横 坐标或纵坐标与果实的横纵坐标相同 31 32m_psFood = CPoint(m_ysX, m_ysY);/将随机出现的坐标 记录为果实坐标 33return; 11 34 35 36 37 38/ 设置游戏等级 39void C2237SnakeGame:SetGameLevel(int level) 40 41m_nlevel = level; 42 43/ 开始游戏函数 44BOOL C2237SnakeGame:GameStart() 45 46int nSleep = LOW_LEVEL_SLEEP; 47char pszTmp128 = 0; 48switch(m_nlevel) 49 50case GAME_LEVEL_HIGH: 51nSleep = HIGH_LEVEL_SLEEP; 52break; 53case GAME_LEVEL_NOR: 54nSleep = NOR_LEVEL_SLEEP; 55break; 56 57GetPrivateProfileString(HERO, score, 0, 58pszTmp, 127, .hero.ini); 59m_nHighScore = atoi(pszTmp); 60SetTimer(1, nSleep, NULL); 61InitGame(); 62return TRUE; 63 64/ 处理 WM_PAINT 消息 65void C2237SnakeGame:OnPaint() 66 67 CPaintDC dc( this ); 68 CDC MemDC; 69 MemDC.CreateCompatibleDC( 70 / 装载背景 71 CBitmap bmp; 72 CPen pen; 73 bmp.LoadBitmap( IDB_BMP_BJ ); 74 pen.CreatePen( PS_SOLID, 1, 0 xff ); 75 MemDC.SelectObject( 76 MemDC.SelectObject( 77 MemDC.SetROP2( R2_NOTXORPEN ); 12 78CString ysStr; /定义字符串用于显示 游戏时间得分等字 79MemDC.SetBkMode(TRANSPARENT); /设置字体背景 80MemDC.SetTextColor(67); /设置字体颜色 81ysStr.Format(当前得分:%d,m_nScore); /初始化字符串 82MemDC.TextOut(30,50,ysStr); /输出文本 83switch(m_nlevel) /根据等级判断 84 85case GAME_LEVEL_LOW: /如果是初级 86ysStr.Format(当前等级: 初 级); 87break; 88case GAME_LEVEL_NOR: /如果是中级 89ysStr.Format(当前等级: 中 级); 90break; 91case GAME_LEVEL_HIGH: /如果是高级 92ysStr.Format(当前等级: 高 级); 93break; 94 95MemDC.TextOut(30,30,ysStr); 96 97/绘制蛇的样式 98CPen yspen; 99yspen.CreatePen(1,1,RGB(255,255,255); /定义白色画笔绘制蛇 的边框 100 MemDC.SelectObject( 101 CBrush ysbrush; 102 int k=m_body.GetUpperBound()+2; /设置一个变量存储贪吃蛇 的 身体长度 103 if(k10 130MemDC.SelectObject( 131/绘制果实 132MemDC.Rectangle( 133CRect(10+m_psFood.y*10, 134120+m_psFood.x*10, 13510+(m_psFood.y+1)*10, 136120+(m_psFood.x+1)*10) 137); 138 139 else /其余情况均为红色 140 141ysbrush.CreateSolidBrush(RGB(255,0,0); 142MemDC.SelectObject( 143/绘制果实 144MemDC.Rectangle( 145CRect(10+m_psFood.y*10, 146120+m_psFood.x*10, 14710+(m_psFood.y+1)*10, 148120+(m_psFood.x+1)*10) 149); 150 151 /初始化点数组 152 for(int i=0;i=m_body.GetUpperBound();i+) 153 154CPoint ysPoint=m_body.GetAt(i); 155 MemDC.Rectangle( 156CRect(10+ysPoint.y*10, 157120+ysPoint.x*10, 15810+(ysPoint.y+1)*10, 159120+(ysPoint.x+1)*10) 14 160); 161 162 dc.BitBlt( 0, 0, 325, 425, 163 164 / 处理按键消息 165 void C2237SnakeGame:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 166 167 switch(nChar) 168 169 case VK_UP: /按向上键 170m_nDirect=DIREC_UP; /控制方向变量为 DIREC_UP 171break; 172 case VK_DOWN: /按向下键 173m_nDirect=DIREC_DOWN; /控制方向变量为 DIREC_DOWN 174break; 175 case VK_LEFT: /按向左键 176m_nDirect=DIREC_LEFT; /控制方向变量为 DIREC_LEFT 177break; 178 case VK_RIGHT: /按向右键 179m_nDirect=DIREC_RIGHT; /控制方向变量为 DIREC_RIGHT 180break; 181 default: 182break; 183 184 除了以上基本函数外,主游戏窗口类中,还包含了其他功能函 数。如初始化果实函数、初始化游戏、设置游戏等级及定时器处理。 游戏中通过调用这些功能函数,来实现全部的游戏功能。 代码如下: 01/ 初始化果实 02void C2237SnakeGame:InitFoods() 03 04int m_ysX,m_ysY; 05while(1) 06 07m_ysX=rand()%28; /随机生成横坐标使其与贪吃蛇的身体可以接上 08m_ysY=rand()%28; /随机生成纵坐标使其与贪吃蛇的身体可以接上 09for(int i=0;i连接-对象/库模块中加 入静态库 Winmm.lib。 播放音乐菜单响应函数 01void CMy2237SnakeDlg:OnUpdatePlayMusic(CCmdUI* pCmdUI) 02/判断播放音乐菜单当前状态 03BOOL bCheck = (BOOL)m_main_menu.GetMenuState(IDR_PLAY_MUSIC, MF_CHECKED); 04if(m_bStart) 05 06if(bCheck) 07 08m_main_menu.CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_UNCHECKED); 09 10else 11 12m_main_menu.CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_CHECKED); 13 14PlayBackMusic(!bCheck);/调用播放背景音乐功能函数 15 16 指定并播放文件 01void CMy2237SnakeDlg:PlayBackMusic(BOOL bflg) 02 03/指定文件并播放 04if(bflg) 05 06sndPlaySound(Music.wav,SND_ASYNC);/播放音乐 07 08else 09 10sndPlaySound(NULL,SND_PURGE);/停止播放 11 12 23 (4)记录游戏最高分的英雄榜 创建配置文件 hero.ini 格式如下: HERO name=* /如 name=尹富源 score=* /如 score=36 level=* /如 level=2 英雄榜对话框类的声明 13class C2237HeroDlg : public CDialog 14 15public: 16void SetWriteFlg(BOOL bflg); /接口函数,设置可记录标志变 量 17C2237HeroDlg(CWnd* pParent = NULL); /规则函数 18enum IDD = IDD_HERO_LIST ; /对话框资源 19intm_level; /保存等级变量 20CString m_name; /保存姓名变量 21intm_score; /保存得分变量 22public: 23virtual int DoModal(); /弹出对话框函数声明 24protected: 25virtual void DoDataExchange(CDataExchange* pDX); 26protected: 27virtual void OnOK(); /久仰按钮响应函数声明 28afx_msg void OnBtn(); 29virtual BOOL OnInitDialog(); 30DECLARE_MESSAGE_MAP() 31private: 32BOOL m_bWriteflg; /记录标志变量 33; 34#endif “英雄榜”的显示与记录 “英雄榜”对话框分为两种情况,一种是显示当前最高记录; 另一种是写入当前最高记录。所以必须在其内部有一个状态标志位变 量来区别。当需要写入时,设置其为有效。需要显示时,设置 为无效。在对话框的实现中,需要对配置文件进行读写操作。 代码如下: 01#include stdafx.h 24 02#include 2237 尹富源 Snake.h 03#include 2237HeroDlg.h 04#ifdef _DEBUG 05#define new DEBUG_NEW 06#undef THIS_FILE 07static char THIS_FILE = _FILE_; 08#endif 09C2237HeroDlg:C2237HeroDlg(CWnd* pParent /*=NULL*/) 10: CDialog(C2237HeroDlg:IDD, pParent) 11 12m_bWriteflg = FALSE; /初始化写标志为假 13 14void C2237HeroDlg:DoDataExchange(CDataExchange* pDX) 15 16CDialog:DoDataExchange(pDX); /变量与资源映射 17/AFX_DATA_MAP(C2237HeroDlg) 18DDX_Text(pDX, IDC_LEVEL_EDIT, m_level); 19DDX_Text(pDX, IDC_NAME_EDIT, m_name); 20DDX_Text(pDX, IDC_SCORE_EDIT, m_score); 21DDV_MinMaxInt(pDX, m_score, 0, 10000);/设置最大和最小可输入值 22 23BEGIN_MESSAGE_MAP(C2237HeroDlg, CDialog) 24ON_BN_CLICKED(IDOK_BTN, OnBtn) /按钮与函数映射 25END_MESSAGE_MAP() 26 27void C2237HeroDlg:OnOK() 28 29 30void C2237HeroDlg:SetWriteFlg(BOOL bflg) /设置写入标志 31 32m_bWriteflg = bflg; 33 34int C2237HeroDlg:DoModal() /弹出对话框 35 36char pszTmp128 = 0; 37/读取配置文件 38GetPrivateProfileString(HERO, name, 0, 39pszTmp, 127, .hero.ini); /读取姓名 40m_name = CString(pszTmp); 41if(!m_bWriteflg) 42 43GetPrivateProfileString(HERO, score, 0, 44pszTmp, 127, .hero.ini); /读取分数 45m_score = atoi(pszTmp); 25 46GetPrivateProfileString(HERO, level, 0, 47pszTmp, 127, .hero.ini); /读取等级 48m_level = atoi(pszTmp); 49 50return CDialog:DoModal(); 51 52void C2237HeroDlg:OnBtn() /按钮响应 53 54UpdateData(TRUE); /更新显示数值到变量 55if(m_bWriteflg) 56 57CString tmp; 58tmp.Format(%d, m_score); /格式化数值为字符窜 59WritePrivateProfileString(HERO, name, m_name, .hero.ini); 60WritePrivateProfileString(HERO, score, tmp, .hero.ini); 61tmp.Format(%d, m_level); 62WritePrivateProfileString(HERO, level, tmp, .hero.ini); 63 64m_bWriteflg = FALSE; 65CDialog:OnOK(); 66 67 68BOOL C2237HeroDlg:OnInitDialog() /初始化对话框 69 70CDialog:OnInitDialog(); 71if(m_bWriteflg) 72 / 当为写入时,改变按钮名 称 73SetDlgItemText(IDOK_BTN, 记录); 74 75return TRUE; 76 CMy2237SnakeDlg 中的 HeroList()函数主要通过创建 C2237HeroDlg 类对象,在通过该对象来调用弹出对话框函数。 代码如下: 01#include 2237HeroDlg.h 02 03Void C22237SnakeDlg:HeroList() 04 05C2237HeroDlg dlg; /英雄对话框类对象 26 06Dlg.DoModal(); /弹出对话框 07 3.3. 系统设计结果系统设计结果 (1)界面截图 贪食蛇主界面 (2)操作流程 打开贪食蛇游戏程序。点击游戏帮助菜单-帮助查看游戏介绍 和操作说明。 2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小猫领养协议书怎么签
- 零售餐饮服务业预付卡合同2025年更新版
- 零售餐饮服务业预付卡2025年使用管理协议书
- 农药产品销售区域划分合同协议
- 3.交往从尊重开始(教学设计)五年级下册心理健康同步备课系列南大版
- 2025-2030企业数字化转型咨询服务需求变化与竞争分析报告
- 2025-2030介入医疗器械导管技术突破与手术量增长关联性
- 2025-2030亲子瑜伽对儿童身体协调性发展效果的市场调研
- 2025-2030亲子互动对婴幼儿情绪调节能力的影响研究
- 协议书离婚用带户口本
- 幼儿园控笔训练培训
- 口外门诊规培出科小结
- 木心全集讲稿系列:文学回忆录
- 肿瘤微环境中的细胞间通信
- 课程设计-MATLAB与通信仿真设计题目及程序
- 第6课 推动形成全面对外开放新格局高一思想政治《中国特色社会主义》同(高教版2023基础模块)
- 社会调查研究抽样课件
- 矩阵论同步学习辅导 张凯院 西北工业大学出版社
- 英语英语句子成分和基本结构
- GB/T 24218.1-2009纺织品非织造布试验方法第1部分:单位面积质量的测定
- GB/T 10357.1-2013家具力学性能试验第1部分:桌类强度和耐久性
评论
0/150
提交评论