Skip to content

Latest commit

 

History

History
150 lines (97 loc) · 5.44 KB

README_zh-TW.md

File metadata and controls

150 lines (97 loc) · 5.44 KB

乒乓球

遊戲版本:1.1

概觀

在回合開始時,可以決定發球位置與方向。如果沒有在 150 影格內發球,球會從平台目前位置隨機往左或往右發球。球速從 7 開始,每 100 影格增加 1。如果球速超過 40 卻還沒分出勝負的話,該回合為平手。

在不同的難度中加入兩種機制。一個是切球,球的 x 方向速度會因為板子接球時的移動而改變;另一個是在場地中央會有一個移動的障礙物。

執行

  • 手動模式:python MLGame.py -m pingpong <difficulty> [game_over_score]
    • 將球發往左邊/右邊:1P - ./,2P - QE
    • 移動板子:1P - 左右方向鍵,2P - AD
  • 機器學習模式:python MLGame.py -i ml_play_template.py pingpong <difficulty> [game_over_score]

遊戲參數

  • difficulty:遊戲難度
    • EASY:簡單的乒乓球遊戲
    • NORMAL:加入切球機制
    • HARD:加入切球機制與障礙物
  • game_over_score:[選填] 指定遊戲結束的分數。當任一方得到指定的分數時,就結束遊戲。預設是 3,但如果啟動遊戲時有指定 -1 選項,則結束分數會是 1。

詳細遊戲資料

座標系

與打磚塊遊戲一樣

遊戲區域

500 * 200 像素。1P 在下半部,2P 在上半部

遊戲物件

  • 5 * 5 像素大小的綠色正方形
  • 每場遊戲開始時,都是由 1P 先發球,之後每個回合輪流發球
  • 球由板子的位置發出,可以選擇往左或往右發球。如果沒有在 150 影格內發球,則會自動往隨機一個方向發球
  • 初始球速是每個影格 (±7, ±7),發球後每 100 影格增加 1

板子

  • 40 * 30 的矩形,1P 是紅色的,2P 是藍色的
  • 板子移動速度是每個影格 (±5, 0)
  • 1P 板子的初始位置在 (80, 420),2P 則在 (80, 50)

切球機制

在板子接球時,球的 x 方向速度會因為板子的移動而改變:

  • 如果板子與球往同一個方向移動時,球的 x 方向速度會增加 3 (只增加一次)
  • 如果板子沒有移動,則求的 x 方向速度會恢復為目前的基礎速度
  • 如果板子與球往相反方向移動時,球會被打回原來過來的方向,其 x 方向速度恢復為目前的基礎速度

切球機制加入在 NORMALHARD 難度中。

障礙物

  • 30 * 20 像素的矩形
  • x 初始位置在 0 到 180 之間,每 20 為一單位隨機決定,y 初始位置固定在 240,移動速度為每影格 (±5, 0)
  • 障礙物會往復移動,初始移動方向是隨機決定的
  • 障礙物不會切球,球撞到障礙物會保持球的速度

障礙物加入在 HARD 難度中。

撰寫玩遊戲的程式

程式範例在 ml/ml_play_template.py

初始化參數

  • side: 字串。其值只會是 "1P""2P",代表這個程式被哪一邊使用。

溝通物件

遊戲場景資訊

由遊戲端發送的字典物件,同時也是存到紀錄檔的物件。

{
    'frame': 42,
    'status': 'GAME_ALIVE',
    'ball': (189, 128),
    'ball_speed': (7, -7),
    'platform_1P': (0, 420),
    'platform_2P': (0, 50),
    'blocker': (50, 240)
}

以下是該字典物件的鍵值對應:

  • "frame":整數。紀錄的是第幾影格的場景資訊
  • "status":字串。目前的遊戲狀態,會是以下的值其中之一:
    • "GAME_ALIVE":遊戲正在進行中
    • "GAME_1P_WIN":這回合 1P 獲勝
    • "GAME_2P_WIN":這回合 2P 獲勝
    • "GAME_DRAW":這回合平手
  • "ball"(x, y) tuple。球的位置。
  • "ball_speed"(x, y) tuple。目前的球速。
  • "platform_1P"(x, y) tuple。1P 板子的位置。
  • "platform_2P"(x, y) tuple。2P 板子的位置。
  • "blocker"(x, y) tuple。障礙物的位置。如果選擇的難度不是 HARD,則其值為 None

遊戲指令

傳給遊戲端的字串,用來控制板子的指令。

'MOVE_RIGHT'

以下是可用的指令:

  • "SERVE_TO_LEFT":將球發向左邊
  • "SERVE_TO_RIGHT":將球發向右邊
  • "MOVE_LEFT":將板子往左移
  • "MOVE_RIGHT":將板子往右移
  • "NONE":無動作

紀錄檔

在紀錄檔中,機器學習端的名字 1P 為 "ml_1P"、2P 為 "ml_2P"

機器學習模式的玩家程式

乒乓球是雙人遊戲,所以在啟動機器學習模式時,可以利用 -i <script_for_1P> -i <script_for_2P> 指定兩個不同的玩家程式。如果只有指定一個玩家程式,則兩邊都會使用同一個程式。

而在遊戲中有提供 ml_play_manual.py 這個程式,它會建立一個手把,讓玩家可以在機器學習模式中手動與另一個程式對玩。使用流程:

  1. 使用 python MLGame.py -i ml_play_template.py -i ml_play_manual.py pingpong <difficulty> 啟動遊戲。會看到有兩個視窗,其中一個就是手把。終端機會輸出 "Invisible joystick is used. Press Enter to start the 2P ml process." 的訊息。

  1. 將遊戲手把的視窗拉到一旁,並且讓它是目標視窗 (也就是說視窗的標題不是灰色的)。

  1. 按 Enter 鍵讓手把也發出準備指令以開始遊戲,使用左右方向鍵來控制板子移動。

關於球的物理

與打磚塊遊戲的機制相同