# Swimming-Squid 這是一個簡單的遊戲,主要用來示範如何在PAIA 上發布一個遊戲 ![](asset/easy_game.gif) ## Game Config 遊戲參數定義檔案需要使用json格式,且需要命名為`game_config.json` ```json { "game_name": "easy_game", // 遊戲的名稱 "version": "1.0.1", // 版本號 "url": "None", // github 專案連結 "game_params": [ // 遊戲參數陣列 { "name": "time_to_play", // 遊戲參數的名字 "verbose": "遊戲總幀數", // 顯示文字 "type": "int", // 類型 分為 int str "max": 2000, // int 可以設定 最大最小值 "min": 600, "default": 600, // 遊戲參數的預設值 // 參數的輔助說明 "help": "set the limit of frame count , actually time will be revised according to your FPS .", }, { "name": "color", "verbose": "矩形顏色", "type": "str", "choices": [ // 字串的選項需要有顯示文字(verbose) 與 實際值(value) { "verbose": "CYAN", "value": "00BCD4" }, { "verbose": "YELLOW", "value": "FFEB3B" }, { "verbose": "ORANGE", "value": "FF9800" } ], "help": "set the color of rectangle", "default": "FFEB3B" } ] } ``` ## Game Blockly ```json { "GAME_STATUS": [ // 遊戲狀態的參數 // ['python 變數名稱','display in English','中文的顯示文字'] ["GAME_ALIVE", "alive", "存活"], ["GAME_PASS", "pass", "通關"], ["GAME_OVER", "over", "失敗"] ], "SCENE_INFO": [ // 傳給MLPlay的資料內容 // ["python code", "english", "chinese"], ["scene_info['frame']", "# frame", "# 幀數"], ["scene_info['status']", "game status", "遊戲狀態"], ["scene_info['ball_x']", "x coordinate of ball", "球的 x 座標"], ["scene_info['ball_y']", "y coordinate of ball", "球的 y 座標"], ["scene_info['score']", "x coordinate of platform", "平台的 x 座標"], ["scene_info['foods']", "list of foods positions", "點點的位置清單"], ["scene_info", "dictionary of all information", "包含所有資訊的字典"] ], "CONSTANT": [ // 提供給玩家的常數資訊 // ["value", "english", "chinese"], [0, "left boundary", "左邊界"], [800, "right boundary", "右邊界"], [0, "top boundary", "上邊界"], [600, "bottom boundary", "下邊界"], [50, "ball width", "球身的寬度"], [50, "ball height", "球身的高度"], [8, "food width", "食物的寬度"], [8, "food height", "食物的高度"] ], "ACTION": [ // 讓玩家使用的遊戲指令 // ["python code", "english", "chinese"], ["UP", "moving up", "向上移動"], ["DOWN", "moving down", "向下移動"], ["LEFT", "moving left", "向左移動"], ["RIGHT", "moving right", "向右移動"], ["NONE", "doing nothing", "不動作"] ] } ``` ## Game interface 遊戲需要實作一個interface ```python class PaiaGame(abc.ABC): def __init__(self): """ 初始化資料 """ pass @abc.abstractmethod def update(self, commands): self.frame_count += 1 @abc.abstractmethod def game_to_player_data(self) -> dict: """ send something to game AI we could send different data to different ai """ to_players_data = {} return to_players_data @abc.abstractmethod def reset(self): pass @abc.abstractmethod def get_scene_init_data(self) -> dict: """ Get the initial scene and object information for drawing on the web """ # TODO add music or sound scene_init_data = {"scene": self.scene.__dict__, "assets": [ ], # "audios": {} } return scene_init_data @abc.abstractmethod def get_scene_progress_data(self) -> dict: """ Get the position of game objects for drawing on the web """ scene_progress = { # background view data will be draw first "background": [], # game object view data will be draw on screen by order , and it could be shifted by WASD "object_list": [], "toggle": [], "foreground": [], # other information to display on web "user_info": [], # other information to display on web "game_sys_info": {} } return scene_progress @abc.abstractmethod def get_game_result(self) -> dict: """ send game result """ return {"frame_used": self.frame_count, "result": { }, } @abc.abstractmethod def get_keyboard_command(self) -> dict: """ Define how your game will run by your keyboard """ cmd_1p = [] ai_1p = self.ai_clients()[0]["name"] return {ai_1p: cmd_1p} @staticmethod def ai_clients() -> list: """ let MLGame know how to parse your ai, you can also use this names to get different cmd and send different data to each ai client """ return [ {"name": "1P"} ] ``` ## Flowchart