1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

这个Python自动扫雷算法写完了,估计看懂的人十不存一了吧 效果 闲来无事,打开虚拟机上的扫雷玩了玩,觉得自己计算很浪费时间,还容易遗漏,就做了个自动扫雷。 简单模式下很容易通关,困难的就看脸了,感兴趣的可以拿去运行一下。 自动化处理核心代码段在 168~273行。 次日,发现自动扫雷算法并不完整,上次的代码仅对单个数字周围进行判断。 但在一些情况下,单个数字无法判断,要综合一片小区域确定某些方块是否一定是炸弹,或者一定安全。 暂且称为高级算法。(并不是算法有多高级,本质上还是取集合(... 阅读详情

用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

中级 - 0.74秒 3BV/S=60.81

 

相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。

 

▍准备

准备动手制作一套扫雷自动化软件之前,你需要准备如下一些工具/软件/环境

- 开发环境

  1. Python3 环境 - 推荐3.6或者以上 [更加推荐Anaconda3,以下很多依赖库无需安装]
  2. numpy依赖库 [如有Anaconda则无需安装]
  3. PIL依赖库 [如有Anaconda则无需安装]
  4. opencv-python
  5. win32gui、win32api依赖库
  6. 支持Python的IDE [可选,如果你能忍受用文本编辑器写程序也可以]

- 扫雷软件

· Minesweeper Arbiter 下载地址(必须使用MS-Arbiter来进行扫雷!)

好啦,那么我们的准备工作已经全部完成了!让我们开始吧~

▍ 实现思路

在去做一件事情之前最重要的是什么?是将要做的这件事情在心中搭建一个步骤框架。只有这样,才能保证在去做这件事的过程中,尽可能的做到深思熟虑,使得最终有个好的结果。我们写程序也要尽可能做到在正式开始开发之前,在心中有个大致的思路。

对于本项目而言,大致的开发过程是这样的:

  1. 完成窗体内容截取部分
  2. 完成雷块分割部分
  3. 完成雷块类型识别部分
  4. 完成扫雷算法

好啦,既然我们有了个思路,那就撸起袖子大力干!

- 01 窗体截取

其实对于本项目而言,窗体截取是一个逻辑上简单,实现起来却相当麻烦的部分,而且还是必不可少的部分。我们通过Spy++得到了以下两点信息:

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

  • ms_arbiter.exe的主窗体类别为"TMain"
  • ms_arbiter.exe的主窗体名称为"Minesweeper Arbiter "

注意到了么?主窗体的名称后面有个空格。正是这个空格让笔者困扰了一会儿,只有加上这个空格,win32gui才能够正常的获取到窗体的句柄。

本项目采用了win32gui来获取窗体的位置信息,具体代码如下:

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

通过以上代码,我们得到了窗体相对于整块屏幕的位置。之后我们需要通过PIL来进行扫雷界面的棋盘截取。

我们需要先导入PIL库

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

然后进行具体的操作。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

聪明的你肯定一眼就发现了那些奇奇怪怪的Magic Numbers,没错,这的确是Magic Numbers,是我们通过一点点细微调节得到的整个棋盘相对于窗体的位置。

注意:这些数据仅在Windows10下测试通过,如果在别的Windows系统下,不保证相对位置的正确性,因为老版本的系统可能有不同宽度的窗体边框。

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

橙色的区域是我们所需要的

好啦,棋盘的图像我们有了,下一步就是对各个雷块进行图像分割了~

- 02 雷块分割

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

在进行雷块分割之前,我们事先需要了解雷块的尺寸以及它的边框大小。经过笔者的测量,在ms_arbiter下,每一个雷块的尺寸为16px*16px。

知道了雷块的尺寸,我们就可以进行每一个雷块的裁剪了。首先我们需要知道在横和竖两个方向上雷块的数量。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

之后,我们建立一个二维数组用于存储每一个雷块的图像,并且进行图像分割,保存在之前建立的数组中。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

将整个图像获取、分割的部分封装成一个库,随时调用就OK啦~在笔者的实现中,我们将这一部分封装成了imageProcess.py,其中函数get_frame()用于完成上述的图像获取、分割过程。

- 03 雷块识别

这一部分可能是整个项目里除了扫雷算法本身之外最重要的部分了。笔者在进行雷块检测的时候采用了比较简单的特征,高效并且可以满足要求。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

可以看到,我们采用了读取每个雷块的中心点像素的方式来判断雷块的类别,并且针对插旗、未点开、已点开但是空白等情况进行了进一步判断。具体色值是笔者直接取色得到的,并且屏幕截图的色彩也没有经过压缩,所以通过中心像素结合其他特征点来判断类别已经足够了,并且做到了高效率。

在本项目中,我们实现的时候采用了如下标注方式:

  • 1-8:表示数字1到8
  • 9:表示是地雷
  • 0:表示插旗
  • -1:表示未打开
  • -2:表示打开但是空白
  • -3:表示不是扫雷游戏中的任何方块类型

通过这种简单快速又有效的方式,我们成功实现了高效率的图像识别。

- 04 扫雷算法实现

这可能是本篇文章最激动人心的部分了。在这里我们需要先说明一下具体的扫雷算法思路:

  1. 遍历每一个已经有数字的雷块,判断在它周围的九宫格内未被打开的雷块数量是否和本身数字相同,如果相同则表明周围九宫格内全部都是地雷,进行标记。
  2. 再次遍历每一个有数字的雷块,取九宫格范围内所有未被打开的雷块,去除已经被上一次遍历标记为地雷的雷块,记录并且点开。
  3. 如果以上方式无法继续进行,那么说明遇到了死局,选择在当前所有未打开的雷块中随机点击。(当然这个方法不是最优的,有更加优秀的解决方案,但是实现相对麻烦)

基本的扫雷流程就是这样,那么让我们来亲手实现它吧~

首先我们需要一个能够找出一个雷块的九宫格范围的所有方块位置的方法。因为扫雷游戏的特殊性,在棋盘的四边是没有九宫格的边缘部分的,所以我们需要筛选来排除掉可能超过边界的访问。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

我们在这一部分通过检测当前雷块是否在棋盘的各个边缘来进行核的删除(在核中,1为保留,0为舍弃),之后通过generate_kernel函数来进行最终坐标的生成。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

在完成核的生成之后,我们有了一个需要去检测的雷块“地址簿”:to_visit。之后,我们通过count_unopen_blocks函数来统计周围九宫格范围的未打开数量,并且和当前雷块的数字进行比对,如果相等则将所有九宫格内雷块通过mark_as_mine函数来标注为地雷。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

扫雷流程中的第二步我们也采用了和第一步相近的方法来实现。先用和第一步完全一样的方法来生成需要访问的雷块的核,之后生成具体的雷块位置,通过count_mines函数来获取九宫格范围内所有雷块的数量,并且判断当前九宫格内所有雷块是否已经被检测出来。

如果是,则通过mark_to_click_block函数来排除九宫格内已经被标记为地雷的雷块,并且将剩余的安全雷块加入next_steps数组内。

 

1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷

 

 

在最终的实现内,笔者将几个过程都封装成为了函数,并且可以通过iterate_blocks_number方法来对所有雷块都使用传入的函数来进行处理,这有点类似Python中Filter的作用。

[Python] 自动扫雷 闲来无事,打开虚拟机上的扫雷玩了玩,觉得自己计算很浪费时间,还容易遗漏,就做了个自动扫雷。 简单模式下很容易通关,困难的就看脸了,感兴趣的可以拿去运行一下。 自动化处理核心代码段在 168~273行。 ======================== 次日,发现自动扫雷算法并不完整,上次的代码仅对单个数字周围进行判断。 但在一些情况下,单个数字无法判断,要综合一片小区域确定某些方块是否一定是炸弹,或者一定安全。 暂且称为高级算法。(并不是算法有多高级,本质上还是取集合(区域),进行大量的判断,难在复杂判断的 阅读详情

相关推荐

Python实现功能完整的扫雷小游戏

扫雷是一款经典的益智小游戏,核心玩法是通过推理避开地雷,揭开所有安全格子。本文将基于Python的Tkinter库,实现一个包含计时器、难度选择、排行榜等完整功能的扫雷游戏,兼顾趣味性与交互性,适合Python初学者学习与实践。

m0_48154833的博客 974

用Python实现自动扫雷!

先用和第一步完全一样的方法来生成需要访问的雷块的核,之后生成具体的雷块位置,通过count_mines函数来获取九宫格范围内所有雷块的数量,并且判断当前九宫格内所有雷块是否已经被检测出来。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。因为扫雷游戏的特殊性,在棋盘的四边是没有九宫格的边缘部分的,所以我们需要筛选来排除掉可能超过边界的访问。

2301_76161259的博客 286

扫雷AI训练系统:评估反馈机制与算法优化实践

游戏AI训练中的评估反馈机制是提升算法性能的关键环节。通过构建量化评估体系,可以精准诊断AI在逻辑推理、风险决策等方面的缺陷。本文以经典扫雷游戏为场景,详解如何设计包含效率指标、准确指标和策略指标的多维度评估系统,并实现实时可视化反馈。系统采用Python技术栈,结合NumPy矩阵运算和Pandas数据分析,为算法优化提供明确方向。该方案不仅解决了传统强化学习在确定性游戏中的适应性难题,其模块化设计还可迁移至数独、推箱子等解谜类游戏的AI开发,具有广泛的工程应用价值。

weixin_30443731的博客 353

【Python】实现自动扫雷,挑战世界纪录_ms-arbiter

6.支持Python的IDE [可选,如果你能忍受用文本编辑器写程序也可以]•ms_arbiter.exe的主窗体类别为"TMain"•ms_arbiter.exe的主窗体名称为"Minesweeper Arbiter "if hwnd:然后进行具体的操作。

2401_89213088的博客 828

Python游戏化学习:通过CodeCombat等平台快速掌握编程思维

编程学习常因反馈延迟而显得枯燥,游戏化学习通过即时反馈机制改变了这一现状。其核心原理是将编程逻辑与游戏行为直接关联,使抽象的循环、条件判断等概念转化为可视化的动作结果。这种学习方式的技术价值在于构建了低门槛、高反馈的实践沙盒,有效降低认知负荷,让学习者能聚焦于核心逻辑理解。在应用场景上,它特别适合Python初学者建立编程直觉,通过控制游戏角色、解决关卡谜题等任务驱动学习。例如,在CodeCombat等平台中,学习者能直观看到代码如何影响游戏世界,这种强关联性训练正是掌握编程思维的关键。

weixin_33743703的博客 464

Python游戏编程实战:30个小游戏从入门到进阶

Python编程学习常面临语法枯燥、项目无从下手的困境。通过游戏开发这一直观有趣的应用场景,可以将变量、循环、函数等基础概念与事件驱动、碰撞检测等核心原理紧密结合,有效提升编程思维和工程实践能力。利用Pygame等图形库,开发者能快速构建贪吃蛇、飞机大战等经典游戏,理解游戏主循环、精灵管理和状态更新等关键技术。这种从概念到实践的学习路径,不仅适用于Python初学者夯实基础,也为后续开发更复杂的应用提供了扎实的练手机会。通过复现并魔改小游戏源码,可以深入掌握调试技巧和模块化设计,完成从“读代码”到“写代码”

weixin_30907935的博客 329

Vista 高级扫雷 102 秒到 132 秒各记录截图

102 秒: 103 秒:空104 秒: 105 秒: 106 秒: 107 秒: 108 秒: 109 秒: 110 秒: 111 秒: 112 秒: 113 秒: 114 秒: 115 秒: 116 秒: 117 秒: 118 秒: 119 秒: 120

光宇广贞 3139

Minesweeper Arbiter 0.49.6

Minesweeper Arbiter 0.49.6 由俄国的Rilian用Delphi开发的专业扫雷软件 简单易用,不用安装 支持外挂语言,自定义计数器

扫雷通关宝典

扫雷小游戏通关技巧

qq_59464154的博客 1237

扫雷程序攻略及截图扫雷攻略及截图

扫雷攻略及截图扫雷攻略及截图扫雷攻略及截图扫雷攻略及截图扫雷攻略及截图扫雷攻略及截图扫雷攻略及截图扫雷攻略及截图

CocosCreator 面试题(十七)Cocos creator 固定宽度与固定高度的底层原理是什么?Cocos creator是如何做适配的?

通过固定宽度或固定高度的适配方式,可以使游戏在不同屏幕尺寸上保持一定的一致性,确保游戏中的元素的大小和位置相对稳定。具体选择哪种适配方式取决于你的游戏需求和设计考虑。在 Cocos Creator 中,你可以通过设置「设计分辨率」和使用相对坐标和布局方式来实现固定宽度或固定高度的适配。总之,Cocos Creator 提供了多种适配方式和工具,帮助你在不同屏幕尺寸上保持游戏画面的一致性。在 Cocos Creator 中,固定宽度和固定高度是两种常见的适配方式,用于在不同屏幕尺寸上保持游戏画面的一致性。

w风雨无阻w的专栏 1687

python截取数组一部分_1秒内通关扫雷?他创造属于自己的世界记录!Python实现自动扫雷...

五一劳动节假期,我们一起来玩扫雷吧。用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能...

weixin_26808205的博客 321

永磁同步电机控制笔记:foc控制原理通俗讲义

引言 到此为止,永磁同步电机控制相关文章已经写了7篇,其中simulink仿真系列文章5篇,控制笔记系列文章2篇,恍惚间感觉少了一篇概论,在此插入一篇,也算是对入坑电机控制一年半来的知识梳理。 文章目录引言一、同步电机是怎么转起来的二、什么样的旋转磁场效率最高三、怎么精准控制旋转磁场的方向四、怎样调节dq轴电流 一、同步电机是怎么转起来的 永磁同步电机结构如下: 外围是定子绕组,中间为永磁体,设...

搞电机的博客 2万+

python版扫雷(基于tkinter),教你学python

python版本扫雷游戏,具有标准模板tkinter,学习python啦!!!

boonion的博客 7515

centos7安装Ambari 2.7.5 + HDP3.1.5

准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9

kxq的博客 5091

[内网基础] 内网基础知识 —— Windows 工作组

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知的。Windows 为了解决这一问题,就产生了工作组(Work Group)这个概念。Windows 工作组尝试将不通的计算机按功能(或部门)分别列入不同的工作组,例如技术部的计算机都列入 “技术部” 工作组、行政部的计算机都列入 “行政部” 工作组。要想访问某个部门的资源,只要在 “网络” 里双击该部门的工作组名,就可以看到该部门里的所有计算机了。

Blue17 の 小窝 1602

【python】python基于Pygame扫雷游戏设计实现(源码+报告)【独一无二】

>👉博__主👈:米码收割机👉技__能👈:C++/Python语言👉公众号👈:测试开发自动化【获取源码+商业合作】👉荣__誉👈:阿里云博客专家博主、51CTO技术博主👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。

测试开发自动化 2551

ESP32-C3模组上跑通OTA升级(3)

ESP32-C3模组上跑通OTA升级(3)

phmatthaus的专栏 1351

用Python写扫雷

扫雷是一款经典的益智类小游戏,可以锻炼大脑的活跃度,适用于全年龄,而且规则简单,只需在不踩到雷的情况下,找到所有的雷即为通关.本文就是一款用python写的简单的扫雷,方便初学者练手,本游戏仅用了random包.

qq_53807928的博客 553

基于 MATLAB BP 神经网络的财务预测

通过基于 MATLAB BP 神经网络的财务预警模型,我们可以对企业的财务风险进行有效地识别和预测。在具体实现过程中,需要注意对财务数据的预处理、模型参数的调整以及结果的解释等问题。MLP模型的输入层、输出层和隐含层之间均为全连接,每个神经元都是上一层神经元的加权求和再加偏置后的非线性变换。其中,输入层接受财务数据,输出层输出财务预测结果,隐含层则对输入数据进行处理和抽象。其中,X’是标准化后的值,X是原始值,μ_i 和σ_i 分别是指标 i 在样本中的均值和标准差。其中,X’是标准化后的值,X是原始值。

TechPulseZ的博客 922

PMP第一章:引论介绍

PMP第一章:引论介绍 1.PMBOK指南概述和目的 项目管理标准 通用词汇 道德与专业行为规范 2.基本要素 项目 项目管理的重要性 项目、项目集、项目组合以及运营管理之间的关系 指南的组成部分 裁剪 项目管理商业文件 3.项目管理标准 标准是基于权威、惯例或共识而建立并用作模式或范例的文件。 标准确认了在大多数时候都被大多数项目视作良好实践的过程。 4.道德与专业行为规范 责任:对自己所做的决策或未做决策、所采取的行为或未采取行为,以及相应的后果,承担责任 尊重:对自己、他人和委托给自己的资源

zhengzaifeidelushang的博客 826

Python Pygame实战:从零构建经典扫雷游戏,掌握二维数组与事件驱动编程

二维数组是计算机科学中用于表示网格数据的基础数据结构,广泛应用于图像处理、游戏地图和矩阵运算。其核心原理是通过行和列的索引来高效访问和操作数据元素。掌握二维数组的操作,对于理解数据在内存中的组织方式及算法效率至关重要。在游戏开发领域,二维数组是构建棋盘类、网格类游戏(如扫雷、数独、棋类游戏)的基石,它能清晰地分离游戏逻辑状态与显示状态,是实现复杂游戏规则的关键。本文以经典的扫雷游戏为实战项目,深入讲解如何运用Python和Pygame库,从游戏规则的精确定义、地雷的随机布置与数字计算,到实现鼠标事件处理、递

weixin_33858336的博客 297

【GPFS专题5】---IBM Spectrum Scale (GPFS) 日常运维命令大全

掌握这些命令是有效管理 GPFS 集群的基础。实际生产环境中,建议结合自动化脚本和监控系统(如 IBM Storage Insights)实现高效运维。定期备份配置、监控性能指标,并进行灾备演练,是保障数据安全和系统稳定的关键。

jundao1997的专栏 840

pygame开发:马赛逻辑小游戏的代码实现

这篇文章主要介绍了pygame开发,通过本文,您可以使用pygame开发一个马赛逻辑小游戏~有需要的朋友可以借鉴参考下,希望能够有所帮助 一、游戏简介 马赛逻辑,是一个类似数独和扫雷的逻辑小游戏,根据棋盘周围的数据提示点亮方格,因外形像马赛克而得名。在手机游戏中有多款 APP 可以体验该游戏,如 Peak、Nonogram、Crossme 等。但在 PC 端,笔者暂时还未发现复刻版,于是打算自己动手实现一番。 马赛逻辑的基本玩法如下图所示,上侧横向的各组数字为:对每一列中存在的目标方格的标注,如 2 表示

zihong523的博客 355

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 女程序员海投2500份简历被拒遂发牢骚称:“是社会不给活路”
下一篇: 程序员一般都浏览这些网站,不仅仅提升编程水平哦!!
Pyxinrou
博客等级 码龄7年 6粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值