大家好,相信许多人很早就知道有扫雷这么一款经典的游戏,更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。
本文将介绍使用Python+OpenCV实现自动扫雷。对于自动扫雷而言,大致的开发过程是这样的:完成窗体内容截取部分,雷块分割,实现雷块类型识别,进而构建扫雷算法。
1.窗体截取
窗体截取是一个逻辑上简单,实现起来却相当麻烦的部分,而且还是必不可少的部分。通过Spy++得到了以下两点信息:
class_name = "TMain"
title_name = "Minesweeper Arbiter "
-
ms_arbiter.exe的主窗体类别为"TMain"
-
ms_arbiter.exe的主窗体名称为"Minesweeper Arbiter "
采用win32gui来获取窗体的位置信息,具体代码如下:
hwnd = win32gui.FindWindow(class_name, title_name)
if hwnd:
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
通过以上代码,得到了窗体相对于整块屏幕的位置,之后通过PIL来进行扫雷界面的棋盘截取。
from PIL import ImageGrab
left += 15
top += 101
right -= 15
bottom -= 43
rect = (left, top, right, bottom)
img = ImageGrab.grab().crop(rect)
这些数据仅在Windows10下测试通过,如果在别的Windows系统下,不保证相对位置的正确性,因为老版本的系统可能有不同宽度的窗体边框。
2.雷块分割
在进行雷块分割之前,事先需要了解雷块的尺寸以及它的边框大小,在ms_arbiter下,每一个雷块的尺寸为16px*16px。知道雷块尺寸,就可以进行每一个雷块的裁剪。
<