游戏《三人组》的人工智能!由西尔沃有限责任公司。您可以从这里获取游戏:http://asherv.com/thirds/
构建这个 AI 是我后来的 2048 AI 的灵感来源,2048 AI 的一些想法也被反向移植到了这个 AI 中。
虽然我还没有正式对这个 AI 的性能进行基准测试,但我知道它已经多次成功达到 6144 块,这是游戏中可用的最高块。 (由于严重的随机效应,更高的瓷砖是可能的,但不太可能)。最高分(截至撰写本文时)为 775,524 分:
由于 Threes 的复杂性增加,该 AI 比其较新的兄弟 2048 AI 更具实验性!因为它没有得到足够多的开发时间。还有,三连!一般来说,这是一个不断变化的目标,因为随机图块生成算法偶尔会进行调整,从而需要对人工智能进行更改。
这个 AI 的算法已经在描述我的 2048 AI 的 StackOverflow 答案中得到了详细的描述。本质上,它在游戏树上实现了高度优化的强力搜索(所有可能的移动、图块生成值和图块值),使用 Expectimax 优化来组合结果并找到“最佳”可能的移动。
这个 Threes AI 实际上在很多方面比 2048 AI 更复杂:最值得注意的是,它解释了即将到来的牌的“牌组”(选择随机传入牌的过程有据可查),并且它正确处理基于所进行的移动的所有可能的图块生成位置。简而言之:这个 Threes AI 正确地(据我所知)模拟了 Threes 游戏的每个细节,作为最大期望优化过程的一部分。
让人工智能运行的最简单方法是克隆与您的操作系统和处理器相对应的prebuilt/
分支之一。这些分支在bin/
目录中预先构建了二进制文件。
请注意,Windows 上的“默认”Python 是 32 位,而 OS X 和 Linux 上的“默认”Python 是 64 位。 32 位构建标记为i386
而 64 位构建标记为x86_64
。
如果您想从源代码自行构建它(例如,如果您正在进行更改),请按照以下说明进行操作。
执行
./configure
make
在终端中。任何相对较新的 C++ 编译器都应该能够构建输出。
请注意,您不执行make install
;该程序旨在从此目录运行。
您有几个选项,具体取决于您安装的内容。
纯 Cygwin:遵循上面的 Unix/Linux/OS X 说明。生成的 DLL 只能与 Cygwin 程序一起使用,因此要运行浏览器控件版本,必须使用 Cygwin Python(而不是 python.org Python)。有关分步说明,请参阅此文档,由 Tamas Szell (@matukaa) 提供。
Cygwin 与 MinGW:运行
CXX=x86_64-w64-mingw32-g++ CXXFLAGS='-static-libstdc++ -static-libgcc -D_WINDLL -D_GNU_SOURCE=1' ./configure ; make
在 MinGW 或 Cygwin shell 中构建。生成的 DLL 可用于非 Cygwin 程序。
Visual Studio:打开 Visual Studio 命令提示符, cd
到 Threes-ai 目录,然后运行make-msvc.bat
。
您需要 Python 2.7、NumPy 和 PIL 来运行 Python 程序。
如果您想查看 AI 本身的运行情况,请运行bin/threes
。
Threes 有一些基于网络的版本,但我想让人工智能与真实的应用程序对战。因此,我为 Android 设备构建了一个名为android_assistant.py
的“助手”程序,它通过 ADB 与手机通信并完全自动进行移动。它仅需要 USB ADB 权限(标准开发人员访问权限),不需要生根或对设备或应用程序进行任何其他修改。它使用标准的 Android screencap
实用程序来获取(可见)游戏状态,计算最佳移动,然后使用 Linux 输入事件子系统生成滑动事件。
要使用android_assistant.py
,您需要为您的设备配置 OCR 子系统。您还必须记录滑动事件以供重播。目前,配置了两种设备:LG Nexus 5 和 OnePlus One(对应于我测试过的手机)。欢迎补丁来添加更多手机。
要配置 OCR 系统,您应该在ocr/devices.py
中添加与您的设备对应的条目。只需在连接到设备时运行android_assistant.py
即可获取模型名称(它应该会错误并显示预期的模型名称)。本质上,您需要截取游戏的屏幕截图并得出“即将出现的图块”窗格的位置,以及图块网格的位置和间距。 (这部分可能需要更多的自动化和/或简化!)
要记录事件,只需运行python -m android.inputemu --record up down left right
并在出现提示时在手机上执行适当的手势。
手动助手是通用的Threes!与任何 Threes! 实现一起使用的助手。你告诉它棋盘和即将到来的棋子组,助手就会计算出最佳移动。
运行manual_assistant.py
启动手动助手。
请注意,手动助手希望看到连续的移动。如果您向前跳过(在没有助手的情况下进行移动),请按 Ctrl+C 退出助手并再次启动它。否则,如果您输入的棋盘与前一个棋盘不连续,您可能会收到“不可能的情况”之类的错误消息。
当进入下一个面板时,您可以使用空格、换行符和/或逗号来分隔图块。从左到右,然后从上到下阅读。为空格输入零。输入示例:
使用逗号和换行符:
96,2,3,0
2,1,1,0
2,1,0,0
0,0,2,0
单独使用逗号:
96,2,3,0,2,1,1,0,2,1,0,0,0,0,2,0
使用空格:
96 2 3 0
2 1 1 0
2 1 0 0
0 0 2 0
您还可以输入前一块板上的“增量”。指定新图块生成的行或列,以及生成的图块的值(如果最后移动只有一个可能的新图块,例如,如果它是红色或蓝色,则可以忽略此项)。如果不是人工智能建议的移动,还要指定您所做的移动。
列和行按从左到右、从上到下的顺序编号:第 1 列是左列,第 1 行是顶行。
例如,如果板向上滑动,并且从
96 2 3 0
2 1 1 0
2 1 0 0
0 0 2 0
到
96 3 3 0
2 1 1 0
2 0 2 0
0 3 0 0
然后您将发送2,3,up
作为棋盘(在第二列中,生成 3)。如果人工智能建议up
,那么您可以简单地忽略它并发送2,3
。如果即将到来的图块被预测为 3 ,您可以省略 3 并仅发送2
。
通过输入增量,您将为自己节省大量时间。在大多数情况下,您只需要输入一个数字(更改的列/行)。
输入即将出现的图块时,请使用以下格式之一:
blue
(1)、 red
(2) 或white
(3+)1
, 2
, 3
, 3+
, 6+
,或例如24,48,96
, 24 48 96
3+
表示可能是 3 或更高;与年长的三岁孩子一起使用这个!奖励图块上不显示“加号”6+
表示它是任何奖励牌;如果即将出现的图块是“+”,则使用此选项24,48,96
表示它是这三个之一;与较新的 Threes 一起使用!向您显示奖金图块值的明确选项。