扫雷游戏设计报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
画 背 景 时 , pDC->FillRect(myrect1,&mybrush1); 取 得 颜 色 刷 并 在 区 域 CRect
myrect1(0,0,1200,800)内填充该颜色;画黑框时,mybrush.CreateSolidBrush(RGB(0,0,0))黑色刷,
pDC->FillRect(myrect,&mybrush)、pDC->FillRect(myrect2,&mybrush)分别取得黑色刷在不同区
青岛理工大学琴岛学院 设计报告
课题名称:扫雷游戏设计 学 院:青岛理工大学琴岛学院 专业班级:计算机科学与技术 102 班 学 号:20100301049 学 生:徐为 指导教师:张秀国、宋传磊
青岛理工大学琴岛学院教务处 2011 年 7 月 8 日
学生
徐为
指导教师
张秀国、宋传磊
课题名称
扫雷游戏设计
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnStart();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void Onchuji();
afx_msg void Onzhongji();
afx_msg void Ongaoji();
//}}AFX_MSG DECLARE_MESSAGE_MAP()
}; 上述代码声明了以下变量及函数:int leftnum 剩余雷数,int leinum 雷的数目,short
second 计时,int secondstart 开始计时,CBitmap m_Bitmap[12]位图数组,CBitmap m_anniu[4] 按扭位图数组,int m_RowCount 雷区行数,int m_ColCount 雷区列数,Lei lei[50][50]最大雷 区 , void leizero() 显 示 一 个 位 置 周 围 雷 数 为 0 的 区 域 , void OnTimer() 计 时 器 函 数 , void OnLButtonDown( ) 鼠 标 按 下 左 键 函 数 , void OnRButtonDown( ) 鼠 标 按 下 右 键 函 数 , void OnLButtonUp( )鼠标左键松开函数,int OnCreate( )初始化游戏框架函数,void OnStart( )开始 化游戏函数,int OnCreate( )初始化函数。 (3)由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的 核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定 雷 数 赋 值 为 -1, 最 后 把 不 是 雷 的 格 子 的 雷 数 赋 值 为 相 应 的 值 。 以 下 代 码 中 CTime time=GetCurrentTime( )是获取当前时间,s=time.GetSecond( )是获取秒数,while 循环是以当前 秒数为产生随机算法,同时为了避免一个位置同时算两个雷,只允许当前位置不是雷时赋值 为雷,接着 for 循环是给方格赋值,计算雷数。 CMy2_1View::CMy2_1View() {
2.调整窗口大小
在类 CMainFrame 中的 PreCreateWindow( )添加代码: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
······· cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; // cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//; cs.cx=440;
{ ······ } pDC->SelectObject(myoldPen2);
CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can't create DC"); Dc.SelectObject(m_anniu[0]); pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY); for(int a=0;a<m_RowCount;a++) for(int b=0;b<m_ColCount;b++) { if(lei[a][b].weitu==1) { ······ } if(lei[a][b].weitu==2) { ······ } if(lei[a][b].weitu==3) { ······ } if(jieshu==1&&lei[a][b].shumu==-1) { ······ }
void CMy2_1View::OnDraw(CDC* pDC) {
······· CBrush mybrush1; mybrush1.CreateSolidBrush(RGB(192,192,192)); CRect myrect1(0,0,1200,800); pDC->FillRect(myrect1,&mybrush1); CBrush mybrush; mybrush.CreateSolidBrush(RGB(0,0,0)); CRect myrect(20,10,70,40); pDC->FillRect(myrect,&mybrush);
位的数字在前面加 0.
4.定义新类及添加变量和函数
(1)对于雷,我们是单独定义一个类,这样有利于程序的操作。 class Lei { public:
int weitu; int shumu; }; 上述代码声明了以下变量:int weitu 显示哪一个位图,int shumu 相应位置相应的值 (2)在类 CMy2_1View 中添加变量及函数: class CMy2_1View : public CView { ······ public: int leftnum; int leinum; int jieshu; short second; int secondstart; CBitmap m_Bitmap[12]; CBitmap m_anniu[4]; int m_RowCount; int m_ColCount; Lei lei[50][50]; virtual ~CMy2_1View(); void leizero(); ······ protected: //{{AFX_MSG(CMy2_1View) afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
设计时间 2011/6/27-2011/7/8
设计地点
国际交流中心 212 机房
培养学生综合运用理论知识来分析和解决实际问题的能力、 设计目的 及严谨的科学态度和良好的课程设计习惯。
指导教师评 语
系部教研室 意见
一、调研材料
扫雷游戏是 Windows 操作系统自带的一个小游戏,过去的几年里 Windows 操作系统历经数 次换代,变得越来越庞大、复杂,但扫雷游戏在任何版本的 Windows 操作系统里却依然保持 原貌,而且几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。
} int nOldDC=pDC->SaveDC(); pDC->SetTextColor(RGB(255,0,0)); pDC->SetBkColor(RGB(0,0,0)); CFont font; if(0==font.CreatePointFont(160,"Comic Sans MS")) { AfxMessageBox("Can't Create Font"); } ······
cs.cy=400; return TRUE;
}
3.画游戏界面 为了用户框重画的需要,当我们的游戏玩了一半后最小化,或是把部分窗口移出屏幕,
或是执行了新的应用程序覆盖了原来的程序时,必须重画。我们调用重画函数,它都要重新 执行 OnDraw(CDC* pDC)函数,那么,此时它就必须把已经显示出来的位图也显示出来。而 开始时雷区位图是不可见的,并不影响界面的初始化。
扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多算法和语言实现,如 C,C++,VB,JAVA 等。 以 Visual C++ 开发环境,设计并开发一款扫雷游戏,其功能类似于 Windows 操作系统自带的扫雷游戏。
Visual C++是一个功能强大的可视化开发工具。自 1993 年 Microsoft 公司推出 Visual C++1.0 后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工 具。它不仅是一个 C++编译器,而且是一个基于 Windows 操作系统的可视化即成开发环境。
域涂刷,形成黑框,接着在画黑框右下两边画白线是黑框有立体感;画雷区时,左上角是白
线,右下角是黑线,以显示立体感,然后在两黑框中间位置显示人物脸图按钮,接着是判断
雷区显示什么位图,如果 weitu=1 显示已按下的数字区,如果 weitu=2 显示旗,如果 weitu=3 显示问号,如果 jieshu==1&&lei[a][b].shumu==-1 则结束,最后是显示黑框中的数字,不够三
二 、概要设计
1.基本功能
扫雷游戏
游ຫໍສະໝຸດ Baidu
游
游
游
戏
戏
戏
戏
开
选
计
计
始
关
雷
时
图 1 程序基本功能
类名 CMy2_1View
成员函数 leizero( ) Onchuji( )
Onzhongji( ) Ongaoji( ) OnLButtonDown( )
OnRButtonDown( )
OnLButtonUp( ) OnStart() OnTimer( )
功能
显示没有雷的区域
给变量 m_RowCount、m_ColCount、leinum 赋值并初 始化游戏。
给变量 m_RowCount、m_ColCount、leinum 赋值并初 始化游戏。
给变量 m_RowCount、m_ColCount、leinum 赋值并初 始化游戏。
如果在按钮上面,则显示按钮按下位图;如果在扫雷 区,先把按钮位图改为张口位图,再判断按下的是否是 雷,是就结束,重画,以显示所有的雷;否则,重画相 应格子以显示数字。
CRect myrect2(325,10,375,40); pDC->FillRect(myrect2,&mybrush);
CPen mypen; CPen*myoldPen; mypen.CreatePen(PS_SOLID,2,RGB(255,255,255)); myoldPen=pDC->SelectObject(&mypen); pDC->MoveTo(20,40); ········ pDC->LineTo(375,10); for(int i=0;i<m_RowCount;i++) for(int j=0;j<m_ColCount;j++) { ··········· } pDC->SelectObject(myoldPen);
初始化游戏
记录游戏所用时间
表 1 类及其函数功能
三、详细设计
1.添加位图 前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。另外,
为什么不添加一个按钮而用位图呢?是因为即使我们添加了按钮也要添加四幅位图! 位图的 ID 号: 按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU 2、IDB_ANNIU3、 IDB_ANNIU4 雷区位图:14*14 ID 号按下图依次为:IDB_BITMAP14。。。。。。IDB_BITMAP25
CPen mypen2; CPen*myoldPen2; mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0)); myoldPen2=pDC->SelectObject(&mypen2); for(int ii=0;ii<m_RowCount;ii++) for(int jj=0;jj<m_ColCount;jj++)
如果是雷,按右键时,显示旗子,并减少一个剩下
雷数;如果我们认为那旗子的格子不是雷,按右键,显
示问号,并在剩下雷数加上 1。 松开左键时,显示按钮没有按下的位图;再判断,
如果结束,就要显示失败的位图;如果是在按钮上松开 按钮,即表示我们已经按下了重新开始的按钮,必须调 用重新开始函数 OnStart()。
画 背 景 时 , pDC->FillRect(myrect1,&mybrush1); 取 得 颜 色 刷 并 在 区 域 CRect
myrect1(0,0,1200,800)内填充该颜色;画黑框时,mybrush.CreateSolidBrush(RGB(0,0,0))黑色刷,
pDC->FillRect(myrect,&mybrush)、pDC->FillRect(myrect2,&mybrush)分别取得黑色刷在不同区
青岛理工大学琴岛学院 设计报告
课题名称:扫雷游戏设计 学 院:青岛理工大学琴岛学院 专业班级:计算机科学与技术 102 班 学 号:20100301049 学 生:徐为 指导教师:张秀国、宋传磊
青岛理工大学琴岛学院教务处 2011 年 7 月 8 日
学生
徐为
指导教师
张秀国、宋传磊
课题名称
扫雷游戏设计
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnStart();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void Onchuji();
afx_msg void Onzhongji();
afx_msg void Ongaoji();
//}}AFX_MSG DECLARE_MESSAGE_MAP()
}; 上述代码声明了以下变量及函数:int leftnum 剩余雷数,int leinum 雷的数目,short
second 计时,int secondstart 开始计时,CBitmap m_Bitmap[12]位图数组,CBitmap m_anniu[4] 按扭位图数组,int m_RowCount 雷区行数,int m_ColCount 雷区列数,Lei lei[50][50]最大雷 区 , void leizero() 显 示 一 个 位 置 周 围 雷 数 为 0 的 区 域 , void OnTimer() 计 时 器 函 数 , void OnLButtonDown( ) 鼠 标 按 下 左 键 函 数 , void OnRButtonDown( ) 鼠 标 按 下 右 键 函 数 , void OnLButtonUp( )鼠标左键松开函数,int OnCreate( )初始化游戏框架函数,void OnStart( )开始 化游戏函数,int OnCreate( )初始化函数。 (3)由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的 核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定 雷 数 赋 值 为 -1, 最 后 把 不 是 雷 的 格 子 的 雷 数 赋 值 为 相 应 的 值 。 以 下 代 码 中 CTime time=GetCurrentTime( )是获取当前时间,s=time.GetSecond( )是获取秒数,while 循环是以当前 秒数为产生随机算法,同时为了避免一个位置同时算两个雷,只允许当前位置不是雷时赋值 为雷,接着 for 循环是给方格赋值,计算雷数。 CMy2_1View::CMy2_1View() {
2.调整窗口大小
在类 CMainFrame 中的 PreCreateWindow( )添加代码: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
······· cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; // cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//; cs.cx=440;
{ ······ } pDC->SelectObject(myoldPen2);
CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can't create DC"); Dc.SelectObject(m_anniu[0]); pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY); for(int a=0;a<m_RowCount;a++) for(int b=0;b<m_ColCount;b++) { if(lei[a][b].weitu==1) { ······ } if(lei[a][b].weitu==2) { ······ } if(lei[a][b].weitu==3) { ······ } if(jieshu==1&&lei[a][b].shumu==-1) { ······ }
void CMy2_1View::OnDraw(CDC* pDC) {
······· CBrush mybrush1; mybrush1.CreateSolidBrush(RGB(192,192,192)); CRect myrect1(0,0,1200,800); pDC->FillRect(myrect1,&mybrush1); CBrush mybrush; mybrush.CreateSolidBrush(RGB(0,0,0)); CRect myrect(20,10,70,40); pDC->FillRect(myrect,&mybrush);
位的数字在前面加 0.
4.定义新类及添加变量和函数
(1)对于雷,我们是单独定义一个类,这样有利于程序的操作。 class Lei { public:
int weitu; int shumu; }; 上述代码声明了以下变量:int weitu 显示哪一个位图,int shumu 相应位置相应的值 (2)在类 CMy2_1View 中添加变量及函数: class CMy2_1View : public CView { ······ public: int leftnum; int leinum; int jieshu; short second; int secondstart; CBitmap m_Bitmap[12]; CBitmap m_anniu[4]; int m_RowCount; int m_ColCount; Lei lei[50][50]; virtual ~CMy2_1View(); void leizero(); ······ protected: //{{AFX_MSG(CMy2_1View) afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
设计时间 2011/6/27-2011/7/8
设计地点
国际交流中心 212 机房
培养学生综合运用理论知识来分析和解决实际问题的能力、 设计目的 及严谨的科学态度和良好的课程设计习惯。
指导教师评 语
系部教研室 意见
一、调研材料
扫雷游戏是 Windows 操作系统自带的一个小游戏,过去的几年里 Windows 操作系统历经数 次换代,变得越来越庞大、复杂,但扫雷游戏在任何版本的 Windows 操作系统里却依然保持 原貌,而且几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。
} int nOldDC=pDC->SaveDC(); pDC->SetTextColor(RGB(255,0,0)); pDC->SetBkColor(RGB(0,0,0)); CFont font; if(0==font.CreatePointFont(160,"Comic Sans MS")) { AfxMessageBox("Can't Create Font"); } ······
cs.cy=400; return TRUE;
}
3.画游戏界面 为了用户框重画的需要,当我们的游戏玩了一半后最小化,或是把部分窗口移出屏幕,
或是执行了新的应用程序覆盖了原来的程序时,必须重画。我们调用重画函数,它都要重新 执行 OnDraw(CDC* pDC)函数,那么,此时它就必须把已经显示出来的位图也显示出来。而 开始时雷区位图是不可见的,并不影响界面的初始化。
扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多算法和语言实现,如 C,C++,VB,JAVA 等。 以 Visual C++ 开发环境,设计并开发一款扫雷游戏,其功能类似于 Windows 操作系统自带的扫雷游戏。
Visual C++是一个功能强大的可视化开发工具。自 1993 年 Microsoft 公司推出 Visual C++1.0 后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工 具。它不仅是一个 C++编译器,而且是一个基于 Windows 操作系统的可视化即成开发环境。
域涂刷,形成黑框,接着在画黑框右下两边画白线是黑框有立体感;画雷区时,左上角是白
线,右下角是黑线,以显示立体感,然后在两黑框中间位置显示人物脸图按钮,接着是判断
雷区显示什么位图,如果 weitu=1 显示已按下的数字区,如果 weitu=2 显示旗,如果 weitu=3 显示问号,如果 jieshu==1&&lei[a][b].shumu==-1 则结束,最后是显示黑框中的数字,不够三
二 、概要设计
1.基本功能
扫雷游戏
游ຫໍສະໝຸດ Baidu
游
游
游
戏
戏
戏
戏
开
选
计
计
始
关
雷
时
图 1 程序基本功能
类名 CMy2_1View
成员函数 leizero( ) Onchuji( )
Onzhongji( ) Ongaoji( ) OnLButtonDown( )
OnRButtonDown( )
OnLButtonUp( ) OnStart() OnTimer( )
功能
显示没有雷的区域
给变量 m_RowCount、m_ColCount、leinum 赋值并初 始化游戏。
给变量 m_RowCount、m_ColCount、leinum 赋值并初 始化游戏。
给变量 m_RowCount、m_ColCount、leinum 赋值并初 始化游戏。
如果在按钮上面,则显示按钮按下位图;如果在扫雷 区,先把按钮位图改为张口位图,再判断按下的是否是 雷,是就结束,重画,以显示所有的雷;否则,重画相 应格子以显示数字。
CRect myrect2(325,10,375,40); pDC->FillRect(myrect2,&mybrush);
CPen mypen; CPen*myoldPen; mypen.CreatePen(PS_SOLID,2,RGB(255,255,255)); myoldPen=pDC->SelectObject(&mypen); pDC->MoveTo(20,40); ········ pDC->LineTo(375,10); for(int i=0;i<m_RowCount;i++) for(int j=0;j<m_ColCount;j++) { ··········· } pDC->SelectObject(myoldPen);
初始化游戏
记录游戏所用时间
表 1 类及其函数功能
三、详细设计
1.添加位图 前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。另外,
为什么不添加一个按钮而用位图呢?是因为即使我们添加了按钮也要添加四幅位图! 位图的 ID 号: 按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU 2、IDB_ANNIU3、 IDB_ANNIU4 雷区位图:14*14 ID 号按下图依次为:IDB_BITMAP14。。。。。。IDB_BITMAP25
CPen mypen2; CPen*myoldPen2; mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0)); myoldPen2=pDC->SelectObject(&mypen2); for(int ii=0;ii<m_RowCount;ii++) for(int jj=0;jj<m_ColCount;jj++)
如果是雷,按右键时,显示旗子,并减少一个剩下
雷数;如果我们认为那旗子的格子不是雷,按右键,显
示问号,并在剩下雷数加上 1。 松开左键时,显示按钮没有按下的位图;再判断,
如果结束,就要显示失败的位图;如果是在按钮上松开 按钮,即表示我们已经按下了重新开始的按钮,必须调 用重新开始函数 OnStart()。