课程设计扫雷小游戏.docx
《课程设计扫雷小游戏.docx》由会员分享,可在线阅读,更多相关《课程设计扫雷小游戏.docx(80页珍藏版)》请在冰豆网上搜索。
课程设计扫雷小游戏
课程设计报告
课程名称:
面向对象程序设计C++
设计题目:
扫雷小游戏
专业:
计算机科学与技术
姓名:
学号:
指导教师:
李晓虹
2016年1月6日
一、系统需求分析
随着现在生活节奏的加快,人们在工作学习之余需要一个轻松娱乐的放松环境。
因此我编写此软件的目的,一方面作为初学者来了解C++环境下的小程序开发,另一方面使用户能在娱乐休闲的同时拓展思维能力。
1.1功能需求分析
功能
简介
随机布雷
可以由电脑进行随机布雷
自定义雷的数量
可以由用户自定义雷的数量
计时
有计时装置,可以自开始扫雷后自动记时
难度级别选项
各个级别的难度对应雷的数量的不同
游戏结束提示
在游戏结束时会出现提示对话框,并停止计时
自定义雷的数量界面
自定义雷的数量界面
程序主界面
游戏运行的界面
1.2运行环境需求
基本操作系统:
win7,winXP
1.3硬件需求
a.处理器型号:
奔腾III及同等型号以上处理器
b.内存容量:
512MB以上内存(可运行数据库管理系统)
c.外存容量:
5G以上硬盘空间
d.联机或脱机:
脱机
e.输入及输出设备的型号和数量:
鼠标、彩色显示器
1.4基本素材需求
二、总体设计
扫雷是单人计算机游戏。
游戏的用户界面由小方格组成的战场构成。
当游戏开始时,计算机将固定的地雷数随机的放到战场的方格。
此游戏还允许玩家指定战场中的地雷数。
参考Windows操作系统提供的扫雷游戏,改进扫雷游戏程序,增加以下功能:
在主界面中添加一个菜单栏,菜单栏中包括游戏和帮助两个菜单,其中游戏菜单中设置初级、中级、高级、自定义、声音、扫雷英雄榜这几个菜单项,帮助菜单中设置游戏规则和制作人员两个菜单项。
背景说明:
a.软件名称:
扫雷
b.用户:
所有扫雷游戏爱好者
三、详细设计
3.1具体要求如下:
(1)扫雷游戏分为初级、中级和高级三个级别。
单击游戏菜单可以选择“初级”、“中级”和“高级”。
三个等级的区别在于,其雷的总数不一样,分别为40、80、120个雷,在相同数目的格子中,雷的数目愈多,其难度自然就愈大。
(2)选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘“开始”便启动计时器。
(3)用户要揭开某个方块,可左键单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(5)当用户点中雷时,将有提示出现,胜利时,也有提示出现。
游戏的基本步骤为:
开始:
按左键开始游戏,单击表情按钮或菜单重新开始;
左键:
按下时,是雷则结束,非雷则显示数字;
数字:
表示此数字周围一圈八个格子中雷的数目;
右键:
奇数次按下,则用小红旗标记,表示此处是雷;偶数次按下,表示对上次的否定;
结束:
左键单击到雷则结束,标记出所有的雷则结束;
3.2游戏流程
运行截图
游戏开始时截图,点击游戏菜单下的“开始”可以运行,或者点击
开始。
右边有计时器,
左边是分数。
这是游戏中途的截图
这是游戏失败的截图
四、系统调试
在编写程序时,不免会出现这样那样的错误,这时需要我们从各个方向来解决。
在调试这个游戏时,遇到一些语法和逻辑方面的问题。
但是都得到了解决。
五、结果分析
能够顺利地运行程序
六、总结
1.通过设计实验,能综合运用了所学知识,编程解决实际问题,是所学知识掌握得更系统扎实。
2.现自己的知识的欠缺和能力的不足,使我们能够了解自己的不足,能及时补救,使自己得到不断完善。
3.通过设计实验,对所学知识有了更深的理解,了解所学知识在实际生活中的运用。
4.通过这次设计的总结,我会在以后的学习中增强自己理论与实践相结合的能力。
附件:
部分程序源代码:
DlgCustom.cpp:
#include"stdafx.h"
#include"mine.h"
#include"DlgHero.h"
#include"MineWnd.h"
#include"MineDefs.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
CDlgHero:
:
CDlgHero(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_INIT
}
voidCDlgHero:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{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_MAP
}
BEGIN_MESSAGE_MAP(CDlgHero,CDialog)
//{{AFX_MSG_MAP(CDlgHero)
ON_BN_CLICKED(IDC_RESET,OnReset)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
voidCDlgHero:
:
SetBHolder(CStringholder)
{
m_szBHolder=holder;
}
voidCDlgHero:
:
SetBRecord(UINTrecord)
{
m_szBRecord.Format("%d秒",record);
}
voidCDlgHero:
:
SetIHolder(CStringholder)
{
m_szIHolder=holder;
}
voidCDlgHero:
:
SetIRecord(UINTrecord)
{
m_szIRecord.Format("%d秒",record);
}
voidCDlgHero:
:
SetEHolder(CStringholder)
{
m_szEHolder=holder;
}
voidCDlgHero:
:
SetERecord(UINTrecord)
{
m_szERecord.Format("%d秒",record);
}
voidCDlgHero:
:
OnReset()
{
CMineWnd*pMine=(CMineWnd*)AfxGetMainWnd();
pMine->ResetRecord();
m_szBHolder=DEFAULT_HOLDER;
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
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CDlgCustomdialog
CDlgCustom:
:
CDlgCustom(CWnd*pParent/*=NULL*/)
:
CDialog(CDlgCustom:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CDlgCustom)
m_uHeight=0;
m_uNumber=0;
m_uWidth=0;
//}}AFX_DATA_INIT
}
voidCDlgCustom:
:
DoDataExchange(CDataExchange*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_MAP
}
BEGIN_MESSAGE_MAP(CDlgCustom,CDialog)
//{{AFX_MSG_MAP(CDlgCustom)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
voidCDlgCustom:
:
OnOK()
{
UpdateData();
if(m_uWidth<9)m_uWidth=9;
if(m_uWidth>30)m_uWidth=30;
if(m_uHeight<9)m_uHeight=9;
if(m_uHeight>24)m_uHeight=24;
if(m_uNumber<10)m_uNumber=10;
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();
}
voidCDlgCustom:
:
InitData(UINTxNum,UINTyNum,UINTmNum)
{
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
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
CDlgNewRecord:
:
CDlgNewRecord(CWnd*pParent/*=NULL*/)
:
CDialog(CDlgNewRecord:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CDlgNewRecord)
m_szName=_T("匿名");
m_szDesc=_T("");
//}}AFX_DATA_INIT
}
voidCDlgNewRecord:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgNewRecord)
DDX_Text(pDX,IDC_EDIT_NAME,m_szName);
DDX_Text(pDX,IDC_DESCRIBE,m_szDesc);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgNewRecord,CDialog)
//{{AFX_MSG_MAP(CDlgNewRecord)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
voidCDlgNewRecord:
:
SetLevel(UINTlevel)
{
CStringszLevel;
if(level==LEVEL_PRIMARY)szLevel="初级";
elseif(level==LEVEL_SECONDRY)szLevel="中级";
elseif(level==LEVEL_ADVANCE)szLevel="高级";
m_szDesc.Format("已破%s记录\n\r请留尊姓大名",szLevel);
}
CStringCDlgNewRecord:
:
GetName()
{
returnm_szName;
}
Mine.cpp
#include"stdafx.h"
#include"Mine.h"
#include"MineDefs.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMineApp,CWinApp)
//{{AFX_MSG_MAP(CMineApp)
//}}AFX_MSG
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
CMineApp:
:
CMineApp()
{
}
/////////////////////////////////////////////////////////////////////////////
CMineApptheApp;
constCStringclassName=_T("MineClass");
/////////////////////////////////////////////////////////////////////////////
BOOLCMineApp:
:
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=newCMineWnd();
WNDCLASSwc;
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);
//registertheminewndclass
//注册窗口
if(!
AfxRegisterClass(&wc))
{
AfxMessageBox("注册类失败!
");
returnFALSE;
}
//gettheminewndcoordinates,widthandheight
UINTuWidth=DEFAULT_FRAME_X+m_uXMineNum*MINE_WIDTH+
LINE_WIDTH_0*3+SIDE_WIDTH_0+SIDE_WIDTH_1;
UINTuHeight=DEFAULT_FRAME_Y+m_uYMineNum*MINE_HEIGHT+
LINE_WIDTH_0*3+SIDE_WIDTH_0*2+SIDE_WIDTH_1+SHELL_S_H;
UINTuXPos=GetSystemMetrics(SM_CXSCREEN)/2-uWidth/2;
UINTuYPos=GetSystemMetrics(SM_CYSCREEN)/2-uHeight/2;
//创建窗口
if(!
m_pMineWnd->CreateEx(NULL,className,_T("扫雷"),
WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX,
uXPos,uYPos,uWidth,uHeight,
NULL,NULL))
{
AfxMessageBox("创建主窗口失败!
");
returnFALSE;
}
//绑定该窗口为主窗口
m_pMainWnd=m_pMineWnd;
//显示窗口
m_pMineWnd->ShowWindow(SW_NORMAL);
returnTRUE;
}
intCMineApp:
:
ExitInstance()
{
deletem_pMineWnd;
returnCWinApp:
:
ExitInstance();
}
Mines.cpp
#include"stdafx.h"
#include"Mine.h"
#include"MineDefs.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMineApp,CWinApp)
//{{AFX_MSG_MAP(CMineApp)
//}}AFX_MSG
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
CMineApp:
:
CMineApp()
{
}
/////////////////////////////////////////////////////////////////////////////
CMineApptheApp;
constCStringclassName=_T("MineClass");
/////////////////////////////////////////////////////////////////////////////
BOOLCMineApp:
:
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=newCMineWnd();
WNDCLASSwc;
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);
//