扫雷设计文档1.doc_第1页
扫雷设计文档1.doc_第2页
扫雷设计文档1.doc_第3页
扫雷设计文档1.doc_第4页
扫雷设计文档1.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

扫雷游戏文档设计 计科0901班 陈金林1 扫雷游戏需求分析 学号:200910806050311.游戏开发概要:扫雷游戏,设计出规则简单,上手容易,不论男女老少皆可娱乐。扫雷的目的就是要把所有非地雷的格子揭开即胜利。踩到地雷格子就算失败。2 游戏具体要求:扫雷的操作方法游戏主区域由很多个方格组成。使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。例如,方格中出现1,说明上下左右及斜角合计有一颗雷,依次类推,2则有2颗,3则有3颗。在确实是地雷的方格上点了旗子,就安全了,不是地雷的被点了旗子,后面会被炸死。在不确定是否是地雷的方格上用右键标示?符号,表示怀疑这个格子是地雷。这样格子在自动打开时,被标示的格子就不会被打开,导致游戏结束。3. 扫雷游戏的基本规则:在游戏中,当玩家不小心踩到地雷格子就算失败。而当地雷计数器中的数字变成0时,说明地雷全部被查到,游戏结束,玩家胜利。4 英雄榜的显示及更新:当有玩家把当前等级的地雷全部扫出来后,并且时间不比记录中的时间短。在结束游戏时,要求玩家把名字保存下来。游戏初始时时间为999秒。例如,当第一个玩家把全部地雷扫出来的时间为120秒,这时玩家的记录时间将被保存下来并作为记录时间线。直到有玩家的时间少于120秒,才能更新当前记录时间线并保存玩家的名字。5. 有背景音乐支持:在游戏中,能够通过选择播放背景音乐。6. 有更换背景颜色支持:在游戏中,能够根据游戏玩家的个人爱好,更换不同的游戏背景。7. 游戏的帮助:在游戏界面中需要提供游戏使用说明等帮助提示,以方便对本游戏不了解的玩家对游戏进行操作和使用。2 扫雷游戏项目计划安排 1 项目对象:本说明书使用对象主要是程序设计、代码编写、测试及维护等人员。 2 项目要求;根据需求分析制作合理的项目计划安排; 3 项目计划安排:根据项目需求分析,把项目的每一个模块制定出来,然后,根据他们之间的联系,组织每一个模块,逐步构成项目的完整体。 4.项目开发人员:由于本项目工作量比较小,所以整个开发过程都由本人自己完成。 5. 项目的编码与测试:由于本项目工作量比较小,所以整个开发过程都由本人自己完成。 三 扫雷游戏实施方案 1 总体设计 扫雷 表2.扫雷总体设计 游戏格子翻转功能播放背景音乐功能主界面显示功能更好背景颜色功能英雄榜功能帮助功能游戏胜负判断功能剩余地雷及显示时间菜单显示格子数组更新格子标示功能 2 程序设计主模块: 表2 菜单功能模块设计 游戏共由4个类和一个模块组成 主界面对话框类扫雷游戏 扫雷窗口类 英雄对话框类 帮助对话框类 音乐和背景模块 扫雷3 游戏菜单结构的设计游戏帮助 游戏设置 游戏 更换背景颜色更换背景音乐结束暂停开始游戏帮助游戏关于 4 核心代码 1 扫雷游戏的界面实现在扫雷游戏中,通过如下几步即可实现添加游戏的菜单。(1) 在扫雷游戏工程的资源中添加一个菜单资源,其属性如表4所示。ID类 别说 明IDR_MAIN_MENU弹出菜单游戏的主菜单IDR_START_GAME菜单栏开始游戏IDR_EXIT_GAME菜单栏退出游戏IDR_PLAY_MUSIC选择菜单播放音乐IDR_HELP菜单栏帮助IDR_ABOUT菜单栏关于(2)给每个菜单栏添加响应函数到CMineDlg类中。(3)菜单响应函数的实现,如代码1所示。代码1 菜单响应函数的实现01 BEGIN_MESSAGE_MAP(CMineDlg, CDialog) 02 ON_WM_SYSCOMMAND() 03 ON_WM_PAINT() 04 ON_WM_QUERYDRAGICON() / 菜单资源与函数映射表 05 ON_COMMAND(IDR_ABOUT, OnAbout) 06 ON_COMMAND(IDR_EXIT_GAME, OnExitGame) 07 ON_COMMAND(IDR_HELP, OnHelp) 08 ON_COMMAND(IDR_PLAY_MUSIC, OnPlayMusic) 09 ON_COMMAND(IDR_START_GAME, OnStartGame) 10 END_MESSAGE_MAP() 12 BOOL CMineDlg:OnInitDialog() /初始化对话框 13 14 CDialog:OnInitDialog(); 15 16 m_bStart = FALSE; /设置游戏状态 17 18 InitMenu(); /初始化菜单 19 20 return TRUE; /初始化成功 21 22 . /省略部分代码 23 void CMineDlg:OnOK() /单击确认按钮响应函数 24 25 CDialog:OnOK(); 26 28 void CMineDlg:OnCancel() /单击退出按钮响应函数 29 30 CDialog:OnCancel(); 31 33 void CMineDlg:OnAbout() /关于菜单栏响应函数 34 35 CAboutDlg dlg; /创建关于对话框 36 dlg.DoModal(); /弹出关于对话框 37 39 void CMineDlg:OnExitGame() /退出菜单栏响应函数 40 41 CDialog:OnCancel();/调用基类退出函数 42 44 void CMineDlg:OnHelp() /帮助菜单栏响应函数 45 46 CHelpDlg dlg; /创建帮助对话框 47 dlg.DoModal(); /弹出帮助对话框 48 2 游戏帮助对话框的实现扫雷游戏中的帮助是使用一个对话框来实现的。其实现步骤如下。(1)添加一个对话框资源到工程中,并填写说明文字,如图1所示。 图1 帮助对话框(2)编写一个CHelpDlg对话框类,主要是加载IDD_HELP对话框资源。通过资源中的文字说明对游戏操作方法进行描述。同时只包含单击知道了按钮的响应函数。其类声明如代码2所示。代码2 CHelpDlg对话框类声明 01 / CHelpDlg 对话框类 02 class CHelpDlg : public CDialog /公共继承于CDialog类 03 04 public: 05 CHelpDlg(CWnd* pParent = NULL); /构造函数 06 /对话框资源 07 enum IDD = IDD_HELP ; /加载资源 08 /重载函数 09 protected: 10 virtual void DoDataExchange(CDataExchange* pDX); 11 protected: 12 virtual void OnOK();/单击确定按钮响应函数声明 13 DECLARE_MESSAGE_MAP() 14 ; (3)CHelpDlg对话框类的实现,需要实现对话框类的构造函数、析构函数和知道了按钮响应函数,其代码如代码3所示。代码3 CHelpDlg对话框类的实现 00 / CHelpDlg 对话框类实现 01 CHelpDlg:CHelpDlg(CWnd* pParent /*=NULL*/)/构造函数 02 : CDialog(CHelpDlg:IDD, pParent) 03 04 05 void CHelpDlg:DoDataExchange(CDataExchange* pDX) 06 07 CDialog:DoDataExchange(pDX); 08 09 BEGIN_MESSAGE_MAP(CHelpDlg, CDialog) 10 END_MESSAGE_MAP() 11 / CHelpDlg 消息响应函数 12 void CHelpDlg:OnOK() /单击知道了按钮响应函数 13 14 CDialog:OnOK(); 15 游戏英雄榜对话框的实现扫雷游戏英雄榜的实现,分为如下几步:(1)创建一个对话框资源,并添加相应的控件,如图2所示。 图2 英雄榜对话框资源(2)添加CHeroDlg类,其中需要包含IDD_HERO_DLG对话框资源和设置可写记录标志接口函数声明,用于外部函数调用时,设置是否对配置文件进行写操作。类的声明如代码4所示。代码4 00 / CHeroDlg dialog 01 class CHeroDlg : public CDialog 02 03 public: 04 void SetWriteFlg(BOOL bflg); /接口函数,设置可记录标志变量 05 CHeroDlg(CWnd* pParent = NULL); /构造函数 06 enum IDD = IDD_HERO_LIST ; /对话框资源 07 int m_time; /保存时间变量 08 CString m_name; /保存姓名变量 09 public: 10 virtual int DoModal(); /弹出对话框函数声明 11 protected: 12 virtual void DoDataExchange(CDataExchange* pDX); 13 protected: 14 virtual void OnOK(); /单击久仰按钮响应函数声明 15 DECLARE_MESSAGE_MAP() 16 private: 17 BOOL m_bWriteflg; /记录标志变量 18 ; (4)CHeroDlg类的实现中通过调用系统API函数,来对配置文件进行读写操作。而设置读写标志接口函数,是对类的一个成员变量m_bWrite进行赋值操作,达到写入或者读取的区分。其代码如代码5所示。代码5 CHeroDlg类的实现 00 CHeroDlg:CHeroDlg(CWnd* pParent /*=NULL*/)/构造函数 01 : CDialog(CHeroDlg:IDD, pParent) 02 03 m_bWriteflg = FALSE; /初始化写标志变量为假 04 05 void CHeroDlg:DoDataExchange(CDataExchange* pDX) 06 07 CDialog:DoDataExchange(pDX); /变量与资源映射 08 /AFX_DATA_MAP(CHeroDlg) 09 DDX_Text(pDX, IDC_TIME_EDIT, m_time); 10 DDX_Text(pDX, IDC_NAME_EDIT, m_name); 11 /AFX_DATA_MAP 12 13 BEGIN_MESSAGE_MAP(CHeroDlg, CDialog) 14 ON_BN_CLICKED(IDOK_BTN, OnBtn) /按钮与函数映射 15 END_MESSAGE_MAP() 17 / 18 / CHeroDlg 消息句柄 19 void CHeroDlg:SetWriteFlg(BOOL bflg) /设置写入标志 20 21 m_bWriteflg = bflg; 22 23 24 int CHeroDlg:DoModal() /弹出对话框 25 26 char pszTmp128 = 0; /读取配置文件 GetPrivateProfileString(HERO, name, 无名氏, pszTmp, 127, .hero.ini); /读入姓名 m_name = CString(pszTmp); if(!m_bWriteflg) GetPrivateProfileString(HERO, time, 0, pszTmp, 127, .hero.ini); /读入等级 m_time = atoi(pszTmp); return CDialog:DoModal(); void CHeroDlg:OnBtn() /按钮响应 UpdateData(TRUE); if(m_bWriteflg) CString tmp; /写入姓名和时间记录 WritePrivateProfileString(HERO, name,m_name, .hero.ini); tmp.Format(%d, m_time); WritePrivateProfileString(HERO, time, tmp, .hero.ini); m_bWriteflg = FALSE; CDialog:OnOK(); BOOL CHeroDlg:OnInitDialog() /初始化对话 CDialog:OnInitDialog(); if(m_bWriteflg) /当为写入时,把按钮名称改变 SetDlgItemText(IDOK_BTN, 记录); return TRUE; 3 游戏播放背景音乐的实现播放游戏背景音乐,是通过调用Windows的API函数sndPlaySound()来实现的。当玩家选择游戏设置|播放音乐命令时,就播放音乐。相反,如果取消,就停止播放音乐。要实现这个功能,需要如下几步:(1)在工程文件中,添加winmm.lib静态库文件及头文件。参见第5.4节。(2)实现CMineDlg类中的PlayBackMusic()成员函数,其代码如代码15.6所示。代码15.6 CMineDlg类的PlayBackMusic成员函数实现01 #include /插入系统API头文件 02 . 03 void CMineDlg:PlayBackMusic(BOOL bCheck) 04 05 /指定文件并播放 06 if(bCheck) 07 /播放指定音乐文件 08 sndPlaySound(music.wav,SND_ASYNC); 09 10 else 11 /停止播放 12 sndPlaySound(NULL,SND_PURGE); 13 14 4 游戏更换背景颜色的实现void CMyMine:OnMemuColor() m_bColorful = !m_bColorful;LoadBitmap();SetCheckedColor();Invalidate();5 游戏规则的实现/*初始化游戏*/void CMyMine:InitGame()LoadBitmap();LoadConfig();m_nLeaveNum = m_uMineNum;m_uSpendTime = 0;m_uBtnState = BS_NORMAL;/设置当前方块状态m_uGameState = GS_WAIT;/设置当前游戏状态if (m_uTimer) KillTimer(ID_TIMER_EVENT);m_uTimer = 0;m_pNewMine = NULL;/清空当前选中的小方块m_pOldMine = NULL;/清空上次选中的小方块/初始化表示雷区的二维数组for (UINT i = 0; im_uYNum; i+) for (UINT j = 0; jm_uXNum; j+) m_pMinesij.uRow = i;m_pMinesij.uCol = j;m_pMinesij.uState = STATE_NORMAL;m_pMinesij.uAttrib = ATTRIB_EMPTY;m_pMinesij.uOldState = STATE_NORMAL;void CMyMine:StartGame()InitGame();Invalidate();/*在雷区铺设地雷*/void CMyMine:LayMines(UINT row, UINT col)srand( (unsigned)time( NULL ) );UINT i, j;for(UINT index = 0; index m_uMineNum;) i = rand() % m_uYNum;j = rand() % m_uXNum;if (i = row & j = col) continue;if(m_pMinesij.uAttrib != ATTRIB_MINE) m_pMinesij.uAttrib = ATTRIB_MINE;index+;/*自动打开相关不是地雷的格子*/void CMyMine:ExpandMines(UINT row, UINT col)UINT i, j;UINT minRow = (row = 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col = 0) ? 0 : col - 1;UINT maxCol = col + 2;UINT around = GetAroundNum(row, col);m_pMinesrowcol.uState = 15 - around;m_pMinesrowcol.uOldState = 15 - around;/在指定位置画出地雷DrawSpecialMine(row, col);if (around = 0) for (i = minRow; i maxRow; i+) for (j = minCol; j maxCol; j+) if (!(i = row & j = col) & m_pMinesij.uState = STATE_NORMAL& m_pMinesij.uAttrib != ATTRIB_MINE) if (!IsInMineArea(i, j) continue;ExpandMines(i, j);/*获得周围地雷个数*/UINT CMyMine:GetAroundNum(UINT row, UINT col)UINT i, j;UINT around = 0;UINT minRow = (row = 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col = 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i maxRow; i+) for (j = minCol; j maxCol; j+) if (!IsInMineArea(i, j) continue;if (m_pMinesij.uAttrib = ATTRIB_MINE) around+;return around;/*得到周围格子状态*/UINT CMyMine:GetAroundFlags(UINT row, UINT col) UINT i, j;UINT flags = 0;UINT minRow = (row = 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col = 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i maxRow; i+) for (j = minCol; j = 0 & row = 0 & col m_uXNum);/*游戏结束*/void CMyMine:Dead(UINT row, UINT col)CRect rcBtn(m_uBtnRect1, 15, m_uBtnRect2, 39);CRect rcMineArea(MINE_AREA_LEFT, MINE_AREA_TOP, MINE_AREA_LEFT + m_uXNum * MINE_WIDTH, MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);UINT i, j;if (m_pMinesrowcol.uAttrib = ATTRIB_MINE) /打开了是地雷的格子for (i = 0; i m_uYNum; i+) for (j = 0; j m_uXNum; j+) m_pMinesrowcol.uState = STATE_BLAST;m_pMinesrowcol.uOldState = STATE_BLAST;if (m_pMinesij.uAttrib = ATTRIB_MINE& m_pMinesij.uState != STATE_FLAG) m_pMinesij.uState = STATE_MINE;m_pMinesij.uOldState = STATE_MINE;else /打开了判断错误的格子for (i = 0; i m_uYNum; i+) for (j = 0; j m_uXNum; j+) m_pMinesrowcol.uState = STATE_ER

温馨提示

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

评论

0/150

提交评论