不久前,我写了一个扫雷的AI。我之前打算发表一个新手教程,无奈大学生活和各种考试过于忙碌,没有时间去写。但我刚刚结束了我的第一学期的学习,我有时间去写一个我这个AI中做了什么的正式的概述。
这是AI动作30秒的简短视频:
其它翻译版本 (3) 加载中如何玩扫雷:
如果你是一个玩过扫雷的有经验玩家,你完全可以跳过这个部分。如果你没有玩过扫雷,我将会给一个快速简单的介绍,讲解一下一些我们可以用来解决简单扫雷游戏的基础攻略。
我们从10X10的新手网格开始,然后点击中间的方块:
我们可以快速地标记一些地雷。当数字“1”在一个空的方块周围时,我们可以知道这周围有一个地雷。
让我们继续标记这些地雷:
下一个攻略:如果有一个地雷与“1”相邻,那么我们可以知道与“1”相邻的其他方块都不可能是地雷。
所以,我们可以继续点击我们知道不可能是地雷的方块:
按相同做法如下做下去。在这种情况下,这两个策略足以解决新手(初级)的格子了:
AI路线图
所有这些看起来足够简单。这是我们接下来需要做的:
1.读取板块。如果我们用一个截屏函数,我们可以获取到在板块上所有像素的一个位图。我们仅仅需要从屏幕中去“读取”那个数字。幸运的是,数字都有不同的颜色:1是蓝色,2是绿色,3是红色等等。
2.计算。运行计算,计算出那些地雷在哪里。这里不重复说了。
3.点击板块。这个步骤比较简单。在JAVA中,我们可以用标准类库中的Robot类去发送鼠标点击事件给屏幕。
这里没有太多的步骤,所以我们将快速地过一下。
在运行之前,当我们有一个完整的空格子的时候,我们调用了一个校准程序-一个可以截屏和寻找看起来像地雷格子的程序。使用启发式,糨将可以定位格子的位置和方块格子的大小,在板块的坐标等等类似的信息。
现在我们知道方块在哪里了,如果我们想读取方块的,我们剪切截屏的一小部分然后把它传到检测程序,检测程序将在这些少数的像素中计算广场中的是什么数字。
与此同时在检测中存在一些缺陷:
1.数字“1”的颜色与一个没有打开的方块的颜色非常相近:都是深蓝色。为了区分他们,我对比了斑点颜色与平均斑点颜色之间的“差异”。
2.数字3与数字7的颜色完全一样。在这里,我使用了一个简单的边缘检测程序。
简单算法
普通的简单算法实际上已经可以在很短的时间内很好地去解决初始难度和中级难度的关卡。有时候,如果我们幸运的话,这个算法也可以用来解决一些高级的关卡。
当人们玩扫雷的时候,我们会尽可能最快地去完成扫雷。所以我们不介意为了每个游戏的胜利而失败了20次游戏:只有胜利的才算。
这是一个非常清晰的傻瓜式衡量标准,当我们看成是一个机器人时,我们的点击速度可以像我们想像中的一样快。相反的,我们会用一个更有趣的衡量标准来挑战我们自已。
赢得更多的游戏
考虑到下面的情节:
使用简单算法,我们将会被卡住。
到此为止,每当我们标记一个方块为有雷或者安全的时候,我们只需要考虑一个3X3的大方块。这个攻略使我们失败在这里:解决窍门是使用多方块算法---一次可以读取多个不同的方块。
从最下面的2,我们可以知道在红色圈圈中的两个方块中有一个是地雷,其中一个不是地雷。我们只是不知道哪个是地雷而已:
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务