nathan-tw / 1102CP2_FianlProject

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

1102 CP2 Final Project

Quick Start

  1. 請將你的程式碼放置於 player 資料夾中,並請命名為 player.cpp,請確保你的 player 資料中必須包含這隻檔案。
  2. sample input 可以採用 sample 資料夾中的範例輸入
  3. 欲使用 judge,可以於終端環境中輸入 make judge1 即可。judge 先執行玩家當 A 做先手玩家,再執行玩家當 B 做後手玩家。判斷完畢後將於目錄底下出現 move_player_be_A.log 和 move_player_be_B.log。log 中為 A、B 玩家的移動紀錄,以及最後兩行輸出競賽結果
  4. judge 僅能在 linux 平台使用,包含 ubuntu, mac 等機器,並請確保您的環境安裝有 python3 。如遇到 judge 無法使用,請先嘗試使用 make clean ,若仍然無法使用再與助教聯繫。
  5. judge 各機器人請分別使用 make judge1, make judge2 ... 等指令

Game Introduction

有一個特別尋寶遊戲,在這個遊戲中只會有兩尋寶人,他們會在一張 $M \times N$ 完全對稱的地圖上,各自由左上角及右下角出發,大戰 1000 個回合後,看誰能蒐集到最多的寶物。在這個遊戲中,你將扮演兩尋寶人的其中一人,善用 CP2 所學習到技巧,盡量蒐集越多的寶物。

  • Target: 遊戲結束後,兩尋寶人會有各自的寶物計分,寶物計分較高者勝出。亦即每個玩家需要盡可能的提高寶物計分

Game Rules

  1. 移動

    • 給定某個盤面,並且指定玩家扮演的角色(A或B),請你的程式決定該角色應該移動到哪一個位置。
    • 每一回合,先手玩家先行移動一步(一格),後手玩家才能夠移動一步(一格)
    • 每次移動時,玩家僅能從目前位置選擇,向上、向右、向下、向左選擇一個位置前進,不可選擇停留於原地。
  2. 回合

    • 每一回合,玩家可以移動一步。亦即先手玩家會先一動一步(一格),後手玩家才能夠移動一步(一格)
    • 每一回合的決定移動方向的時間為 1 秒,超過時間限制的玩家將直接輸掉遊戲
    • 回合上限為 1000 次,超過 1000 回合後(即第 1001 個回合)遊戲結束。
    • 若地圖物件已經全部拾取完畢,遊戲將提早結束。
  3. 地圖物件

    • 寶物:寶物不可重複拾取,一經撿拾(走到該寶物座標上方)則物件消失。種類共分五種,地雷、蘑菇、毒蘑菇、無敵星星、無敵毒星星,效果如下
      1. 地雷(b):接觸玩家將會因為受傷導致傷停3回合
      2. 蘑菇(m):接觸玩家寶物計分 +1
      3. 毒蘑菇(n):接觸玩家寶物計分 -1
      4. 無敵星星(s):接觸玩家寶物計分 *2
      5. 無敵毒星星(t):接觸玩家寶物計分 /2 (小數點後無條件捨去)
    • 牆壁(x):玩家無法穿越或移動的對象
  4. 不合法的操作

    • 走出地圖範圍的玩家將被判定為輸掉遊戲。
    • 走入或穿越牆壁的玩家將被判定為輸掉遊戲。
    • 移動不符合向上、向右、向下、向左的操作,將被判定為輸掉遊戲。
    • 玩家為不可穿越的對象,若玩家移動的過程穿越對手玩家,則移動的玩家將被判定為輸掉遊戲。

Input Format

  • 輸入說明:
    • 輸入第一行為一整數 T,表示現在為第 T 回合,並保證 0 < T < 1001。
    • 輸入第二行為兩個整數 $ 0 < M, N \le 20$,代表這張地圖的大小 M * N。
    • 接著 M 行,每行將告訴你地圖上的所有物件,物件與物件之間以空白隔開,物件種類如下:
      1. 'A' 表示 A 玩家目前所在的位置
      2. 'B' 表示 B 玩家目前所在的位置
      3. '.' 表示目前這格上面沒有任何物件
      4. 'b' 表示目前這格上的物件為地雷
      5. 'm' 表示目前這格上的物件為蘑菇
      6. 'n' 表示目前這格上的物件為毒蘑菇
      7. 's' 表示目前這格上的物件為無敵星星
      8. 't' 表示目前這格上的物件為無敵毒星星
      9. 'x' 表示目前這格上的物件為牆壁
    • 隨後兩行依序為兩整數 P, Q ,分別表示 A 目前的得分(P)以及 B 目前的得分(Q)。
    • 最後一行為一字元 C ,他將告訴你目前操控的玩家是誰。

先手 Input 範例

1
8 8
A . t m x s x s
. x x m n m x m
m m b x m t x m
x x . m m . n m
m n . m m . x x
m x t m x b m m
m x m n m x x .
s x s x m t . B
0
0
A

後手 Input 範例

1
8 8
A . t m x s x s
. x x m n m x m
m m b x m t x m
x x . m m . n m
m n . m m . x x
m x t m x b m m
m x m n m x x .
s x s x m t . B
0
0
B

Output Format

根據你得到的 Input,請你決定你操控的玩家將要移動的方向,方向為以下 4 種其中之一:

  • "UP": 表示你期望將你操控的玩家向上移動,並確保這個移動是合法的
  • "DOWN": 表示你期望將你操控的玩家向下移動,並確保這個移動是合法的
  • "LEFT": 表示你期望將你操控的玩家向左移動,並確保這個移動是合法的
  • "RIGHT": 表示你期望將你操控的玩家向右移動,並確保這個移動是合法的

Output 範例

UP
DOWN
LEFT
RIGHT

計分方式

  1. 與助教的機器人對戰 (70%): 將陸續提供一、二、三號等三隻機器人,請定時 pull 新版的本 github repository 取得。
    • 戰勝一隻機器人: 30 分
    • 戰勝兩隻機器人: 50 分
    • 戰勝三隻機器人: 70 分
  2. 與同學的機器人對戰(30%): 所有修課同學的機器人將進行兩兩對戰,再依勝率 * 30 決定分數。即戰勝所有的同學的機器人可以得到 30 分,無法戰勝任何同學則得 0 分。

繳交內容

請至 Moodle 正課頁面的上傳區上傳以下兩個檔案

  1. 程式原始碼,以 學號.cpp 命名
  2. 報告,PDF 檔,不超過四頁(A4),以 學號.pdf 命名,包含以下內容
    • 解法、策略
    • 特別考慮的情況、因素
    • 與三隻助教提供之機器人對戰的結果
    • 其他心得、建議

時程

時間 事項
June 2 期末專題公布(含第一號機器人)
June 9 第二號機器人釋出(請 pull 本 git repository 取得)
June 15/16 線上約談
June 16 第三號機器人釋出(請 pull 本 git repository 取得)
June 23 23:59:59 程式、報告上傳截止
June 30 對戰結果公布

About


Languages

Language:C++ 61.9%Language:Python 28.7%Language:Makefile 9.4%