扫雷游戏程序设计课程设计报告.docx
《扫雷游戏程序设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《扫雷游戏程序设计课程设计报告.docx(37页珍藏版)》请在冰豆网上搜索。
![扫雷游戏程序设计课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/16/f1c91e3a-2c0c-45a5-a8e2-477d3732a3a8/f1c91e3a-2c0c-45a5-a8e2-477d3732a3a81.gif)
扫雷游戏程序设计课程设计报告
课程设计
设计题目
扫雷游戏程序设计
学生姓名
学号
专业班级
指导教师
2013年11月5日
设计题目
扫雷游戏程序设计
成绩
课
程
设
计
主
要
内
容
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
参考系统自带的扫雷程序,自行开发设计一款扫雷游戏。
要求:
(1)鼠标左击排雷,右击插小旗,打问号;
(2)方格里面的数字表示方格周围的雷数;
(3)能够显示未标记雷数和游戏用时;
(4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。
在任何情况下单击小脸可以重新开始游戏;
(5)可进行游戏难度的设定:
包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;
(6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。
指
导
教
师
评
语
建议:
从学生的工作态度、工作量、设计(论文)的创造性、学术性、实用性及书面表达能力等方面给出评价。
签名:
200年月日
合肥工业大学课程设计任务书
一.设计任务
(1)鼠标左击排雷,右击插小旗,打问号;
(2)方格里面的数字表示方格周围的雷数;
(3)能够显示未标记雷数和游戏用时;
(4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。
在任何情况下单击小脸可以重新开始游戏;
(5)可进行游戏难度的设定:
包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;
(6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。
二.具体设计
(一)、设计思路
扫雷游戏是很经典也很有趣的一款游戏,这次的游戏程序设计要求设计出功能与原游戏相近的一款游戏,首先定义变量和类要画出游戏方格以及位图,设计游戏等级,等级越高方格越多雷数也越多;然后设置随机布雷以保证每次重新开始游戏都有不同的雷区地图;另外定义鼠标左击扫雷,左击标记周围埋雷情况,右击奇数次排雷偶数次取消上次排雷,以及扫雷第一次左击不能扫到雷。
类名
成员类别
类型
成员名
描述
CMyView
属性
int
leftnum
剩下雷数
int
leinum
雷数
int
n
定义格数
int
jieshu
结束
int
realnum
真实雷数
int
secondstart
开始计时
int
m_RowCount
行
int
m_ColCount
列
short
second
计时
CBitmap
m_Bitmap[12]
位图数组
CBitmap
m_anniu[4]
按钮数组
Lei
lei[50][50]
最大雷区
方法
afx_msgvoid
OnTimer(UINTnIDEvent)
计时器函数
afx_msgvoid
OnLButtonDown(UINT,CPoint)
左键按下消息
afx_msgvoid
OnStart()
开始函数
afx_msgvoid
OnLButtonUp(UINT,CPoint)
左键抬起消息
afx_msgvoid
OnRButtonDown(UINT,CPoint)
右键按下消息
afx_msgvoid
OnEasy()
简单模式函数
afx_msgvoid
OnMiddle()
中等模式函数
afx_msgvoid
OnHard()
困难模式函数
afx_msgint
OnCreate(LPCREATESTRUCT)
创建窗口函数
Lei
属性
int
weitu
标志位图
int
shumu
标志状态
(二)、设计表示:
(三)、实现功能
1、鼠标左击排雷,右击插小旗,打问号;
2、方格里面的数字表示方格周围的雷数;
3、能够显示未标记雷数和游戏用时;
4、雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。
在任何情况下单击小脸可以重新开始游戏;
5、可进行游戏难度的设定:
包括预定义的难度级别(雷区行数,列数和雷数);
6、任何时候开始游戏第一次点击不会扫到雷。
由于时间等原因未完成功能:
排行榜和自行定义雷区行数,列数和雷数功能。
(四)、详细设计
1、添加位图
前十二幅是在雷区的,后四幅是按钮。
为了便于加载,必须各自保证其连续性。
分别表示游戏进行的状态、结果胜利或触雷。
2、预设等级方格数雷数变化
voidCMywqq20112074View:
:
OnEasy()/////////////////////////////初级
{
m_RowCount=10;//行数10
m_ColCount=10;//列数10
leinum=10;
realnum=leinum;
SetTimer(1,50,NULL);
//TODO:
Addyourcommandhandlercodehere
second=0;//计时
secondstart=0;//1时开始计时
//num=0;
leftnum=leinum;//剩余雷数
jieshu=0;//jieshu=1时停止
intaa=0;
//初始化0
for(inti=0;i{
for(intj=0;j{
lei[i][j].shumu=0;
lei[i][j].weitu=0;
}
}
//设置10个雷
CMywqq20112074View:
:
OnMiddle()//////////////////////////////////中级
{
m_RowCount=15;//行数15
m_ColCount=15;//列数15
leinum=40;
realnum=leinum;
SetTimer(1,50,NULL);
//TODO:
Addyourcommandhandlercodehere
second=0;//计时
secondstart=0;//1时开始计时
//num=0;
leftnum=leinum;//剩余雷数
jieshu=0;//jieshu=1时停止
intaa=0;
//初始化0
for(inti=0;i{
for(intj=0;j{
lei[i][j].shumu=0;
lei[i][j].weitu=0;
}
}
//设置40个雷
voidCMywqq20112074View:
:
OnHard()///////////////////////////////////////////高级
{
m_RowCount=25;//行数25
m_ColCount=16;//列数16
leinum=80;
realnum=leinum;
SetTimer(1,50,NULL);
//TODO:
Addyourcommandhandlercodehere
second=0;//计时
secondstart=0;//1时开始计时
//num=0;
leftnum=leinum;//剩余雷数
jieshu=0;//jieshu=1时停止
intaa=0;
//初始化0
for(inti=0;i{
for(intj=0;j{
lei[i][j].shumu=0;
lei[i][j].weitu=0;
}
}
//设置80个雷
do
{
intk=rand()%m_RowCount;
intl=rand()%m_ColCount;
if(lei[k][l].shumu!
=-1)
{
lei[k][l].shumu=-1;
aa++;
}
}while(aa!
=leinum);
3、第一次点击不会扫到雷
if(lei[a][b].weitu==0||lei[a][b].weitu==3)
{
for(;n==0&&lei[a][b].shumu==-1;)//////////////踩到第一个雷
{
intaa=0;
//初始化0
for(inti=0;i{
for(intj=0;j{
lei[i][j].shumu=0;
lei[i][j].weitu=0;
}
}
do
{
intk=rand()%m_RowCount;
intl=rand()%m_ColCount;
if(lei[k][l].shumu!
=-1)
{
lei[k][l].shumu=-1;
aa++;
}
}while(aa!
=leinum);
//给方格赋值
for(inta=0;afor(intb=0;bif(lei[a][b].shumu==0)
{
for(intc=a-1;cfor(intd=b-1;d
if(c>=0&&c=0&&dlei[a][b].shumu++;
}
}
4、鼠标右击插小旗,打问号
第一次用右键单击某个区域时,该区域上插上一面小红旗,此时单击左键没有任何变化,第二次用右键单击时恢复原状。
//判断显示什么位图
//weitu=1已按下的数字区
//weitu=2显示旗
//weitu=3显示问号
for(inta=0;afor(intb=0;b{if(lei[a][b].weitu==1)
{
Dc.SelectObject(m_Bitmap[lei[a][b].shumu]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);
}if(lei[a][b].weitu==2)
{Dc.SelectObject(m_Bitmap[9]);
pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);
}if(lei[a][b].weitu==3)