AI Challenge
楊皓丞
介紹一下自己
- 跟上一個講師比起來...
- 都是貓派
- 我家有貓 他沒有
- 披薩上可以有鳳梨(夏威夷好吃)
- my_coding_style v.s. hisCodingStyle
Mirrors
在2019年
太平洋上某座島嶼南部
突然湧出大量石油...
每位玩家都想藉機發大財
因此透過撿拾及搶奪石油
以及購賣和使用道具
玩家們開始了一場前所未有的石油爭奪大戰...
我們的總目標
- 這是個4人遊戲
- 每個小隊要寫出一支AI來操控玩家
- 最後一天會打一個循環賽 選出最強AI的小隊
- 最強魔王會在終點處靜待最強的3個小隊的挑戰...
- 詳細遊戲介紹: document
你們的AI要做的事
- 決定每個時間點要幹嘛
- 現實世界中的時間是連續的,但遊戲中是一格一格的
- 每個時間點你的AI需要決定玩家要做什麼動作
- 動作有10種:靜止不動,8方位的移動,及使用/購買道具
- 你們最主要的任務,就是小隊討論出AI策略後實作出來
如何執行遊戲
- 把zip檔解壓縮,然後“下載”資料夾更名成含有小隊編號
- 這是因為會有另一個小隊使用同一台電腦,怕搞混檔案
- 跳到這層 從任意一個檔案的內容中複製位置
如何執行遊戲
- 開啟anaconda prompt
- cd [貼上剛剛複製的位置]
- 好 現在我們到遊戲資料夾中了
- 雙擊SetupAnacondaPrompt.bat 等他跑好
- 輸入python main.py來啟動遊戲
- 手動玩家的按鍵操作方式見document
來看看遊戲檔案
- 在遊戲的資料夾中:
- AI資料夾是用來存放AI檔用的
預設AI和你們寫的所有AI都在裡面 - README.txt中有document和此投影片的連結
- SetupAnacondaPrompt.bat是python課時
講師請大家執行的檔案,若有人的電腦重開機
就需要再執行一次 - 其他的檔案都是遊戲運行用的,不需理會
AI檔案的格式
- 檔名必須是"team_name.py"
name是你自己幫取AI取的名字 - 第五天最後上繳檔案時,把你們決定要繳
的檔案改名成"team_id.py",id是小隊編號 - 這幾天離開時電腦都不用關機,不過怕檔案遺失
所以離開前請把AI檔案備份在隊輔的雲端中
AI檔案的格式
- 寫一個class method: decide
- 遊戲每個單位時間會執行一次你的decide
來得知你這個單位時間想要做什麼 - return value有下列幾種:
- AI_STOP: 不動
- AI_DIR_U, AI_DIR_R, AI_DIR_D, AI_DIR_L
AI_DIR_RU, AI_DIR_RD, AI_DIR_LD, AI_DIR_LU:
往上/右/下/左/右上/右下/左下/左上前進 - AI_TRIGGER_ITEM: 購買/使用道具(由於在擁有或
使用道具中時不能再購買,因此是同個操作)
如何使用API
- 為了判斷此時此刻該做什麼操作(往哪走,
要不要買/使用道具),會想知道遊戲的狀態 - 簡單來說,手動玩家看得到的資訊,AI也需要知道
- 例如場上石油的位置,其他玩家的分數,...
- 此時可以利用helper(可以想像成小幫手)中的函式
以及常數來得到遊戲狀態 - 例如get_oils()可以得到一個list of 2-tuples,包含
場上所有石油的座標(座標是2維的,因此用2-tuple) - get_oil_level()則可以得到一個list of ints,包含場上
所有石油的等級(玩家看到的石油顏色) - 其他的API用法請見document中的說明
小補充
- 每次判斷要往8個方向中的哪個走可能很麻煩
- 通常你可能會想沿著某個方向向量前進,因此
會想找8方位中最接近此方向的 - helper中的get_direction(v)這個函式讓你可以
傳入一個向量(2-tuple),他會回傳8方位中最
接近此向量方位的移動操作 - __init__中的equipments記得填入各裝備卡數量
- __init__中的color要填一個3-tuple,也就是某個顏色
的RGB value,各小隊可以調整成覺得好看的顏色
來看看default AI
from AI.base import *
class TeamAI(BaseAI):
def __init__(self, helper):
self.helper = helper
self.equipments = [0, 0, 0, 0, 0] # Set the number of your equipments.
self.color = (255, 255, 255) # Set the color you like.
def decide(self):
my_pos = self.helper.get_player_position()
radius = self.helper.player_radius
carry = self.helper.get_player_value()
nearest_oil_pos = self.helper.get_nearest_oil()
home = self.helper.get_base_center()
destination = nearest_oil_pos if carry < 5000 else home
if destination is None:
return AI_DIR_STOP
else:
direction = (destination[0] - my_pos[0], destination[1] - my_pos[1])
return self.helper.get_direction(direction)
如何執行遊戲-2
- python main.py $1 $2 $3 $4
- $1~$4要填入4位玩家使用的AI名
- 例如若你們寫了一個team_Pie.py和一個
team_Pei.py,想和default AI一起較量一下 - 可以執行python main.py Pie Pei default default
- 就可以看到他們自動開始玩起來了
- 建議不要改動default AI,要改的話複製到新檔案再改
- 這樣要判斷自己AI的強度時才有得對照
如何執行遊戲-2
- python main.py $1 $2 $3 $4
- $1~$4要填入4位玩家使用的AI名
- 為了方便,_(底線) = default
- ~(波浪) = 手動操控此玩家
- 沒填滿$1~$4的話 剩餘的視為手動操控
- 這也是為什麼前面可以用python main.py玩
- 若執行python main.py Pie ~ _
- 玩家1會由Pie這個AI操控,玩家2和4手動操控,
玩家3是default AI操控
小挑戰
- 兩個手動玩家合作打兩個default,其中一位
手動玩家獲得第一名 -
兩個手動玩家合作打兩個default,幫default
裝備所有裝備卡各3張,其中一位手動玩家獲得第一名
如何執行遊戲-2
- 若出現Error: AI can't load,代表你寫的
AI程式有格式錯誤,可以問隊輔或是助教 - 出現Error的玩家會由default AI代玩
- 若遊戲進行中crash了,通常代表你寫的AI
程式出現bug了,也可以問隊輔或是助教 -
AI程式的運算量若太大,遊戲會沒辦法正常速度進行
所以想好策略可以跟隊輔討論或確認可不可行! - 當然,在發問前先嘗試自己能不能找到問題也很好!
Challenge 2019
By Howard Yang
Challenge 2019
- 438