zoukankan      html  css  js  c++  java
  • 自动扫雷——前言

    几年前用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有雷的概率分别是多少),这种情况留在后文详细分析。《编程之美》的最后一题也就是这个问题, 三年前自己一直在想这个概率如何来求,以及如何用程序实现。现在总算是想明白了~~~

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

  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/xiangism/p/2665130.html
Copyright © 2011-2022 走看看