遊戲《三人組》的人工智慧!由西爾沃有限責任公司。您可以從這裡獲得遊戲: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
您也可以輸入前一塊板上的「增量」。指定新圖塊產生的行或列,以及產生的圖塊的值(如果最後移動只有一個可能的新圖塊,例如,如果它是紅色或藍色,則可以忽略此項目)。如果不是 AI 建議的動作,也要指定您所做的動作。
列和行按從左到右、從上到下的順序編號:第 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 一起使用!向您顯示獎金圖塊值的明確選項。