這次我們要來「用程式寫遊戲給AI玩」囉!
__init__(self, user_num=1)
初始化,程式啟動後,被mlgame
呼叫
class Game(PaiaGame):
def __init__(self, user_num=1):
super().__init__(user_num)
self.is_paused = False
self.is_debug = False
self.is_sound = False
self.game_mode = self.set_game_mode()
self.attachements = []
set_game_mode() -> GameMode
設定遊戲的遊玩模式
play_rect_area
建立遊戲區域的矩形,根據遊戲參數,傳回對應的GameMode
,關於GameMode
的詳情,我們下集再來說明game_mode
,就會是一個GameMode
物件(範例為根據玩家數量,選擇SingleMode
或BattleMode
,也可以撰寫自己規則和其相對應的遊戲模板)class Game(PaiaGame):
def set_game_mode(self):
play_rect_area = pygame.Rect(0, 0, WIDTH, HEIGHT)
if self.user_num == 1:
game_mode = SingleMode(play_rect_area)
else:
game_mode = BattleMode(play_rect_area)
return game_mode
get_scene_init_data() -> dict
獲取遊戲場景初始化資訊,PaiaGame
初始化後,被mlgame
呼叫
scene
的屬性,化為dict
mlgame
建立圖片資料庫class Game(PaiaGame):
def get_scene_init_data(self) -> dict:
"""
Get the scene and object information for drawing on the web
"""
game_info = {'scene': self.scene.__dict__,
'assets': self.game_mode.get_init_image_data()}
return game_info
get_data_from_game_to_player() -> dict
獲取遊戲資料給玩家(AI),以獲取遊戲命令更新遊戲,進入遊戲迴圈後在一開始,被mlgame
呼叫
class Game(PaiaGame):
def get_data_from_game_to_player(self) -> dict:
to_players_data = self.game_mode.get_ai_data_to_player()
return to_players_data
update(self, commands: dict)
更新遊戲邏輯與物件狀態
handle_event()
處理遊戲事件發生game_mode.debugging(self.is_debug)
呼叫遊戲模式,傳入判斷參數,決定是否執行debug
的功能commands
遊戲命令傳給game_mode
遊玩模式更新RESET
字串給mlgameclass Game(PaiaGame):
def update(self, commands: dict):
self.handle_event()
self.game_mode.debugging(self.is_debug)
if not self.is_paused:
self.frame_count += 1
self.game_mode.update(commands)
if not self.is_running():
return "RESET"
handle_event()
處理遊戲事件發生,這裡僅檢查鍵盤按鍵的輸入
debug
遊戲SPACE
容易有問題,所以在AI收到的keyboard_list,是不會有的喔(mlgame不會偵測它))class Game(PaiaGame):
def handle_event(self):
key_board_list = pygame.key.get_pressed()
if key_board_list[pygame.K_b]:
self.is_debug = not self.is_debug
if key_board_list[pygame.K_SPACE]:
self.is_paused = not self.is_paused
is_running() -> bool
回傳判斷遊戲是否存活的布林值
class Game(PaiaGame):
def is_running(self):
return self.game_mode.status == GameStatus.GAME_ALIVE
get_scene_progress_data() -> dict
若PaiaGame順利執行完update函式,mlgame
呼叫PaiaGame的獲取場景更新資料函式,用於繪製畫面,格式規範請看 GitHub@MLGame/PyGameView.md
background
放入遊戲背景的畫面資料object_list
放入遊戲物件的畫面資料toggle_with_bias
放入遊戲以相對bias位置可被顯示或隱藏的畫面資料(按下H可隱藏/顯示)toggle
放入遊戲可被顯示或隱藏的畫面資料(按下H可隱藏/顯示)foreground
放入遊戲前景的畫面資料user_info
放入單個遊戲玩家(AI)的資料,顯示在PAIA線上版遊玩平台的畫面game_sys_info
放入所有遊戲玩家(AI)共享資料,顯示在PAIA線上版遊玩平台的畫面class Game(PaiaGame):
def get_scene_progress_data(self) -> dict:
"""
Get the position of src objects for drawing on the web
"""
scene_progress = {'background': [],
'object_list': self.game_mode.get_obj_progress_data(),
'toggle_with_bias': [],
'toggle': [],
'foreground': [],
'user_info': [],
'game_sys_info': {}}
return scene_progress
get_game_result()
獲取遊戲結果,當mlgame
從Game.update
那,收到RESET
或QUIT
字串時執行
rank()
產生遊戲結果mlgame
以顯示遊戲結果在畫面class Game(PaiaGame):
def get_game_result(self):
"""
Get the src result for the web
"""
self.rank()
return {"frame_used": self.frame_count,
"state": self.game_result_state,
"attachment": self.attachements
}
rank() -> list
更新遊戲結果狀態和遊戲結果顯示資料,並回傳遊戲結果顯示資料
class Game(PaiaGame):
def rank(self):
self.game_result_state = self.game_mode.state
self.attachements = self.game_mode.get_player_result()
return self.attachements
reset()
重置遊戲,當mlgame
從Game.update
那,收到RESET
或QUIT
字串時執行
GameMode
的reset()
,重置遊玩模式rank()
更新遊戲結果class Game(PaiaGame):
def reset(self):
self.frame_count = 0
self.game_mode.reset()
self.rank()
TutorialGame.update
,嘗試回傳RESET
或QUIT
時,遊戲會當機,大家可以Debug看看(提示:注意Termianl顯示的遊戲結果)本日額外補充的內容:
- 有關遊戲需繼承的模板 —— PaiaGame的規範請看 GitHub@MLGame/PaiaGame.md
- 本文使用的遊戲範例,完整程式碼請看 @TutorialGame/src/Game
- MLGame繪製畫面的格式規範請看 GitHub@MLGame/PyGameView.md