发布时间 : 星期日 文章人工智能 扫雷 课程设计报告更新完毕开始阅读
人工智能project报告
学号:20091000608 姓名:王沙沙 班级:191091 指导老师:赵老师
2011年10月25
1
目录
1.自动扫雷…………………………………………………………3 需求分析??????????????????????3 游戏规则??????????????????????3 扫雷游戏设计????????????????????3 自动扫雷设计????????????????????5
用户手册??????????????????????5 运行结果??????????????????????6 结论????????????????????????7 主要算法代码????????????????????72
1 自动扫雷
1.问题描述、需求分析
扫雷是Windows操作系统自带的桌面小游戏之一,由于其规则简单,长期以来一直受到电脑用户的欢迎。自动扫雷是开始扫雷后根据扫雷规则利用计算机进行扫雷。 开始棋局,单击第一个按钮,因为执行第一个动作时所有按钮是雷的概率都相等,为了方便起见每次开局后都按下第一个按钮,如果不幸第一个按钮就是雷,那么单击--开始--重新开局。
2.游戏规则
游戏界面如下图所示,游戏区域是由M X N个格子组成的“雷区”,左上方的数字显示雷区中未被标出的地雷的个数,右上方的数字显示用户从第一次点击开始所用的时间,单位是秒。中间的图标指示游戏的状态(完成:笑脸;失败:哭脸)。用户需要通过鼠标操作来确定雷区中所有地雷的位置:
左键单击:尝试某个格子是否有地雷。如果该格子下有地雷,则游戏失败·如果该格子下没有地雷但其周围八个格子下有地雷,该格子会显示其周围八个格子中地雷的个数;如果该格子下没有地雷且其周围八个格子下也没有地雷,则此处被挖开。右键单击:改变某个格子是否有雷的标志(工)。或左右键同时单击:当该格子周围已标地雷的个数与格子中的数字相同时,则挖开周围的其余格子。当提示该格子周围已标地雷的个数少于格子;
3.扫雷游戏设计
每个格子有如下几种状态:
{MS_NORMAL,MS_OPEN,MS_FLAG,MS_QUEST,MS_EXPLODE} MINESTATUS 1)格子类
共有变量如下:
MINESTATUS m_nStatus;//格子状态
int m_nMineNum;//格子周围的雷数,即格子上显示的数字 CWnd *m_pParent;//父窗口
int m_nX,m_nY; //按下按钮的横纵坐标 成员函数
SetStatus(MINESTATUS nStatus)//设置状态 GetStatus()//获取状态
3
SetMineNum(int nMineNum)//设置雷数 GetMineNum() //获取雷数
DrawItem(BOOL bFail=TRUE);//绘制格子
2)布雷类
共有变量如下
int m_nRow,m_nCol;//棋盘有多少行多少列 int m_nMineNum; //棋盘上的雷数 int m_nX,m_nY; //棋盘的位置 int m_nOldMine; int m_aMineTest[9]; int m_nMineTest;
CMineButton *m_aLandMine[10000]; //棋盘 CWnd *m_pParent;
成员函数 Create(int nRow,int nCol,int nMineNum,int nX,int nY,CWnd *pParent); Reset(int nRow,int nCol,int nMineNum);//重新布局 ReDraw(BOOL bFail);//刷新棋局
LButtonDown(CPoint point);//左键按下
BothButtonDown(CPoint point);//左键与右键同时按下 RButtonDown(CPoint point);//右键按下
MouseMove(CPoint point,int bBothDown);//鼠标移动 LButtonUp(CPoint point);//左键弹起
BothButtonUp(CPoint point);//左键与右键同时弹起 OpenMine(int nCurMine);//开局函数 IsSuccess(); //判断是否扫雷成功 RndBtShdDn(int nCurMine); GetMineNum()//获取棋盘的雷数
GetRight(int nCurMine)//获取四邻域的中心点像素正右方像素点的位置 GetLeft(int nCurMine)//获取四邻域的中心点像素正下左像素点的位置 GetTop(int nCurMine)//获取四邻域的中心点像素正上方像素点的位置 GetBot(int nCurMine)//获取四邻域的中心点像素正下方像素点的位置
3)布雷算法 :
首先定义一个n*n的二维数组,该数组的i-1到i+1,j-1到j+1除去i,j本身。值为周 围有几个雷。如果该数组的值为10则本身是雷。然后自动生成m个雷,让这m个雷分布在界面上。被选中的值i,j点的值为10,从i-1到i+1,从j-1到j+1的值都+1;然后在界面上想办法区分出n*n个格子,然后把格子的坐标和二维数组关联起来做扫雷那首先一定是生成一个矩阵,比如10*10的区域,里面再用数字来表示有没有雷用一个结构体数组保存雷的隐藏,翻开和标志情况关于你所说的扩展,我想是不是数组的边界问题?到了数组边界上,遇到下标越界错误,为矩阵再加一道边界比如你要生成3*3的雷区,而实际上,需要定义5*5的数组,而数组的四周定义为没有雷的空地,如下:0代表空地,1代表雷
4