機器學習模式 - LanKuDot/MLGame GitHub Wiki
MLGame API 主要幫助遊戲以機器學習模式執行,也就是分離遊戲的控制部分,將遊戲與玩家的程式執行在不同的 process 中,並提供兩者之間的溝通介面。
以下介紹:
- 運作流程:MLGame 如何執行遊戲並與玩家程式互動
- 玩家程式與機器學習端:MLGame 如何配置玩家程式到機器學習端
運作流程
在機器學習模式下,遊戲會分成:
- 遊戲端:遊戲主要運作的部分;
- 機器學習端(控制端):玩家撰寫程式玩遊戲的部分。因為可以用機器學習來幫助玩遊戲(當然也可以不用),所以稱為機器學習端。
遊戲執行
MLGame 執行時,會在遊戲端與機器學習端使用專屬的執行類別來控制運作流程,執行類別會呼叫遊戲類別或是 MLPlay
類別來取得所需的物件或是將物件傳給類別。
執行類別之間的運作流程如下圖:
流程可以分成兩個階段:
- 準備階段:遊戲與機器學習端都有各自需要初始化的部分,遊戲端會等待機器學習端準備好才能開始遊戲;
- 執行階段:遊戲端會從遊戲類別取得場景資訊,將場景資訊傳送給機器學習端。機器學習端將收到的場景資訊傳給
MLPlay
類別,待其處理完資訊後取得產生的指令,並傳送回遊戲端供執行(如果是多人遊戲,所收到的指令會被儲存到 list 中才傳給遊戲類別),持續到遊戲結束。
要注意的是,遊戲端並不會等待機器學習端傳送指令。如果遊戲端檢查沒有指令可收,會產生 None
來更新遊戲。遊戲端等待機器學習端的時間取決於執行遊戲時指定的間隔時間(-f/--fps
選項)。當機器學習端無法及時回傳指令時,就稱為「延遲」。執行階段每執行一次就稱為一個影格,在個別的執行類別中都有一個計數器來紀錄影格數。機器學習端傳送指令時,會包含其紀錄的影格數供遊戲端檢查是否延遲,如果有延遲,MLGame 會輸出訊息告知玩家。
遊戲結束
當遊戲類別的 update()
回傳 "RESET"
或是 "QUIT"
時,遊戲端會判定遊戲此時結束,而進行遊戲收尾與重設階段。流程如下:
流程一樣分成兩個階段:
- 遊戲收尾階段:遊戲端向遊戲類別取得場景資訊,此時的場景資訊必須要有遊戲結束的資訊(例如:有個
status
欄位,其值為"GAME_OVER"
),讓MLPlay
類別可以判斷遊戲結束,以在update()
回傳"RESET"
告知機器學習端要進行重設。由於遊戲端在遊戲結束後,會去取得遊戲最後的場景資訊,所以遊戲端不能在遊戲結束後自行重設,否則取得的場景資訊會是錯的。 - 重設階段:遊戲端與機器學習端會呼叫個別類別的
reset()
來進行重設。遊戲端重設完成後,一樣會等待機器學習端重設完成,才開始新的一輪遊戲。但是當遊戲類別的update()
是回傳"QUIT"
或是執行 MLGame 時指定-1/--one-shot
,則 MLGame 不會執行重設階段,而是直接結束執行。
遊戲紀錄檔
在執行 MLGame 時如果有指定 -r/--record
的話,遊戲端所得到的場景資訊與收到的指令會被儲存起來,在遊戲收尾階段時會匯出到檔案中。詳見遊戲紀錄檔。
玩家程式與機器學習端
MLGame 會依照指定的玩家程式順序,依序分配給機器學習端。使用的玩家程式數量不會超過機器學習端的數量,多餘的玩家程式不會被使用。但如果指定的玩家程式數量少於機器學習端的數量,則配置方式與遊戲是否為動態玩家人數有關。
非動態玩家人數
如果遊戲為非動態玩家人數(即 GAME_SETUP
的 dymanic_ml_clients
為 False
),則多出來的機器學習端都使用最後一個玩家程式。
動態玩家人數
如果遊戲為動態玩家人數(即 GAME_SETUP
的 dymanic_ml_clients
為 True
),則多出來的機器學習端不會啟動。