- 40747011s 陳映達
其中介紹了五子棋的基礎、術語,如雙活三等等。
使我更加理解五子棋、有助於設計審局函數。
線上的五子棋 AI 網站。
同學的五子棋 AI,與我的 AI 對弈、測試。
讓 C++ 與 Node.js 共舞的神奇魔法。
單用審局函數的 AI,似乎較加上 minmax 的強。
解壓縮 gomoku-darwin-x64-1.0.0.zip
後執行 gomoku.app
- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
- 處理器 2.3 GHz 雙核心Intel Core i5
- 記憶體 16 GB 2133 MHz LPDDR3
- 顯示卡 Intel Iris Plus Graphics 640 1536 MB
- MacOS Catalina 10.15.7
- 0921783206
設計上,持黑第一子未限制於外圍。
若要測試,可不斷隨機重新開局( command+A
/ command+H
),直到落子於外圍為止。
程式共有四種模式:
- No Agent
- Human first
- Agent first
- No Human
可以點開上方列表的 New Game ▶
選單做選擇,亦有快捷鍵使用。
搭配清楚簡潔的介面,十分方便。
介面上清楚標示出子的順序,並於左上角提示當前玩家。
形成連五時亦有特效提示,對使用者十分友善。
棋子上增加了陰影,讓整體盤面看起來更立體、讓使用者更加身歷其境。
因為搭配 minmax 的效果不佳,最後選擇單用審局函數。
也因為如此,雖然持白時難以扭轉情勢,
但相對的思考時間極短、先手時也有一定實力。
對每一個未落子的位置,做「落子後」的分類並給予分數:
- 1 分:死一
- 2 分:活一、死二
- 4 分:活二、死三
- 8 分:活三、死四
- 16 分:活四
- 32 分:五
相關分類介紹可以參考上方提過的五子棋教學網站。
實作上,對於每個點的四個方向上(水平、垂直、左斜、又斜),
前後各四個位置,以二進位紀錄表示。
例如 ..OXPOO..
會紀錄為 0010 1100
。
(P
是要評分的位置,O
為我方落子,X
為對方落子)
因此可以用 8-bit 代表一種情況,全部 256 種情況紀錄於 addon/map.txt
中。
每一列為一種情況,前 8-bit 紀錄我方落子,後接一個數字 n 代表該情況得 2^n 分。
最後還有一組 8-bit 代表對方落子的遮罩,若與實際情況有部份吻合,
則該組合為「死」,得分減少為 2^(n - 1) 分。
記錄盤面使用 17x17 大小的一維 bool
陣列,
black_board_[]
、white_board_[]
分別紀錄黑白子是否落子。
邊界兩棋盤皆紀錄為 true
。
遵照 MVC 模式,模組化使得軟體本身具有一定的可擴充性。
例如抽象的 model 模組可以連接資料庫,儲存相關數據。
軟體主要由 Node.js 撰寫,唯 AI Agent 使用 C++ 撰寫插件。
只要實作以下兩個介面,就可以替換為任何的 Agent。
static void NewGame(const v8::FunctionCallbackInfo<v8::Value> & args);
static void Play(const v8::FunctionCallbackInfo<v8::Value> & args);
NewGame
負責初始化 Agent 的相關資料。Play
接收一個參數,代表對手的動作,並回傳決定落子的位置。
(eg., 接收157
,代表對手落子於white_board_[157]
)