第5讲 综合应用-自动扫雷器_第1页
第5讲 综合应用-自动扫雷器_第2页
第5讲 综合应用-自动扫雷器_第3页
第5讲 综合应用-自动扫雷器_第4页
第5讲 综合应用-自动扫雷器_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、算法分析与设计算法分析与设计第5讲 综合应用自动扫雷器2知识点、Windows、自动扫雷器的、程序4.1 4.2 4.3 显示两个窗口、计算扫雷游戏地图和4.4、决策前的5.1 5.2 5.3、6.1 6.2 3一、Windows扫雷游戏程序: 鼠标左右键的作用: 鼠标:; 鼠标:; 鼠标:见下一页。: 在中,需要向扫雷程序,达到或的功能。4 鼠标:如果单击的位置周围 ,则()。 思考:鼠标左右键同时单击下图中,会有什么?5思考:人在玩扫雷游戏时,会采用哪些。6期末作品参考: 模仿Windows扫雷游戏,用,其和可参考Windows扫雷游戏。7二、两个参考程序: 软件名称: 作者:。 开发工具

2、:。 特点:需要,当算法不能继续时,需要。 说明:该程序为。8: 软件名称:。 作者:。 开发工具:未知。 特点:以替代。功能更全面,甚至。9三、自动扫雷器的原理: 启动扫雷游戏后,当用户点击“扫雷”按钮时,通过每个方格(1616),跟的进行,从而。10: 根据每个方格状态的信息进行(包括和),从而,或者。: 某次决策后: 如果判定,则提示“”。 如果,则提示“”。 如果某次决策,则提示“”,请求用户。11:决策例子: 请试着根据下图所显示的判断,。12补充:Windows画图应用程序妙用: 将一个用画图软件打开,然后放大,可以清晰地观察到。 可以,可以。 在状态栏中可以显示当前,所选等。13

3、在中的作用: 扫雷游戏程序和自动扫雷器窗口大小分别是多少个像素,标题栏和菜单栏高度是多少个像素,边框高度或宽度是多少个像素,等等。 每个方格1616区域具体包含了哪些像素。 提取每个方格第8行16个像素的颜色,第8行具体是哪一行。等等。14补充:其他工具软件的应用(绿色) :色值传递员(plsread)。(绿色)。(绿色)。(绿色)。以上软件均已上传到中。15补充:像素是由组成。行和列上的像素序号。 在Windows应用程序中打开一幅(*.bmp),然后,并,可以。为1280800,则意味着水平方向上为,竖直方向上为。: 许多GDI的也是像素。16补充:坐标系:坐标系原点在。:坐标系原点在。:

4、 API函数:。xxyy扫雷游戏窗口中某一个点的客户区坐标为,其屏幕坐标可能为。17补充:屏幕坐标和区域: 屏幕坐标:。 与Windows中的结构体(即API中的结构体)类似,增加了很多成员函数。: 区域:。 与Windows中的结构体(即API中的结构体)类似,增加了很多成员函数。typedef struct tagPOINTLONG x;LONG y;POINT;typedef struct tagRECTLONG left;LONG top;LONG right;LONG bottom;RECT;18补充:MFC/SDK的数据类型与C/C+的数据类型,Microsoft Foundati

5、on Class Library。,Windows Software Development Kit。在SDK应用程序中,采用API函数来实现程序功能。所以也就是的应用程序。,为了跟其他计算机语言中的数据类型相区别,特意。: BOOL、BSTR、BYTE、COLORREF、DWORD、LONG、LPARAM、LPCSTR、LPSTR、LPCTSTR、LPTSTR、LPVOID、LRESULT、UINT、WNDPROC、WORD、WPARAM、POSITION、LPCRECT等等。: 每种数据类型的含义及所占字节数请查阅。: 在MFC/SDK中。19补充:颜色在计算机中的表示: 在计算机中,颜色

6、是用、3个分量来表示的,每个分量取值为,可以用一个字节来存储。因此,RGB一共可以表示种颜色。: 在Windows操作系统中,使用数据类型来表示RGB颜色。COLORREF占、,用16进制来表示是,即最高字节不用,次高字节表示B分量、次低字节表示G分量,最低字节表示R分量。 在有的时候(比如在调试状态下),COLORREF是以形式显示的,比如白色()的值为。: API函数可以获得屏幕上指定位置的颜色值,返回的是。20: 常用颜色列表:RGB值COLORREF颜色中文名称0 x000 x000 x000 x000 x000 x000 x000 x000 x000 x000 x000 x000 x

7、000 x000 x000 x00注意,在COLORREF数据中,是按BGR的顺序从高位到低位存放的。这16种颜色也是。21四、程序界面采用的技术和方法: 自动扫雷器界面:的应用程序。22: CMineCrackDlg类自定义和含义及功能。:BOOL m_bWin98;/操作系统是否为Win98、Win2003的标志变量CString winMineClassName;/扫雷游戏程序窗口类名HWND hWinMineWnd;/扫雷游戏窗口句柄CRect rectWinMine;/扫雷游戏窗口区域CRect rectMe;/本程序窗口区域BOOL m_bStart; /扫雷游戏是否启动的标志in

8、t m_nWidth;/扫雷游戏水平方向上方格的数目(即列数),高级是16行30列int m_nHeight;/扫雷游戏竖直方向上方格的数目(即行数)int m_nMineNum;/地雷的个数int m_nMineCurNum;/当前已标记出的地雷数目/申请m_nWidthm_nHeight大小的存储空间/每个元素代表一个位置,取值为0FF,分别代表一种状态BYTE *m_map;BYTE m_ColorSample168;/预先存储的扫雷游戏方格16种状态的颜色4.0 数据成员和函数成员说明23: 数据成员说明:和中的扫雷应用窗口有一些细微差别:Win98、Win2003中的扫雷程序窗口、。

9、 在时要区分Win98、Win2003系统和其他系统。BOOL m_bWin98;CString winMineClassName;HWND hWinMineWnd;CRect rectWinMine;CRect rectMe;BOOL m_bStart;int m_nWidth;int m_nHeight;int m_nMineNum;int m_nMineCurNum;BYTE *m_map;BYTE m_ColorSample168;24: 数据成员、说明:扫雷游戏上有多少个方格。:扫雷游戏上有多少个方格。 数数水平和竖直方向上分别有多少个方格。BOOL m_bWin98;CString

10、 winMineClassName;HWND hWinMineWnd;CRect rectWinMine;CRect rectMe;BOOL m_bStart;int m_nWidth;int m_nHeight;int m_nMineNum;int m_nMineCurNum;BYTE *m_map;BYTE m_ColorSample168;25BOOL m_bWin98;CString winMineClassName;HWND hWinMineWnd;CRect rectWinMine;CRect rectMe;BOOL m_bStart;int m_nWidth;int m_nHei

11、ght;int m_nMineNum;int m_nMineCurNum;BYTE *m_map;BYTE m_ColorSample168;: 数据成员说明: 在启动(含重新开具)扫雷游戏时,并用m_map指向这段存储空间。 一维数组存储空间。 m_map数组元素取值含义:#define UNKNOW0 x00/未知#define NOMINE0 xFF/确定没有地雷#define ISMINE0 x0F/确定为地雷#define NEIGHBOR_10 x01/数字1/即该位置没有地雷,但周围8个方向上有1颗地雷(以下同)#define NEIGHBOR_20 x02/数字2#define

12、 NEIGHBOR_30 x03/数字3#define NEIGHBOR_40 x04/数字4#define NEIGHBOR_50 x05/数字5#define NEIGHBOR_60 x06/数字6#define NEIGHBOR_70 x07/数字7#define NEIGHBOR_80 x08/数字8m_map = new BYTE m_nWidth*m_nHeight ;ZeroMemory( m_map, m_nWidth*m_nHeight );/系统函数,清零内存空间26BOOL m_bWin98;CString winMineClassName;HWND hWinMineWn

13、d;CRect rectWinMine;CRect rectMe;BOOL m_bStart;int m_nWidth;int m_nHeight;int m_nMineNum;int m_nMineCurNum;BYTE *m_map;BYTE m_ColorSample168;: 数据成员数组说明: 数组大小是,数据类型是(字节);16种状态中间的“颜色”。0case RGB(128, 0, 0): ret = 0 x01; break;/栗色-1case RGB( 0, 128, 0): ret = 0 x02; break;/深绿色-2case RGB(128, 128, 0): re

14、t = 0 x03; break;/橄榄色-3case RGB( 0, 0, 128): ret = 0 x04; break;/海军蓝色-4case RGB(128, 0, 128): ret = 0 x05; break;/紫色-5case RGB( 0, 128, 128): ret = 0 x06; break;/水鸭色-6case RGB(128, 128, 128): ret = 0 x07; break; /灰色-7case RGB(192, 192, 192): ret = 0 x08; break; /银白色-8case RGB(255, 0, 0): ret = 0 x09

15、; break;/红色-9case RGB( 0, 255, 0): ret = 0 x0A; break;/绿色-10case RGB(255, 255, 0): ret = 0 x0B; break; /黄色-11case RGB( 0, 0, 255): ret = 0 x0C; break;/蓝色-12case RGB(255, 0, 255): ret = 0 x0D; break; /洋红色-13case RGB( 0, 255, 255): ret = 0 x0E; break; /青色-14case RGB(255, 255, 255): ret = 0 x0F; break;

16、 /白色-15return ret;m_ColorSample 1 0 = 0 x78;/NEIGHBOR_1m_ColorSample 1 1 = 0 x88;m_ColorSample 1 2 = 0 x88;m_ColorSample 1 3 = 0 x8c;m_ColorSample 1 4 = 0 xcc;m_ColorSample 1 5 = 0 x88;m_ColorSample 1 6 = 0 x88;m_ColorSample 1 7 = 0 x88;28:void StartGame( );/启动扫雷游戏BOOL ScanTheMap( );/扫雷游戏地图,标记每个位置的状

17、态BOOL ScanTheMap98( ); /Win98、Win2003系统下扫描游戏地图(没有实现)/在m_ColorSample中查找与位置pt(开始的16个像素)颜色匹配的状态int GetColorSample( CPoint pt );BYTE Color256To16( COLORREF colorref ); /RGB颜色到16种颜色编号的转换BOOL MakeDecision( BOOL *, BOOL * );/普通决策,返回:1,成功;0:继续BOOL AdvanceDecision( BOOL *, BOOL * ); /高级决策/统计(i,j)位置周围8个位置上已标记

18、为地雷的位置个数/并将8个相邻位置中未标记为地雷的位置放入数组ptrarr中void LookAroundDot( int, int, void *, int * );/从位置数组ptrarr中查找位置pt,找到返回其下标,找不到则返回-1int LookUpFromArray( const void *, CPoint );29:和机制。304.1 获取并显示操作系统的版本号OnInitDialog( )函数函数:API函数用于获取操作系统的版本。 GetVersion函数的用法及例子请参考MSDN。:将操作系统版本信息显示在对话框的中。31如果想实现某个功能,但不知道该调用哪个API函数或

19、MFC中的函数,该怎么办?: 通过等搜索引擎查找网友发布的类似问题、解决方法、例子等。 关键字:。: 通过查找函数的功能及使用方法。: 查阅。324.2 启动扫雷游戏StartGame( )函数函数: 通过API函数来。: 如果扫雷游戏未启动,则: 获得; 获得扫雷程序的; 通过API函数来。33:程序界面采用的其他技术:,如果是,则。 (如果扫雷游戏窗口被其他窗口遮住了,则)。 激活扫雷游戏窗口,使之为。344.3 并排居中显示两个窗口 StartGame( )函数函数 计算扫雷游戏地图行数和列数:效果:35:屏幕及程序界面尺寸:为:(取决于系统设置)。为:。 扫雷游戏宽度(或高度)为: 个

20、像素。(Win2000和WinXP系统)高度为:个像素。 每个为:像素。 扫雷游戏(去掉标题栏和菜单栏,以及边框)大小为:。 客户区中,大小的区域用来显示方格(高级扫雷模式);这个区域有个像素宽度的空余区域,有 个像素宽度的空余区域,个像素高度的区域用来显示剩余地雷数和时间等信息,有 个像素高度的空余区域。36、等。37:扫雷游戏地图的为:为:384.4 开启新局 StartGame( )函数函数: 在扫雷程序中,可以通过、3种方式。: 本程序通过API函数向扫雷程序,开启新局。39五、决策前的准备:,。:在后续的需要根据这些方格的状态信息进行和。40: 经过扫描后,每个方格在m_map数组中

21、的值为以下:、。#define UNKNOW0 x00/未知#define NOMINE0 xFF/确定没有地雷#define ISMINE0 x0F/确定为地雷#define NEIGHBOR_10 x01/数字1/即该位置没有地雷,但周围8个方向上有1颗地雷(以下同)#define NEIGHBOR_20 x02/数字2#define NEIGHBOR_30 x03/数字3#define NEIGHBOR_40 x04/数字4#define NEIGHBOR_50 x05/数字5#define NEIGHBOR_60 x06/数字6#define NEIGHBOR_70 x07/数字7#d

22、efine NEIGHBOR_80 x08/数字841:在自动扫雷之前,将扫描结果中: 思考:怎么实现?425.1 扫描地图: 对每行、每列上的每个方格,提取的颜色,并跟进行比对,从而。: 3个函数:函数:BOOL CMineCrackDlg:ScanTheMap( ) /扫雷游戏地图,标记每个位置的状态int i, j, ret;CPoint pt; BOOL finish = FALSE;/游戏是否结束(踩到了地雷)的标志for( i=0; im_nHeight; i+ )/行for( j=0; jm_nWidth; j+ ) /列43if( m_map i*m_nWidth + j !=

23、 0 ) continue;pt = CPoint( 12 + j*BMPWIDTH, 55 + i*BMPHEIGHT + 7 );ret = (pt);switch( ret )case 0: m_map i*m_nWidth + j = NOMINE; break;case 1: m_map i*m_nWidth + j = NEIGHBOR_1; break;case 2: m_map i*m_nWidth + j = NEIGHBOR_2; break;case 3: m_map i*m_nWidth + j = NEIGHBOR_3; break;case 4: m_map i*m

24、_nWidth + j = NEIGHBOR_4; break;case 5: m_map i*m_nWidth + j = NEIGHBOR_5; break;case 6: m_map i*m_nWidth + j = NEIGHBOR_6; break;case 7: m_map i*m_nWidth + j = NEIGHBOR_7; break;case 8: m_map i*m_nWidth + j = NEIGHBOR_8; break;case 9: m_map i*m_nWidth + j = NOMINE; break;case 10: finish = TRUE; bre

25、ak;/这3种情况均表示踩到地雷case 11: finish = TRUE; break;case 12: finish = TRUE; break;case 13: m_map i*m_nWidth + j = UNKNOW; break;case 14: m_map i*m_nWidth + j = ISMINE; break;case 15: m_map i*m_nWidth + j = UNKNOW; break;if( finish ) return FALSE;else return TRUE;44/在m_ColorSample中查找与位置pt(开始的16个像素)颜色匹配的状态/

26、通过这种方法来辨别pt位置是没有地雷、显示数字18等等情况,详见位图Sign.bmpint CMineCrackDlg:GetColorSample( CPoint pt )BYTE ptrColor8;COLORREF colorref1, colorref2;int i;HDChDC = :GetDC( NULL );memset(ptrColor, 0, 8);:ClientToScreen( hWinMineWnd, &pt );/提取中间第8行上16个像素的颜色,压缩成8个字节for( i=0; i8; i+ )colorref1 = :GetPixel(hDC, pt.x+

27、i*2, pt.y);colorref2 = :GetPixel(hDC, pt.x+i*2+1, pt.y);/转换成16色后只有低4位有效BYTE tmp1 = (colorref1);BYTE tmp2 = (colorref2);/取tmp1低4位+tmp2低4位凑成1个字节;函数说明:1.注意:tmp1和tmp2均为BYTE,且取值为0F,即、高4位全为0。2.tmp14:把tmp1,。3.| tmp2:将前面的结果“与”上tmp2,实际上是。45:ReleaseDC( NULL, hDC );/与预存的16种状态比对,从而判断该位置处于什么状态for( i=0; i0case RG

28、B(128, 0, 0): ret = 0 x01; break;/栗色-1case RGB( 0, 128, 0): ret = 0 x02; break;/深绿色-2case RGB(128, 128, 0): ret = 0 x03; break;/橄榄色-3case RGB( 0, 0, 128): ret = 0 x04; break;/海军蓝色-4case RGB(128, 0, 128): ret = 0 x05; break;/紫色-5case RGB( 0, 128, 128): ret = 0 x06; break;/水鸭色-6case RGB(128, 128, 128)

29、: ret = 0 x07; break; /灰色-7case RGB(192, 192, 192): ret = 0 x08; break; /银白色-8case RGB(255, 0, 0): ret = 0 x09; break;/红色-9case RGB( 0, 255, 0): ret = 0 x0A; break;/绿色-10case RGB(255, 255, 0): ret = 0 x0B; break; /黄色-11case RGB( 0, 0, 255): ret = 0 x0C; break;/蓝色-12case RGB(255, 0, 255): ret = 0 x0D

30、; break; /洋红色-13case RGB( 0, 255, 255): ret = 0 x0E; break; /青色-14case RGB(255, 255, 255): ret = 0 x0F; break; /白色-15return ret;函数48m_ColorSample 1 0 = 0 x78;/NEIGHBOR_1m_ColorSample 1 1 = 0 x88;m_ColorSample 1 2 = 0 x88;m_ColorSample 1 3 = 0 x8c;m_ColorSample 1 4 = 0 xcc;m_ColorSample 1 5 = 0 x88;m

31、_ColorSample 1 6 = 0 x88;m_ColorSample 1 7 = 0 x88;495.2 扫雷游戏方格16种状态的表示:,但、。在map数组中存储的值为()。:数字1,即周围8个位置上有 颗地雷。在map数组中存储的值为()。:数字2,即周围8个位置上有 颗地雷。在map数组中存储的值为() 。:数字3,即周围8个位置上有 颗地雷。在map数组中存储的值为() 。50:数字1,即周围8个位置上有 颗地雷。在map数组中存储的值为()。:数字2,即周围8个位置上有 颗地雷。在map数组中存储的值为()。:数字3,即周围8个位置上有 颗地雷。在map数组中存储的值为()。5

32、1:数字2,即周围8个位置上有 颗地雷。在map数组中存储的值为()。:数字3,即周围8个位置上有 颗地雷。在map数组中存储的值为()。:,但经过决策后,所以将被点开。在。在map数组中存储的值为()。52第9种状态说明:: 如下图所示,“?”左下角位置为。将该位置的,这时如果鼠标光标位于(6,12)位置,此时如果鼠标(未松开),则。如果,则。53踩到了地雷的3种状态:踩到地雷时。在map数组中(其值为初始值 ),但会将的值设置为,从而。:踩到地雷时,的位置。其他同上。:。其他同上。54:做了。在map数组中存储的值为()。:被。在map数组中存储的值为()。:未知,即。在map数组中存储的

33、值为() 。55: 16种状态:/ScanTheMap函数switch( ret )case 0: m_map i*m_nWidth + j = NOMINE; break;case 1: m_map i*m_nWidth + j = NEIGHBOR_1; break;case 2: m_map i*m_nWidth + j = NEIGHBOR_2; break;case 3: m_map i*m_nWidth + j = NEIGHBOR_3; break;case 4: m_map i*m_nWidth + j = NEIGHBOR_4; break;case 5: m_map i*m

34、_nWidth + j = NEIGHBOR_5; break;case 6: m_map i*m_nWidth + j = NEIGHBOR_6; break;case 7: m_map i*m_nWidth + j = NEIGHBOR_7; break;case 8: m_map i*m_nWidth + j = NEIGHBOR_8; break;case 9: m_map i*m_nWidth + j = NOMINE; break;case 10: finish = TRUE; break;/这3种情况均表示踩到地雷case 11: finish = TRUE; break;cas

35、e 12: finish = TRUE; break;case 13: m_map i*m_nWidth + j = UNKNOW; break;case 14: m_map i*m_nWidth + j = ISMINE; break;case 15: m_map i*m_nWidth + j = UNKNOW; break;#define UNKNOW0 x00/未知#define NOMINE0 xFF/确定没有地雷#define ISMINE0 x0F/确定为地雷#define NEIGHBOR_10 x01/数字1/即该位置没有地雷,但周围8个方向上有1颗地雷(以下同)#define

36、 NEIGHBOR_20 x02/数字2#define NEIGHBOR_30 x03/数字3#define NEIGHBOR_40 x04/数字4#define NEIGHBOR_50 x05/数字5#define NEIGHBOR_60 x06/数字6#define NEIGHBOR_70 x07/数字7#define NEIGHBOR_80 x08/数字8565.3 获取每个方格第8行16个像素的颜色 并与预存的16种状态比对每个方格(1616)的第8行16个像素的颜色,成16种颜色的编号;然后成8个字节(每个位置的颜色用4位二进制表示);最后与预存的16种状态的颜色进行,从而每个位置处

37、于什么状态。函数。函数。/GetColorSample函数for( i=0; i8; i+ )colorref1 = :GetPixel(hDC, pt.x+i*2, pt.y);colorref2 = :GetPixel(hDC, pt.x+i*2+1, pt.y);BYTE tmp1 = Color256To16(colorref1);/转换成16色后只有低4位有效BYTE tmp2 = Color256To16(colorref2);ptrColori = tmp14 | tmp2; /取colorref1低4位+colorref2低4位凑成1个字节57: 例如,以下3种状态第8行16个

38、像素的颜色分别为:、。:、。:、。58六、决策:在获取后,需要根据这些信息来:或。 如果扫描到某个位置为的状态,则提示“”。 如果判断出了,则提示“”。 如果,则提示“”。596.1 普通决策:如果,且 ,则。: 通过来实现标记该位置为地雷。: 思考:根据上面的策略1,下图?60: 执行策略1,需要,并。/MakeDecision函数/统计数字方格(i,j)周围的8个方格中,有多少个未标记的方格CArray ArrayOfCenPt;/存放(i,j)相邻位置中未做标记的位置int isMineNumOfCenPt = 0;/8个相邻位置中,被标记为地雷的位置个数LookAroundDot( i

39、, j, &ArrayOfCenPt, &isMineNumOfCenPt );61函数。/统计(i,j)位置周围8个位置上已标记为地雷的位置个数/并将8个相邻位置中未标记为地雷的位置放入数组ptrarr中void CMineCrackDlg:LookAroundDot( int i, int j, void * ptrarr, int * isMine )CArray * ptrArray = ( CArray * )ptrarr;int i1, j1;for( i-1=0 ? i1=i-1 : i1=i; i+1=m_nHeight-1 ? i1=i+1 : i1=0 ?

40、j1=j-1 : j1=j; j+1=m_nWidth-1 ? j1=j+1 : j1Add(pt); else if( m_mapi1*m_nWidth + j1 = ISMINE ) (* isMine)+;/(i1,j1)位置被标记为地雷62: 策略1的: 通过来实现标记该位置为地雷。/MakeDecision函数/决策1:如果方格(i,j)周围的未标记方格数 = 方格(i,j)本身显示雷数值 /周围已标记是雷的方格数if( ArrayOfCenPt.GetSize() = m_mapi*m_nWidth + j - isMineNumOfCenPt )for( k=0; kArrayO

41、fCenPt.GetSize(); k+ )/从数组中将点取出,给每个点标记“是雷”的标志,通过发送鼠标消息实现:PostMessage( hWinMineWnd, WM_RBUTTONDOWN, MK_RBUTTON,MAKELPARAM(12+ArrayOfCenPtk.y*BMPWIDTH+8, 55+ArrayOfCenPtk.x*BMPHEIGHT+8) );m_map ArrayOfCenPtk.x * m_nWidth + ArrayOfCenPtk.y = ISMINE;( *bSign ) = TRUE;63:如果,则。: 通过来实现将(i,j)其他相邻位置全部点开。: 思考

42、: 其他位置指哪些位置? 根据上面的策略2,下图?64: 策略2的: 通过来实现将(i,j)其他相邻位置全部点开。/MakeDecision函数/决策2:如果方格(i,j)周围被标记为地雷的位置个数 = (i,j)位置上显示的数字if( m_mapi*m_nWidth + j = isMineNumOfCenPt )/同时单击鼠标左右键,将其他位置全部点开:PostMessage( hWinMineWnd, WM_LBUTTONDOWN, MK_LBUTTON | MK_RBUTTON,MAKELPARAM(12+j*BMPWIDTH+8, 55+i*BMPHEIGHT+8) );:PostM

43、essage( hWinMineWnd, WM_RBUTTONUP, 0,MAKELPARAM(12+j*BMPWIDTH+8, 55+i*BMPHEIGHT+8) );( *bStatus ) = TRUE;65:如果,则。: 通过来实现将某个位置点开。: 思考: 根据上面的策略3,下图?66: 策略3的: 通过来实现点开某个位置。/MakeDecision函数/总的地雷数等于本次统计的、已标记为地雷的位置个数,/则:游戏成功并把其他位置全部点开if( m_nMineNum = curMineCount )for( i=0; im_nHeight; i+ )for( j=0; jm_nWid

44、th; j+ )/把其他未点开位置全部点开if( m_mapi*m_nWidth + j = UNKNOW ):PostMessage( hWinMineWnd, WM_LBUTTONDOWN, MK_LBUTTON,MAKELPARAM(12+j*BMPWIDTH+8, 55+i*BMPHEIGHT+8) );:PostMessage( hWinMineWnd, WM_LBUTTONUP, 0,MAKELPARAM(12+j*BMPWIDTH+8, 55+i*BMPHEIGHT+8) );return TRUE;/游戏成功67只执行普通决策的结果: 可将调用高级决策的代码注释掉,观察效果。:

45、 只考查了每个方格周围。 右图是对左图只执行后的结果。思考:在右图中,哪些位置还可以通过来标记或点开?68: 如果能充分利用每个方格周围地雷分布信息,则能做出效率更高的决策。 例如,下面右图中,仅根据33的区域无法继续决策,但如果考察范围扩大到55的区域,则用圆圈标记的位置都可以标记为地雷或点开。696.2 高级决策: 在什么下会调用高级决策? 在普通决策(),即也,则将会调用高级决策。/OnBtsweepmine函数if( bSign = FALSE & bStatus = FALSE ) BOOL improve = ( &bSign, &bStatus );if( !improve )/算法不能继续了MessageBox( “算法不能继续了,自己来吧!”, NULL, MB_OK | MB_ICONINFORMATION );:BringWindowToTop(hWinMineWnd);:SetActiveWindow(hWinMineWnd);break;70: (2,3)周围8个相邻方向(33区域)上有两个未标示位置,而该位置周围只有1颗雷的位置未确定。 考查55的区域可能会得到有用的信息。 0 1 2 3 4 5 6012345671(): (3,3)位置有3个未标示相邻位置,其中,而。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论