算法实现自动扫雷游戏

1.游戏的构思
2.算法伪代码的实现
3.算法的实现

1.首先需要建立起游戏的整个框架(棋盘的绘制,地雷的生成,基本函数的实现等)
2.构思AI算法的大概样貌(先尝试写伪码)

 void AI()  //AI算法if(First)SelectRandomPos()//游戏开始随机选择一处位置翻开SelectPos()//根据已有条件选择最佳翻开位置if(!GameOver)AI()//递归继续进行选择,直到游戏结束

3.简单的伪码写好后,接下来应该来思考如何具体实现这一算法
3.1对于SelectRandomPos()实现随机位置,我们可以使用

 Col = (rand())%ColNum;Row = (rand())%RowNum;//Col,Row为随机翻开的行列坐标//ColNum和RowNum为总的行列数
//注意这里的随机为伪随机,要想真正接近随机可以使用下面这段代码srand((unsigned int)(time(NULL)));int k = (rand())%25;int l = (rand())%14;

参考:用时间做种子生成随机数
实现这一函数功能
3.2对于函数SelectPos(),这是我们的重头戏,这个函数我们的作用是实现选择最佳翻开位置,在我们不知道当前位置是否有雷的情况下,那么我们去选择呢?我们需要将问题数字化,定义一个指数来判断,是否应该翻开当前位置,而概率则可充当这一任务。
我们知道当第一次翻开时,我们是随机的,那么第二次我们就可以根据我们已知的条件来判断了,例如当前如图(1)
对于当前情况我们需要分析当前点周围出现地雷的概率如图(2)

周围有Count个点未被翻开,而周围显示有N个地雷,所以我们可以知道
P=N%Count,得到概率为0.25,注意此处N,P,Count应该定义为浮点型。
现在我们应该翻开它周围点吗?我们还需要思考能不能翻开它周围以外的点,我称它为冒险博弈GetRisk();
由于我们已经知道,被掀开点周围有2个地雷Mine,(如果)地雷(MineNum)和行(Col)列(Row)数目是已知的,那我们就可以得到除了它周围以外的点是地雷Mine的风险risk,P=(MineNum-已知地雷数目)%(Col*Row-9)
将得到的概率相互一比较,得到最优选择。
当区域内多点被掀开,我们应该如何去考虑它的概率?如图(3)

但我们掀开周围点后,发现另一个点周围有三个地雷,那么如何确定这两个点周围点是地雷的概率呢?
首先我们需要确定新掀开的点周围有雷的概率,然后再更新前一个点的概率,注意概率的更新只影响到被掀开点周围的点。
然后将两掀开点周围的点纳入一个数组MineAround[]中,再计算被掀开点周围有雷的概率,注意,这一步的计算和前面不同,我们先将区域划分如图(4)

计算区域1的概率时,我们暂时不考虑区域2,区域1中右上角的点已经被掀开,那么说明确定那一点没有雷,那么剩下的点是雷的概率是P1=1%7;
同样对于区域二来说它中心点周围点为雷的概率是:P2=3%7;
然后我们来考虑两者结合的情况,对于两区域为被掀开的点来说它们是雷的概率由它周围点来确定,例如我们简单的举出两个点,如图(5)
对于点b的区域来说,它自身是没有被掀开的,我们计算点b是雷的概率就需要通过它周围的被掀开的点来确定,对于b来说,在它周围只有左下角点被掀开,所以我们认为点b是雷的概率为Pb=P2=3%7,也就是显示3的点的周围点概率。
那么如何确定点a是雷的概率呢?
对于点a,它周围有两个点被掀开,我们就基于这两个点来确定它是雷的概率Pa:
Pa1一定是雷的概率 = (1%7)(3%7)
Pa2一定不是雷的概率 = (6%7)
(4%7)
对于这里我们的目的是知道a不是雷的概率,所以我们取Pa = 1-Pa1;
(虽然对于该点来说只有是雷和不是雷的情况,但是这里只讨论可能性)
这样,当我们计算得到所有周围点的概率后,比较出一个最好的概率情况(概率相同时任意取),然后再与Risk比较,得出最后最优选择点位。

--------------------------------2020/12/17-机房-----------------------------------------------

显然在实际情况中,我们遇到的情况将不会只有这些,如果单纯应用上面的算法,那么你扫雷的效率(正确率)是不高的,这是为什么呢?我们需要结合实际情况来分析:
如图(6):

当程序运行到这一步的时候,如图所示我标出的红色线框
,按照我们的逻辑,对于红色线框中的未被掀开点,我们可以确定它不是雷的(因为它周围的唯一一颗雷已经被发现-标上了旗帜),但是当程序实际运行的时候程序会怎么做呢?如图(7)
可以看到程序并没有选择我们认为的最优点,这是为什么呢?我们来尝试通过我们的算法计算一下最优点不是雷的概率:P 1= (3%4)1(1%3)=1%12
对于走错的那个点(踩到雷的点),我们计算一下它不是雷的概率:P2 = (1-2%7)=5%7>P1
程序走得没错,完全按照了我们的算法来执行,但是出现了错误,说明我们算法还有改进的空间,我们忽略了这一种特殊情况,所以我们将它添加上:

for i in MineAround[](已经被掀开的点组成的数组,不包括旗帜,空点和地雷)if i.Prob==0(i周围为雷的概率为0)then open i.around
#在这里,我们加入了一种特殊情况,当已经被掀开的点中,存在周围点是雷概率为0的特殊情况是,我们不再比较最优选择(概率),直接打开它的周围点。

添加代码后,实现效果如图(7)

笔者最近有点忙,更新可能会很慢。
未完待续。。。。。。。。

当然在实际调试情况中,我们不仅仅将只是遇到这些情况,例如:
1.当我们遇到确认是地雷的点该怎么办?
2.当我们遇到的所有点周围是雷的概率都很高(但不确定是雷或者不是雷)怎么办?
3.等等等等。。。还需要我们慢慢去探讨。

2020/12/15

算法实现自动扫雷游戏相关推荐

  1. 【Pygame小游戏】扫雷游戏50多岁了,但这款我能玩一年~(三个版本集合)

    前言 哈喽,我是栗子吖--爬虫的内容我又放一段时间了! (很多版权问题文章发不了,感觉有点儿白写了,呜呜呜呜.......) 还是给大家研究研究其他的吧,能发的爬虫内容我尽量修改修改再修改争取一次过! ...

  2. unity应用实例——扫雷游戏(自动扫雷、人工布雷)

    最近用Unity做了一个简单的扫雷小游戏,可以实现电脑自动扫雷.人工布雷等功能,效果图如下. 在游戏的任何时间按下T键后,电脑会自动进行游戏,直到游戏结束.按下B键后可以通过鼠标点击埋雷. 项目一共有 ...

  3. python扫雷 高级算法_厉害了,用Python实现自动扫雷!

    微信改版,加星标不迷路! 转载自博客圆:chestnut_egg 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 ...

  4. qt实现扫雷游戏一:算法实现

    qt实现扫雷游戏一:算法实现 说明 问题总结 目录 算法文件 头文件 源文件 说明 借助qt写了一个扫雷程序,记录一下. 这是这两天用qt写扫雷所做的一些事情,在这里总结一下,另外,源代码和整个工程已 ...

  5. c语言扫雷游戏计时功能_C语言实现扫雷游戏(可以自动展开)

    前言 本篇博客主要介绍如何使用C语言实现扫雷游戏. 一.游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷.玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并 ...

  6. python扫雷 高级算法_利用Python实现自动扫雷

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...

  7. python扫雷 高级算法_扫雷游戏的布雷算法、策略与优化(附Python代码)

    1 布雷算法的应用 在扫雷游戏中,将雷均匀地分布在局面中依靠一种布雷算法.众所周知,在原始版本的Windows扫雷中,由于布雷算法的缺陷,使得其存在Board Cycle(局面循环).而标准扫雷游戏中 ...

  8. 扫雷java程序算法设计_基于Java的Windows扫雷游戏的设计与实现毕业论文+任务书+翻译及原文+源码+辅导视频...

    基于Java的Windows扫雷游戏的设计与实现 摘 要 扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每 ...

  9. python扫雷算法_如何基于Python实现自动扫雷

    这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种 ...

最新文章

  1. 排序算法(一) 冒泡排序
  2. print python 如何加锁_Python 进阶(一):多线程
  3. Java之通过Collections.synchronizedMap创建线程安全的HashMap
  4. Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
  5. linux中常用安装程序的方法,Linux下常见的软件安装方式
  6. python---之[::-1]
  7. 使用QT + cocos2dx制作工具
  8. JavaScript之局部变量和局部函数
  9. 誰毀了全新Vista電腦﹖
  10. 服务器控制口协议,服务器管理ipmi接口协议的扩展方法 Extension Methods server management interface protocol ipmi...
  11. 制作Mobi电子书目录
  12. nps内网穿透工具学习
  13. (转载)学好 Python 的 11 个优秀资源
  14. java股票接口怎么样获得?
  15. Word - Word快速去水印的 3 大绝招,再忙也要看
  16. 八、MySQL 常用函数汇总(1)
  17. 网页中的png图片无法显示?
  18. 【笔试真题】字节跳动产品岗笔试主观题解析!!
  19. 2011_STC_Minimizing Additive Distortion in Steganography using Syndrome-Trellis Codes Abstract
  20. The world与Mathon2的比较

热门文章

  1. Nginx-RTMP功能调研
  2. python时间序列因果检验_用python做时间序列预测8:Granger causality test(格兰杰因果检验)...
  3. 哈佛结构和冯诺依曼结构特点
  4. 已解决KfcError: KFC Crazy Thursday WhoEver Gives me 50 CNY, I Will Thank Him.
  5. Intel 至强E5/E7 V4 CPU与至强可扩展CPU性能对比表
  6. Hbase、Kudu和ClickHouse横向对比
  7. 又到年底冲刺时,华为小米竞相降价促销
  8. Flyme应用中心应用认领
  9. 2022年10月 基于WPF的智能制造MES系统框架-菜单栏的设计
  10. 某商场TD-LTE室内覆盖规划