人工智能 扫雷 课程设计报告 联系客服

发布时间 : 星期一 文章人工智能 扫雷 课程设计报告更新完毕开始阅读

00000

01010 00100 00000 00000

搜索的时候就在数组中间这3*3的区域内进行,比如点击了ime(2,2)的区域,也就是显示出来的雷区中的第一块空地,则程序首先需要判断这里有没有雷,然后再计算周围八个区域的雷的情况,将累加结果放到这个区域内,如下: If ime(2,2)=1 then 踩到地雷的代码 else'没踩到地雷 for i=1 to 3 for j=1 to 3

if i=2 and j=2 then next imesum=imesum+ime(i,j)

j++ i++ 这样就统计出了该区域周围雷的数量. 4)为程序添加背景音乐 PlaySound(MAKEINTRESOURCE(IDR_WAVE1),::GetModuleHandle(NULL),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP); 注意:要播放背景音乐必须加入以下两个头文件 #include //导入声音头文件

#pragma comment(lib, \导入声音头文件库

4. 自动扫雷设计

在第一次点击前,所有格子下面有地雷的概率相同,因此随意点击任何一个即可,定义一个IsChange变量,用于循环扫雷。

当某个格子(X)显示的数字(Mine(X))等于它周围被标为地雷的格子的个数,那么它周围未被标示的格子下一定没有地雷。此时可以单击它周围初始状态的格子,或者同时左、右键单击这个显示数字格子。

如果中心点的格子数值与周围不知状态的格子数相等,那么它周围没有被标为地雷的格子下面一定有地雷。此时可以右键单击它周围没有被标为地雷的格子。

以上两步分别对应一个for循环,第一重循环用于标识肯定是雷的格子(即插旗子),第二重循环用于寻找中心点的格子数值与周围不知状态的格子数相等的格子(即根据第一重循环的结果,找到肯定不是雷的格子并单击),如果第一重循环执行了插旗子的动作IsChange=1,第二种循环如果执行了单击的动作IsChange=1;当IsChange!=0时一直执行上两重循环,直到扫完为止,或者出现猜的情况(踩到雷的情况只有在第一步时才有可能出现,也就是说如果第一步不是雷,那么接下来的整盘棋都不会踩到雷)。

4.用户手册

5

运行程序,单击 游戏-->开始 正常情况下可以扫雷成功,偶然情况即出现猜的情

况时给出提示对话框;

程序运行结果:

第一次就踩到雷 扫雷成功

扫雷出现猜的情况如下:

6

结论:此扫雷算法大部分情况可以完成扫雷任务;

主要算法程序代码:

void CMineDlg::OnCommandRestart() { bFail = FALSE; if(bStart) KillTimer(1); bStart = FALSE; LandMine.Reset(LandMine.GetRow(),LandMine.GetCol(),LandMine.GetMineNum()); TimeCount.SetNumber(0); MineCount.SetNumber(LandMine.GetMineNum()); m_Face.SetBitmap(&m_FaceNormal); RedrawWindow(); int i,j; int MineNum=LandMine.GetMineNum(); int IsChange;//用于退出循环 int t,Num,Num1;//Num用于存储获取8邻域MS_EXPLODE状态的个数,t用于获取8领域点的位置 int AllItem=LandMine.GetRow()*LandMine.GetCol(); //获得棋盘的大小,即一位数组的长度 OnLButtonDown(1,CPoint(LandMine.m_aLandMine[0]->m_nX,LandMine.m_aLandMine[0]->m_nY)); //每次都是按下第一个按钮,因为第一次按下哪个概率都是相等的 OnLButtonUp(1,CPoint(LandMine.m_aLandMine[0]->m_nX,LandMine.m_aLandMine[0]->m_nY)); while(MS_EXPLODE && LandMine.m_aLandMine[1]->m_nStatus==MS_NORMAL&&LandMine.m_aLandMine[10]->m_nStatus==MS_NORMAL)

7

{ if (LandMine.m_aLandMine[0]->m_nStatus==MS_EXPLODE) break; LandMine.Reset(LandMine.GetRow(),LandMine.GetCol(),LandMine.GetMineNum()); OnLButtonDown(1,CPoint(LandMine.m_aLandMine[0]->m_nX,LandMine.m_aLandMine[0]->m_nY)); //每次都是按下第一个按钮,因为第一次按下哪个概率都是相等的

OnLButtonUp(1,CPoint(LandMine.m_aLandMine[0]->m_nX,LandMine.m_aLandMine[0]->m_nY)); } do { //第一种情况 IsChange=0; for (i=0;im_nStatus==MS_OPEN && LandMine.m_aLandMine[i]->m_nMineNum>0) //对于打开的按钮来说 { t=LandMine.GetLeft(i);//4邻域 if (t>=0 && LandMine.m_aLandMine[t]->m_nStatus!=MS_OPEN) Num++; t=LandMine.GetTop(i); if (t>=0) { if (LandMine.m_aLandMine[t]->m_nStatus!=MS_OPEN) Num++; t=LandMine.GetLeft(LandMine.GetTop(i)); if (t>=0 && LandMine.m_aLandMine[t]->m_nStatus!=MS_OPEN) Num++; t=LandMine.GetRight(LandMine.GetTop(i)); if (t>=0 && LandMine.m_aLandMine[t]->m_nStatus!=MS_OPEN) Num++; } t=LandMine.GetRight(i); if (t>=0 && LandMine.m_aLandMine[t]->m_nStatus!=MS_OPEN)

8