Xiangism

从一个无知角落里开始,蹒跚学步,一个未知到另一个未知,在跌跌撞撞中越走越快,越走越远,最后宇宙也为之开源。对于探索者来说,最后他们的思想总是变得和自己的足迹一样伟大。
随笔 - 62, 文章 - 1, 评论 - 220, 阅读 - 20万
  博客园  :: 首页  :: 联系 :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

自动扫雷——前言

Posted on   Xiangism  阅读(5229)  评论(8编辑  收藏  举报

几年前用C#就做过XP系统下的扫雷游戏的外挂,当时能力有限,程序的框架不够好,功能也不够完善。现在用C++写了一个win32的自动扫雷程序mineTerminator(扫雷终结者),现将其整理成博文。

将分为如下几篇解说:

自动扫雷——游戏框架

自动扫雷——确定情况的分析

自动扫雷——概率分析之数学实现

自动扫雷——概率分析之程序实现

说到自动游戏,即用程序自动去玩某个游戏。这主要会涉及到三个部分:获取游戏数据,分析数据、得到有用数据,控制游戏。

mineTerminator中用分析游戏窗口像素信息得到游戏数据,而控制游戏而是用SendMessage给游戏窗口发送按键消息。现在的难点既是分析游戏数据:通过下面几部分来说明如何利用数学之美,成功地解决问题。

先来分析一下扫雷中可以存在的情况,总结出了四种不同的模型:

  • 第一种、第二种模型

分析右上角的的2,其周围的未知块a,b两块,等于其周围雷数,故可判断出a,b都是雷;接下来,分析下面的2,其周围共有3个未显示的块a,b,c,其中a,b已判断出为雷,即周围已判断的雷数等于其雷数时,则可判断剩下的块都不是雷,即c块不是雷。

 这两种模型,一种是判断出雷、一种是判断出没有雷,这是地球人都知道的扫雷方法。而接下来的模型或许只有扫雷高手或者数学高手才知道~~

  • 第三种模型

我先做一个大胆的判断,c块没有雷!!且听我慢慢道来~

根据两个显示为1的块,可得如下的式子:

a+b=1                 (1)  

d+e=1                 (2)

表示a,b中有且只有一个雷,d,e有且只有一个雷,

根据显示为2的块,可得:

a+b+c+d+e=2         (3)

表示abcde中有且只有两个雷

根据(1)(3),可得

c+d+e=1      (4)

根据(2)(4)可得, c=0  ,所以c块肯定无雷,可放心地揭开。

这种模型可以说在扫雷中应用得最精妙,看似无法判断的情况,通过这样的计算就可确定出哪里是雷或者哪里不是雷。

  • 第四种模型

上面三种模型都属于可确定判断的范畴,而在扫雷中经常会遇到无法确定判断的死局。这时就得用到数学工具——概率,来进行最优判断。

如图所示显示为3周围有雷的概率很容易计算出:3/8(这是比较简单的情况)。再看下面的图

当点开两个"8邻接"距离小于等于2的块时,它们周围有雷的概率就不那么容易判断了(上面a,b,c有雷的概率分别是多少),这种情况留在后文详细分析。《编程之美》的最后一题也就是这个问题, 三年前自己一直在想这个概率如何来求,以及如何用程序实现。现在总算是想明白了~~~

前言先写到这,后面的精彩敬请期待。

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示