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

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

  • 相关阅读:
    20165339 预备作业3 Linux安装及学习
    20165339 学习基础和c语言基础调查
    20165339 我期望的师生关系
    2018-2019-1 20165332 《信息安全系统设计基础》第3周学习总结
    2018-2019-1 20165332 《信息安全系统设计基础》第2周学习总结
    2018-2019-1 20165332 《信息安全系统设计基础》第1周学习总结
    20165332 2017-2018-2《Java程序设计》课程总结
    20165332实验五 网络编程与安全
    20165332实验四 Android开发基础
    20165332第十周课下作业
  • 原文地址:https://www.cnblogs.com/xiangism/p/2665130.html
Copyright © 2011-2022 走看看