paia-hw3/game_development_tutorial.md

193 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Easy Game
這是一個簡單的遊戲主要用來示範如何在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