课程设计扫雷小游戏.docx

上传人:b****3 文档编号:5490676 上传时间:2022-12-17 格式:DOCX 页数:63 大小:80.03KB
下载 相关 举报
课程设计扫雷小游戏.docx_第1页
第1页 / 共63页
课程设计扫雷小游戏.docx_第2页
第2页 / 共63页
课程设计扫雷小游戏.docx_第3页
第3页 / 共63页
课程设计扫雷小游戏.docx_第4页
第4页 / 共63页
课程设计扫雷小游戏.docx_第5页
第5页 / 共63页
点击查看更多>>
下载资源
资源描述

课程设计扫雷小游戏.docx

《课程设计扫雷小游戏.docx》由会员分享,可在线阅读,更多相关《课程设计扫雷小游戏.docx(63页珍藏版)》请在冰豆网上搜索。

课程设计扫雷小游戏.docx

课程设计扫雷小游戏

课程设计报告

课程名称:

面向对象程序设计C++

设计题目:

扫雷小游戏

专业:

计算机科学与技术

姓名:

学号:

指导教师:

李晓虹

2016年1月6日

1、系统需求分析

随着现在生活节奏的加快,人们在工作学习之余需要一个轻松娱乐的放松环境。

因此我编写此软件的目的,一方面作为初学者来了解C++环境下的小程序开发,另一方面使用户能在娱乐休闲的同时拓展思维能力。

1.1功能需求分析

功能

简介

随机布雷

可以由电脑进行随机布雷

自定义雷的数量

可以由用户自定义雷的数量

计时

有计时装置,可以自开始扫雷后自动记时

难度级别选项

各个级别的难度对应雷的数量的不同

游戏结束提示

在游戏结束时会出现提示对话框,并停止计时

自定义雷的数量界面

自定义雷的数量界面

程序主界面

游戏运行的界面

1.2运行环境需求

基本操作系统:

win7,winXP

1.3硬件需求

a.处理器型号:

奔腾III及同等型号以上处理器

b.内存容量:

512MB以上内存(可运行数据库管理系统)

c.外存容量:

5G以上硬盘空间

d.联机或脱机:

脱机

e.输入及输出设备的型号和数量:

鼠标、彩色显示器

1.4基本素材需求

二、总体设计

扫雷是单人计算机游戏。

游戏的用户界面由小方格组成的战场构成。

当游戏开始时,计算机将固定的地雷数随机的放到战场的方格。

此游戏还允许玩家指定战场中的地雷数。

参考Windows操作系统提供的扫雷游戏,改进扫雷游戏程序,增加以下功能:

在主界面中添加一个菜单栏,菜单栏中包括游戏和帮助两个菜单,其中游戏菜单中设置初级、中级、高级、自定义、声音、扫雷英雄榜这几个菜单项,帮助菜单中设置游戏规则和制作人员两个菜单项。

背景说明:

a.软件名称:

扫雷

b.用户:

所有扫雷游戏爱好者

3、详细设计

3.1具体要求如下:

(1)扫雷游戏分为初级、中级和高级三个级别。

单击游戏菜单可以选择“初级”、“中级”和“高级”。

三个等级的区别在于,其雷的总数不一样,分别为40、80、120个雷,在相同数目的格子中,雷的数目愈多,其难度自然就愈大。

(2)选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘“开始”便启动计时器。

(3)用户要揭开某个方块,可左键单击它。

若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。

(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。

用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。

(5)当用户点中雷时,将有提示出现,胜利时,也有提示出现。

游戏的基本步骤为:

开始:

按左键开始游戏,单击表情按钮或菜单重新开始;

左键:

按下时,是雷则结束,非雷则显示数字;

数字:

表示此数字周围一圈八个格子中雷的数目;

右键:

奇数次按下,则用小红旗标记,表示此处是雷;偶数次按下,表示对上次的否定;

结束:

左键单击到雷则结束,标记出所有的雷则结束;

3.2游戏流程

运行截图

游戏开始时截图,点击游戏菜单下的“开始”可以运行,或者点击

开始。

右边有计时器,

左边是分数。

这是游戏中途的截图

这是游戏失败的截图

4、系统调试

在编写程序时,不免会出现这样那样的错误,这时需要我们从各个方向来解决。

在调试这个游戏时,遇到一些语法和逻辑方面的问题。

但是都得到了解决。

5、结果分析

能够顺利地运行程序

6、总结

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);

//regist

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1