能力拓展训练-----扫雷游戏
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
程序运行结果如图
6
在课程设计的这段日子里,发现自己有很多的知识还没有掌握好,最先的时候,学习的都是一些基本的理论知识,觉得个人掌握的还是很好的。应用后才发现缺点和不足。
在课程设计中间,出了很多错误,不是把引用弄错了,就是把代码写错地方了。有时候,往往把写在数据层的代码,写到了逻辑层。而在接口层的时候,却发现在其他地方没有定义。点击运行的时候,错误一大片。最后,只有重新开始,最后发现调用函数可以让程序层次清晰很多。
{
// TODO: Add your message handler code here and/or call default
GRID* grid = GetLikeGrid(point);
if(grid != NULL)
{
if(m_Flag == 70)
{
MessageBox("标记已用完!");
if(grid != NULL)
{
grid->m_IsShow = TRUE;
if(grid->m_State == ncMINE)
{
ShowAllMine();
Invalidate();
KillTimer(1);
MessageBox("你输了,请再接再厉!");
if(MessageBox("是否继续新游戏?","系统提示",MB_YESNO
2
Windows XP
MicrosoftVisualC++
3
游戏需要提供两个计数器,一个用来显示用户扫雷所花费的时间,以秒为单位;一个用来显示当前还剩多少个雷方块。另外提供一个按钮,用来开始游戏。在游戏区域方面,按功能将它分成两大区域:雷区和提示区。提示区除了上面提供的计数器外,还包括两个按钮,一个用来开始游戏,一个用来显示版本信息。游戏过程中,当玩家用鼠标点击相应的方块,程序就会做出相应的鼠标响应时间,程序处理这些鼠标时间的过程中会伴随着GDI绘图,而众多鼠标事件的处理,都是围绕着实现扫雷程序的算法而衍生的。
return;
}
if(grid->m_State==ncFLAG)
{
for(int i=0;i<70;i++)
{
if(m_FlagRect[i] == grid->m_Rect)
{
grid->m_State = m_FlagState[i];
m_FlagState[i] = ncUNDOWN;
m_FlagRect[i] = 0;
| MB_ICONQUESTION) == IDYES)
{
OnButstart();
}
else
OnCancel();
}
else if(grid->m_State == ncNULL)
DownNullShow(grid);
Invalidate();
}
CDialog::OnLButtonDown(nFlags, point);
鼠标左击事件流程如下:
void CSweepmineDlg::OnLButtonDown(UINT nFlags, CPoint point)
//单击事件
{
// TODO: Add your message handler code here and/or call default
GRID* grid = GetLikeGrid(point);
4
4.1
图1界面设计图
4.2
4.21布雷
随机获取一个状态为非雷的点,将它的属性标识为雷,重复这样的工作,直到布下足够的累为止,流程图如下
在CMineWind类中添加游戏的布雷模块的处理函数,该函数的具体实现如下所示:
Void CMineWnd::LayMines(UINIT row, UINT col )
}
VoidCSweepmineDlg::OnLButtonDblClk(UINTnFlags,CPointpoint)
//双击事件,进行拓展
{
GRID* grid= GetLikeGrid(point);
if(grid != NULL)
{
int num = IsNumber(grid->m_State);
m_FlagState[m_Flag++] = grid->m_State;
CString str;
str.Format("剩余地雷数:%d",70-m_Flag);
m_Number.SetWindowText(str);
grid->m_State = ncFLAG;
grid->m_IsShow = TRUE;
C#这么语言,是目前世界上非常流行的语言之一。而我学习的只是处在一个入门的位置上。我们需要在今后发更多的时间去了解这门功能强大的语言,之所以应用c#,也是让自己接触更多的编程语言。学习并应用它。让自己有更大的提高。
通过课程设计我发现编程能力要提高,方法很多,最重要的就是练习,可以认真学习教材上面的例题,最后把上面的代码自己写一遍,看看运行的结果和教材给出的结果是否一致。要学会看代码,最好的方法就是看设计器中的代码。通过实践找出一个很好的方法去调试程序,寻找并改正程序中错误。
if(IsWin())
{
KillTimer(1);
MessageBox("你赢了");
if(MessageBox("是否继续新游戏?","系统提示",MB_YESNO
| MB_ICONQUESTION) == IDYES)
{
OnButstart();
}
else
OnCancel();
}
}
}
Invalidate();
grid->m_IsShow = FALSE;
m_Flag--;
CString str;
str.Format("剩余地雷数:%d",70-m_Flag);
m_Number.SetWindowText(str);
}
}
}
else
{Βιβλιοθήκη Baidu
if(grid->m_IsShow == FALSE)
{
m_FlagRect[m_Flag] = grid->m_Rect;
{
Srand ((unsigned)time(NULL));
UINTi, j;
for(UNIT index = 0; index < m_uMineNum;)
{
i =rand()% m _u YNum ;
j=rand()% m _u XNum
if (i==row && j==col)continue;
学 号:
0120810680326
课程设计
题目
学院
计算机学院
专业
软件工程
班级
0803班
姓名
徐泽前
指导教师
2010
年
7
月
15
日
扫雷游戏
1
游戏开始后,系统会在雷区的小方块中随机布下若干个地雷。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中雷方块的数量,玩家可以根据这些信息去半段时候可以打开某些方块,并把认为是地雷的方块打上标记,当玩家吧所有地雷找出来后,其余非雷方块区域都已打开,这时游戏结束。在游戏过程中一旦错误的打开了雷方块则立即失败,游戏结束;当玩家标识的地雷数量超过程序设定,虽然打开了全部其余方块,游戏仍不会结束。
}
CDialog::OnRButtonDown(nFlags, point);
}
关键技术:在设计扫雷游戏时,现在对话框中绘制软件的背景位图,绘制的位图是以一个网格为单位的,然后在网格中随机布雷,并通过算法计算无雷网格中应该显示的数据。如果当前网格周围的8个网格中没有地雷,则显示为空地,否则,周围的8个网格中有几个地雷则显示数字几,当用户翻开空地时,会自动翻开空地周围的数字,通过鼠标右键可以标记地雷,并可以取消地雷标记,用户胜利的条件是将所有得嘞都标记出来。如果标记的地雷为止都是地雷的位置则游戏胜利,标记数和地雷数是相同的,所以当标记用完而游戏还没有结束时,说明标记的地雷有错误,这样扫雷游戏结束
if(m _pMines[i][j].uAttrib !=ATTRIB_MINE)
{
m _pMines[i][j].uAttrib =ATTRIB_MINEl
index++;
}
}
}
4.22扫雷
当布雷完毕后,接下来就是扫雷了,从开始扫雷到游戏结束的整个过程中,游戏会根据鼠标的不同动作,做出相应的计算以及反馈。也就是说,只需要将算法加载到各种鼠标的时间处理中,就可以实现整个游戏的核心。接下来就分析不同的鼠标时间,应该做出什么样的计算处理。
if(num != 9)
{
grid->m_IsShow = TRUE;
DblClkNum(grid,num);
}
Invalidate();
}
CDialog::OnLButtonDblClk(nFlags, point);
}
鼠标右击事件:
void CSweepmineDlg::OnRButtonDown(UINT nFlags, CPoint point)
程序运行结果如图
6
在课程设计的这段日子里,发现自己有很多的知识还没有掌握好,最先的时候,学习的都是一些基本的理论知识,觉得个人掌握的还是很好的。应用后才发现缺点和不足。
在课程设计中间,出了很多错误,不是把引用弄错了,就是把代码写错地方了。有时候,往往把写在数据层的代码,写到了逻辑层。而在接口层的时候,却发现在其他地方没有定义。点击运行的时候,错误一大片。最后,只有重新开始,最后发现调用函数可以让程序层次清晰很多。
{
// TODO: Add your message handler code here and/or call default
GRID* grid = GetLikeGrid(point);
if(grid != NULL)
{
if(m_Flag == 70)
{
MessageBox("标记已用完!");
if(grid != NULL)
{
grid->m_IsShow = TRUE;
if(grid->m_State == ncMINE)
{
ShowAllMine();
Invalidate();
KillTimer(1);
MessageBox("你输了,请再接再厉!");
if(MessageBox("是否继续新游戏?","系统提示",MB_YESNO
2
Windows XP
MicrosoftVisualC++
3
游戏需要提供两个计数器,一个用来显示用户扫雷所花费的时间,以秒为单位;一个用来显示当前还剩多少个雷方块。另外提供一个按钮,用来开始游戏。在游戏区域方面,按功能将它分成两大区域:雷区和提示区。提示区除了上面提供的计数器外,还包括两个按钮,一个用来开始游戏,一个用来显示版本信息。游戏过程中,当玩家用鼠标点击相应的方块,程序就会做出相应的鼠标响应时间,程序处理这些鼠标时间的过程中会伴随着GDI绘图,而众多鼠标事件的处理,都是围绕着实现扫雷程序的算法而衍生的。
return;
}
if(grid->m_State==ncFLAG)
{
for(int i=0;i<70;i++)
{
if(m_FlagRect[i] == grid->m_Rect)
{
grid->m_State = m_FlagState[i];
m_FlagState[i] = ncUNDOWN;
m_FlagRect[i] = 0;
| MB_ICONQUESTION) == IDYES)
{
OnButstart();
}
else
OnCancel();
}
else if(grid->m_State == ncNULL)
DownNullShow(grid);
Invalidate();
}
CDialog::OnLButtonDown(nFlags, point);
鼠标左击事件流程如下:
void CSweepmineDlg::OnLButtonDown(UINT nFlags, CPoint point)
//单击事件
{
// TODO: Add your message handler code here and/or call default
GRID* grid = GetLikeGrid(point);
4
4.1
图1界面设计图
4.2
4.21布雷
随机获取一个状态为非雷的点,将它的属性标识为雷,重复这样的工作,直到布下足够的累为止,流程图如下
在CMineWind类中添加游戏的布雷模块的处理函数,该函数的具体实现如下所示:
Void CMineWnd::LayMines(UINIT row, UINT col )
}
VoidCSweepmineDlg::OnLButtonDblClk(UINTnFlags,CPointpoint)
//双击事件,进行拓展
{
GRID* grid= GetLikeGrid(point);
if(grid != NULL)
{
int num = IsNumber(grid->m_State);
m_FlagState[m_Flag++] = grid->m_State;
CString str;
str.Format("剩余地雷数:%d",70-m_Flag);
m_Number.SetWindowText(str);
grid->m_State = ncFLAG;
grid->m_IsShow = TRUE;
C#这么语言,是目前世界上非常流行的语言之一。而我学习的只是处在一个入门的位置上。我们需要在今后发更多的时间去了解这门功能强大的语言,之所以应用c#,也是让自己接触更多的编程语言。学习并应用它。让自己有更大的提高。
通过课程设计我发现编程能力要提高,方法很多,最重要的就是练习,可以认真学习教材上面的例题,最后把上面的代码自己写一遍,看看运行的结果和教材给出的结果是否一致。要学会看代码,最好的方法就是看设计器中的代码。通过实践找出一个很好的方法去调试程序,寻找并改正程序中错误。
if(IsWin())
{
KillTimer(1);
MessageBox("你赢了");
if(MessageBox("是否继续新游戏?","系统提示",MB_YESNO
| MB_ICONQUESTION) == IDYES)
{
OnButstart();
}
else
OnCancel();
}
}
}
Invalidate();
grid->m_IsShow = FALSE;
m_Flag--;
CString str;
str.Format("剩余地雷数:%d",70-m_Flag);
m_Number.SetWindowText(str);
}
}
}
else
{Βιβλιοθήκη Baidu
if(grid->m_IsShow == FALSE)
{
m_FlagRect[m_Flag] = grid->m_Rect;
{
Srand ((unsigned)time(NULL));
UINTi, j;
for(UNIT index = 0; index < m_uMineNum;)
{
i =rand()% m _u YNum ;
j=rand()% m _u XNum
if (i==row && j==col)continue;
学 号:
0120810680326
课程设计
题目
学院
计算机学院
专业
软件工程
班级
0803班
姓名
徐泽前
指导教师
2010
年
7
月
15
日
扫雷游戏
1
游戏开始后,系统会在雷区的小方块中随机布下若干个地雷。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中雷方块的数量,玩家可以根据这些信息去半段时候可以打开某些方块,并把认为是地雷的方块打上标记,当玩家吧所有地雷找出来后,其余非雷方块区域都已打开,这时游戏结束。在游戏过程中一旦错误的打开了雷方块则立即失败,游戏结束;当玩家标识的地雷数量超过程序设定,虽然打开了全部其余方块,游戏仍不会结束。
}
CDialog::OnRButtonDown(nFlags, point);
}
关键技术:在设计扫雷游戏时,现在对话框中绘制软件的背景位图,绘制的位图是以一个网格为单位的,然后在网格中随机布雷,并通过算法计算无雷网格中应该显示的数据。如果当前网格周围的8个网格中没有地雷,则显示为空地,否则,周围的8个网格中有几个地雷则显示数字几,当用户翻开空地时,会自动翻开空地周围的数字,通过鼠标右键可以标记地雷,并可以取消地雷标记,用户胜利的条件是将所有得嘞都标记出来。如果标记的地雷为止都是地雷的位置则游戏胜利,标记数和地雷数是相同的,所以当标记用完而游戏还没有结束时,说明标记的地雷有错误,这样扫雷游戏结束
if(m _pMines[i][j].uAttrib !=ATTRIB_MINE)
{
m _pMines[i][j].uAttrib =ATTRIB_MINEl
index++;
}
}
}
4.22扫雷
当布雷完毕后,接下来就是扫雷了,从开始扫雷到游戏结束的整个过程中,游戏会根据鼠标的不同动作,做出相应的计算以及反馈。也就是说,只需要将算法加载到各种鼠标的时间处理中,就可以实现整个游戏的核心。接下来就分析不同的鼠标时间,应该做出什么样的计算处理。
if(num != 9)
{
grid->m_IsShow = TRUE;
DblClkNum(grid,num);
}
Invalidate();
}
CDialog::OnLButtonDblClk(nFlags, point);
}
鼠标右击事件:
void CSweepmineDlg::OnRButtonDown(UINT nFlags, CPoint point)