這是一個簡單的遊戲,主要用來示範如何在PAIA 上發布一個遊戲
遊戲參數定義檔案需要使用json格式,且需要命名為game_config.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_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", "不動作"]
]
}
遊戲需要實作一個interface
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"}
]