paia-hw3/README.md

176 lines
4.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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**
![easy_game](https://img.shields.io/github/v/tag/PAIA-Playful-AI-Arena/easy_game)
[![Python 3.9](https://img.shields.io/badge/python-3.9-blue.svg)](https://www.python.org/downloads/release/python-390/)
[![MLGame](https://img.shields.io/badge/MLGame->10.3.2-<COLOR>.svg)](https://github.com/PAIA-Playful-AI-Arena/MLGame)
[![pygame](https://img.shields.io/badge/pygame-2.0.1-<COLOR>.svg)](https://github.com/pygame/pygame/releases/tag/2.0.1)
這是一個吃東西小遊戲,也是 PAIA 的遊戲教學範例
![demo](https://github.com/PAIA-Playful-AI-Arena/easy_game/blob/main/asset/easy_game.gif?raw=true)
---
# 基礎介紹
## 啟動方式
- 直接啟動 [main.py](http://main.py) 即可執行
### 遊戲參數設定
```python
# main.py
game = EasyGame(
level: int = 1,
level_file: str = None,
sound: str = "off")
```
- `level`: 選定內建關卡,預設為 1 選擇第一關。
- `level_file`: 使用外部檔案作為關卡,請注意,使用此設定將會覆蓋掉關卡編號,並且不會自動進入下一關。
- `sound`: 音效。
## 玩法
- 使用鍵盤 上、下、左、右 控制方塊
## 目標
1. 在遊戲時間截止前,盡可能吃到愈多的食物吧!
### 通關條件
1. 時間結束前,吃到的食物超過`score`,即可過關。
### 失敗條件
1. 時間結束前,吃到的食物少於`score`,即算失敗。
## 遊戲系統
1. 行動機制
上下左右的行動,每次移動`10.5px`
2. 座標系統
- 螢幕大小 800 x 600
- 主角方塊 30 x 30
- 食物方塊 8 x 8
---
# 進階說明
## 使用AI玩遊戲
```bash
# 在easy game中打開終端機
python -m mlgame -i ./ml/ml_play_template.py ./ --time_to_play 1200 --green_food_count 15 --red_food_count 10 --score_to_pass 10 --playground_size 100,200
```
## AI範例
```python
import random
class MLPlay:
def __init__(self,ai_name,*args, **kwargs):
print("Initial ml script")
def update(self, scene_info: dict,,*args, **kwargs):
# print("AI received data from game :", scene_info)
actions = ["UP", "DOWN", "LEFT", "RIGHT", "NONE"]
return random.sample(actions, 1)
def reset(self):
"""
Reset the status
"""
print("reset ml script")
pass
```
## 遊戲資訊
- scene_info 的資料格式如下
```json
{
"frame": 25,
"ball_x": 425,
"ball_y": 306,
"foods": [
{
"x": 656,
"y": 210,
"type": "GOOD_1",
"score": 1
},
...,
{
"x": 371,
"y": 217,
"type": "BAD_1",
"score": -1
}
],
"score": 0,
"status": "GAME_ALIVE"
}
```
- `frame`:遊戲畫面更新的編號
- `ball_x`:主角方塊的X座標,表示方塊的左邊座標值。
- `ball_y`:主角方塊的Y座標,表示方塊的上方座標值。
- `foods`:食物的清單,清單內每一個物件都是一個食物的左上方座標值,也會提供此食物是什麼類型和分數多少。
- `type` 食物類型: `GOOD_1`, `GOOD_2`, `GOOD_3`, `BAD_1`, `BAD_2`, `BAD_3`
- `score`:目前得到的分數
- `score_to_pass`:通關分數
- `status` 目前遊戲的狀態
- `GAME_ALIVE`:遊戲進行中
- `GAME_PASS`:遊戲通關
- `GAME_OVER`:遊戲結束
## 動作指令
- 在 update() 最後要回傳一個字串,主角物件即會依照對應的字串行動,一次只能執行一個行動。
- `UP`:向上移動
- `DOWN`:向下移動
- `LEFT`:向左移動
- `RIGHT`:向右移動
- `NONE`:原地不動
## 遊戲結果
- 最後結果會顯示在console介面中若是PAIA伺服器上執行會回傳下列資訊到平台上。
```json
{
"frame_used": 100,
"state": "FAIL",
"attachment": [
{
"player": "1P",
"score": 0,
"rank": 1,
"passed": false
}
]
}
```
- `frame_used`表示使用了多少個frame
- `state`:表示遊戲結束的狀態
- `FAIL`:遊戲失敗
- `FINISH`:遊戲完成
- `attachment`:紀錄遊戲各個玩家的結果與分數等資訊
- `player`:玩家編號
- `score`:吃到的食物總數
- `rank`:排名
- `passed`:是否通關
---