1、课程设计扫雷小游戏课 程 设 计 报 告 课程名称:面向对象程序设计C+ 设计题目:扫雷小游戏 专 业:计算机科学与技术 姓 名: 学 号: 指导教师:李 晓 虹2016 年 1 月 6日一、系统需求分析随着现在生活节奏的加快,人们在工作学习之余需要一个轻松娱乐的放松环境。因此我编写此软件的目的,一方面作为初学者来了解C+环境下的小程序开发,另一方面使用户能在娱乐休闲的同时拓展思维能力。1.1功能需求分析 功 能 简 介 随机布雷可以由电脑进行随机布雷自定义雷的数量可以由用户自定义雷的数量计时有计时装置,可以自开始扫雷后自动记时难度级别选项各个级别的难度对应雷的数量的不同游戏结束提示在游戏结束
2、时会出现提示对话框,并停止计时自定义雷的数量界面自定义雷的数量界面程序主界面游戏运行的界面1.2 运行环境需求 基本操作系统:win7,win XP1.3硬件需求a.处理器型号:奔腾III及同等型号以上处理器 b.内存容量:512MB以上内存(可运行数据库管理系统)c.外存容量:5G以上硬盘空间 d.联机或脱机:脱机 .输入及输出设备的型号和数量:鼠标、彩色显示器1.4基本素材需求二、总体设计扫雷是单人计算机游戏。游戏的用户界面由小方格组成的战场构成。当游戏开始时,计算机将固定的地雷数随机的放到战场的方格。此游戏还允许玩家指定战场中的地雷数。 参考Windows 操作系统提供的扫雷游戏,改进扫
3、雷游戏程序, 增加以下功能:在主界面中添加一个菜单栏,菜单栏中包括游戏和帮助两个菜单,其中游戏菜单中设置初级、中级、高级、自定义、声音、扫雷英雄榜这几个菜单项,帮助菜单中设置游戏规则和制作人员两个菜单项。 背景说明: a.软件名称:扫雷 b.用户:所有扫雷游戏爱好者三、详细设计3.1 具体要求如下:(1)扫雷游戏分为初级、中级和高级三个级别。单击游戏菜单可以选择“初级”、“中级”和“高级”。三个等级的区别在于,其雷的总数不一样,分别为40、80、120个雷,在相同数目的格子中,雷的数目愈多,其难度自然就愈大。(2)选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击“开始”便启动计时器
4、。 (3)用户要揭开某个方块,可左键单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。 (4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。 (5)当用户点中雷时,将有提示出现,胜利时,也有提示出现。 游戏的基本步骤为: 开始:按左键开始游戏,单击表情按钮或菜单重新开始; 左键:按下时,是雷则结束,非雷则显示数字; 数字:表示此数字周围一圈八个格子中雷的数目; 右键:奇数次按下,则用小红旗
5、标记,表示此处是雷;偶数次按下,表示对上 次的否定; 结束:左键单击到雷则结束,标记出所有的雷则结束; 3.2游戏流程运行截图游戏开始时截图,点击游戏菜单下的“开始”可以运行,或者点击开始。右边有计时器,左边是分数。这是游戏中途的截图这是游戏失败的截图四、系统调试在编写程序时,不免会出现这样那样的错误,这时需要我们从各个方向来解决。在调试这个游戏时,遇到一些语法和逻辑方面的问题。但是都得到了解决。五、结果分析能够顺利地运行程序六、总结1.通过设计实验,能综合运用了所学知识,编程解决实际问题,是所学知识掌握得更系统扎实。 2.现自己的知识的欠缺和能力的不足,使我们能够了解自己的不足,能及时补救,
6、使自己得到不断完善 。3.通过设计实验,对所学知识有了更深的理解,了解所学知识在实际生活中的运用。 4.通过这次设计的总结,我会在以后的学习中增强自己理论与实践相结合的能力。附件:部分程序源代码:DlgCustom.cpp:#include stdafx.h#include mine.h#include DlgHero.h#include MineWnd.h#include MineDefs.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/CDlgHero:CDlg
7、Hero(CWnd* pParent /*=NULL*/) : CDialog(CDlgHero:IDD, pParent) /AFX_DATA_INIT(CDlgHero) m_szBHolder = _T(); m_szEHolder = _T(); m_szBRecord = _T(); m_szERecord = _T(); m_szIHolder = _T(); m_szIRecord = _T(); /AFX_DATA_INITvoid CDlgHero:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);
8、/AFX_DATA_MAP(CDlgHero) DDX_Text(pDX, IDC_B_H, m_szBHolder); DDX_Text(pDX, IDC_E_H, m_szEHolder); DDX_Text(pDX, IDC_B_R, m_szBRecord); DDX_Text(pDX, IDC_E_R, m_szERecord); DDX_Text(pDX, IDC_I_H, m_szIHolder); DDX_Text(pDX, IDC_I_R, m_szIRecord); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDlgHero, CDialog) /AFX
9、_MSG_MAP(CDlgHero) ON_BN_CLICKED(IDC_RESET, OnReset) /AFX_MSG_MAPEND_MESSAGE_MAP()/void CDlgHero:SetBHolder(CString holder) m_szBHolder = holder;void CDlgHero:SetBRecord(UINT record) m_szBRecord.Format(%d秒, record);void CDlgHero:SetIHolder(CString holder) m_szIHolder = holder;void CDlgHero:SetIRecor
10、d(UINT record) m_szIRecord.Format(%d秒, record);void CDlgHero:SetEHolder(CString holder) m_szEHolder = holder;void CDlgHero:SetERecord(UINT record) m_szERecord.Format(%d秒, record);void CDlgHero:OnReset() CMineWnd *pMine = (CMineWnd*)AfxGetMainWnd(); pMine-ResetRecord(); m_szBHolder = DEFAULT_HOLDER;
11、m_szBRecord.Format(%d秒, DEFAULT_RECORD); m_szIHolder = DEFAULT_HOLDER; m_szIRecord.Format(%d秒, DEFAULT_RECORD); m_szEHolder = DEFAULT_HOLDER; m_szERecord.Format(%d秒, DEFAULT_RECORD); UpdateData(FALSE);DlgCustom.cpp#include stdafx.h#include mine.h#include DlgCustom.h#include MineWnd.h#ifdef _DEBUG#de
12、fine new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDlgCustom dialogCDlgCustom:CDlgCustom(CWnd* pParent /*=NULL*/) : CDialog(CDlgCustom:IDD, pParent) /AFX_DATA_INIT(CDlgCustom) m_uHeight = 0; m_uNumber = 0; m_uWidth = 0; /AFX_DATA_INITvoid CDlgCustom:DoDataExchange(CDataExchang
13、e* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CDlgCustom) DDX_Text(pDX, IDC_HEIGHT, m_uHeight); DDX_Text(pDX, IDC_NUMBER, m_uNumber); DDX_Text(pDX, IDC_WIDTH, m_uWidth); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDlgCustom, CDialog) /AFX_MSG_MAP(CDlgCustom) /AFX_MSG_MAPEND_MESSAGE_MAP()/void CDlgCustom:On
14、OK() UpdateData(); if (m_uWidth 30) m_uWidth = 30; if (m_uHeight 24) m_uHeight = 24; if (m_uNumber m_uWidth * m_uHeight) m_uNumber = m_uWidth * m_uHeight - 1; CMineWnd *pMine = (CMineWnd*)AfxGetMainWnd(); pMine-SetCustom(m_uWidth, m_uHeight, m_uNumber); CDialog:OnOK();void CDlgCustom:InitData(UINT x
15、Num, UINT yNum, UINT mNum) m_uWidth = xNum; m_uHeight = yNum; m_uNumber = mNum;DlgNewRecord.cpp#include stdafx.h#include mine.h#include DlgNewRecord.h#include MineDefs.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/CDlgNewRecord:CDlgNewRecord(CWnd* pParent /
16、*=NULL*/) : CDialog(CDlgNewRecord:IDD, pParent) /AFX_DATA_INIT(CDlgNewRecord) m_szName = _T(匿名); m_szDesc = _T(); /AFX_DATA_INITvoid CDlgNewRecord:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CDlgNewRecord) DDX_Text(pDX, IDC_EDIT_NAME, m_szName); DDX_Text(pDX, IDC_DE
17、SCRIBE, m_szDesc); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDlgNewRecord, CDialog) /AFX_MSG_MAP(CDlgNewRecord) /AFX_MSG_MAPEND_MESSAGE_MAP()/void CDlgNewRecord:SetLevel(UINT level) CString szLevel; if (level = LEVEL_PRIMARY) szLevel = 初级; else if (level = LEVEL_SECONDRY) szLevel = 中级; else if (level = LEVEL_
18、ADVANCE) szLevel = 高级; m_szDesc.Format(已破%s记录nr请留尊姓大名, szLevel);CString CDlgNewRecord:GetName() return m_szName;Mine.cpp#include stdafx.h#include Mine.h#include MineDefs.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/BEGIN_MESSAGE_MAP(CMineApp, CWinApp) /AFX
19、_MSG_MAP(CMineApp) /AFX_MSGEND_MESSAGE_MAP()/CMineApp:CMineApp()/CMineApp theApp;const CString className = _T(MineClass);/BOOL CMineApp:InitInstance() SetRegistryKey(CSER_513_2); m_uXMineNum = GetProfileInt(GAME_SETTING, CUSTOM_XNUM, PRIMARY_XNUM); m_uYMineNum = GetProfileInt(GAME_SETTING, CUSTOM_YN
20、UM, PRIMARY_YNUM); /定义并注册MineWnd窗口 m_pMineWnd = new CMineWnd(); WNDCLASS wc; ZeroMemory(&wc, sizeof(wc); wc.hInstance = AfxGetInstanceHandle(); wc.lpfnWndProc = :DefWindowProc; wc.hbrBackground = NULL; wc.hCursor = LoadCursor(IDC_ARROW); wc.hIcon = LoadIcon(IDR_MAINFRAME); wc.lpszClassName = classNa
21、me; wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); / register the minewnd class /注册窗口 if (!AfxRegisterClass(&wc) AfxMessageBox(注册类失败!); return FALSE; / get the minewnd coordinates, width and height UINT uWidth = DEFAULT_FRAME_X + m_uXMineNum * MINE_WIDTH + LINE_WIDTH_0 * 3 + SIDE_WIDTH_0 + SIDE_WIDTH_
22、1; UINT uHeight = DEFAULT_FRAME_Y + m_uYMineNum * MINE_HEIGHT + LINE_WIDTH_0 * 3 + SIDE_WIDTH_0 * 2 + SIDE_WIDTH_1 + SHELL_S_H; UINT uXPos = GetSystemMetrics(SM_CXSCREEN) / 2 - uWidth / 2; UINT uYPos = GetSystemMetrics(SM_CYSCREEN) / 2 - uHeight / 2; /创建窗口 if ( !m_pMineWnd-CreateEx( NULL, className,
23、 _T(扫雷), WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, uXPos, uYPos, uWidth, uHeight, NULL, NULL) ) AfxMessageBox(创建主窗口失败!); return FALSE; / 绑定该窗口为主窗口 m_pMainWnd = m_pMineWnd; /显示窗口 m_pMineWnd-ShowWindow(SW_NORMAL); return TRUE;int CMineApp:ExitInstance() delete m_pMineWnd; return CWinApp:ExitInstance()
24、;Mines.cpp#include stdafx.h#include Mine.h#include MineDefs.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/BEGIN_MESSAGE_MAP(CMineApp, CWinApp) /AFX_MSG_MAP(CMineApp) /AFX_MSGEND_MESSAGE_MAP()/CMineApp:CMineApp()/CMineApp theApp;const CString className = _T(
25、MineClass);/BOOL CMineApp:InitInstance() SetRegistryKey(CSER_513_2); m_uXMineNum = GetProfileInt(GAME_SETTING, CUSTOM_XNUM, PRIMARY_XNUM); m_uYMineNum = GetProfileInt(GAME_SETTING, CUSTOM_YNUM, PRIMARY_YNUM); /定义并注册MineWnd窗口 m_pMineWnd = new CMineWnd(); WNDCLASS wc; ZeroMemory(&wc, sizeof(wc); wc.hInstance = AfxGetInstanceHandle(); wc.lpfnWndProc = :DefWindowProc; wc.hbrBackground = NULL; wc.hCursor = LoadCursor(IDC_ARROW); wc.hIcon = LoadIcon(IDR_MAINFRAME); wc.lpszClassName = className; wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1