## 資訊營 CHALLENGE
網址:https://hackmd.io/@Lisa/BJTsa5w6t#/
----
## 遊戲下載
zip 檔放在雲端資料夾裡,記得下載解壓縮使用!
Note:
為了分流,請大家依小隊來選擇下載網址:
1/6 : http://linux3.csie.org:7513
2/7 : http://linux5.csie.org:7513
3/8 : http://linux8.csie.org:7513
4/9 : http://linux10.csie.org:7513
5/10: http://linux11.csie.org:7513
---
準備好了嗎?
故事要開始了ㄛ!
----
相傳在天地開闢之初有一間神秘的旅店,專門給熬夜爆肝死線快要到的工程師投宿。他,叫做德田商旅。
----
在德田商旅裡面,有一個最重要的設施——工作站。為所有來訪的工程師提供快速的網路、穩定的計算資源、跟大量的儲存空間。成為了這些熬夜爆肝的戰士們,在無盡死線沙漠裡的一片綠洲。
----
但那樣安穩的日子並不長久......有一天,德田工作站突然發生了大故障。在德田商旅投宿的工程師們投訴無門,眼看死線將至,他們不得不開始爭奪僅存的資源。此時身邊的電腦、USB等等工具皆化身成了武器,曾經一起熬夜寫code的夥伴如今成為了敵人。一場工程師之間的腥風血雨,就此展開...
---
## 講人話
- 這是一個 4 人遊戲
- 你是一個爆肝工程師
- 你要攻擊別人,得到分數
- 分為普通攻擊和特殊攻擊
- 特殊的攻擊需要道具
- 至於道具有什麼,嘿嘿我怎麼可能會跟你說
----
## 講人話(續)
* 這是一個 4 人遊戲
* 每個小隊要用 Python 寫一個 AI 來玩遊戲
* 最後一天會打一個積分賽,選出最強的 3 個小隊
* 最終魔王等待著最強 AI 的挑戰……
* 遊戲詳細介紹: [Document](https://hackmd.io/UvhCsh9KTW2z8Mz5gsp7rQ)
---
### 具體來說,AI 要幹嘛?
* 現實生活的時間是連續的,但遊戲裡是一格一格的
* AI 要在每個時間點,決定要做什麼動作
* 總共有 7 種基本動作:
``` ==python3
AI_DIR_LEFT = 0
AI_DIR_RIGHT = 1
AI_DIR_JUMP = 2
AI_DIR_LEFT_JUMP = 3
AI_DIR_RIGHT_JUMP = 4
AI_DIR_ATTACK = 5
AI_DIR_SPECIAL_ATTACK = 6
```
Note:
一秒被切成 60 個時間點,每個時間點要回傳這 7 個裡面的其中一個
----
我們還為工程師們提供高級動作!!
``` ==python3
action = {'left': True, 'right': False, 'jump': True, 'attack': True, 'special_attack': False}
```
程式會判斷 boolean 值為 `True` 的動作,並且予以執行。讓工程師一邊移動一邊攻擊別人!
----
### 具體來說,AI 要幹嘛?(續)
* 你們要討論出自己 AI 的策略,然後用 Python 寫出來
* 例:`AI/team_default.py`
Note:
平常都是人在玩遊戲,我們要想看看自己會用什麼策略來玩,然後寫成一個 Python AI。
等等會看 `team_default.py` 裡面在幹嘛
---
## 執行遊戲
1. 把下載下來的 .zip 檔 **解壓縮**
2. 打開 vscode,按左上角的 File -> Open Folder... ,打開我們的 Challenge 資料夾
3. 開啟終端機,打 `python main.py` (Windows: 按 ctrl + shift + ` 來開啟)
Note:
要示範給他們看,用 vmware 開 Windows。
----
![](https://i.imgur.com/bb9Kc3w.png)
---
## 來看看遊戲檔案
* `AI` 資料夾用來存放 AI 的程式碼,範例 AI 跟你們的 AI 都要放在裡面
* `README.md` 裡面這個投影片的連結和遊戲的 Document
* 其他檔案都是遊戲執行會用到的,不用理會
---
## AI 的檔案格式
* 檔案必須是 `team_<name>.py` 的格式其中 `<name>` 是你幫你的 AI 取的名字,如 `team_alice.py`、`team_bob.py`
Note:
* 第五天上繳檔案時,要把檔名改成 `team_<小隊編號>.py` ,如 `team_3.py`
* 這幾天都 **不要關機**,下課前會提醒大家要把程式碼備份到隊輔傳給你們的雲端空間(怕別組偷看你的 AI 的話可以刪掉 AI 的檔案)
----
## AI 的檔案格式(續)
1. 在左邊的資料夾裡面,在 AI 資料夾裡面找到 `team_default.py`
2. 新開一個檔案叫作 `team_<name>.py` 在 `team_default.py` 旁邊,把 `team_default.py` 的內容貼到 `team_<name>.py` 裡面
3. 下一頁來看裡面寫了什麼內容
Note:
示範,用 vmware 的 windows
----
## AI 的檔案格式(續)
1. 有一個 class `TeamAI`(不要改他的名字),你們要寫的是 `decide` 這個函數的內容
2. `decide` 函數要回傳的值就是上面提到的 7 種行為
3. 參考 [Document](https://hackmd.io/UvhCsh9KTW2z8Mz5gsp7rQ#Helper) 裡面的 Helper,讀取遊戲的狀態,經過一些自己的判斷,決定當前時間點要幹嘛
----
## AI 的檔案格式(續)
```python3==
AI_DIR_LEFT = 0
AI_DIR_RIGHT = 1
AI_DIR_JUMP = 2
AI_DIR_LEFT_JUMP = 3
AI_DIR_RIGHT_JUMP = 4
AI_DIR_ATTACK = 5
AI_DIR_SPECIAL_ATTACK = 6
class TeamAI ():
def __init__ (self, helper):
self.helper = helper
self.enhancement = [0, 0, 0, 0]
def decide (self):
# use special attack
if self.helper.get_self_can_use_special_attack():
return AI_DIR_SPECIAL_ATTACK
# pick the nearest item
pos = self.helper.get_nearest_item_position()
if pos is not None:
self.helper.walk_to_position(pos)
return None
```
----
## AI 的檔案格式(續)
還記得你們拿到的神秘強化卡嗎?
```python3==
...
class TeamAI ():
def __init__ (self, helper):
self.helper = helper
// 分別填入你有的強化卡數量
self.enhancement = [0, 0, 0, 0]
def decide (self):
...
...
```
![](https://i.imgur.com/deACmJs.png)
----
## AI 的檔案格式(續)
善用 `walk_to_position(position)` 函數!
(在 [Document](https://hackmd.io/UvhCsh9KTW2z8Mz5gsp7rQ#Helper) 的輔助函式區)
---
## 執行遊戲(續)
* `python main.py $1 $2 $3 $4`
* `$1` ~ `$4` 就傳 4 個玩家的 AI 名稱
* 如果你們寫了 jason(`team_jason.py`) 跟 json(`team_json.py`) 兩個 AI,想讓他們兩個和 default AI 較量一下,就可以執行
`python main.py jason json default default`
* 建議不要改 default AI,要改的話複製到自己的檔案來改,這樣子要判斷自己 AI 的強度才有得對照
----
## 執行遊戲(續)
* `python main.py $1 $2 $3 $4`
* `$1` ~ `$4` 就傳 4 個玩家的 AI 名稱
* 如果要加入手動玩家,AI 名稱那邊就打 `m`
* 例如,`python main.py m default `
`jason m` 代表第 1 和第 4 個玩家是手動玩家,第 2 個玩家是 default AI,第 3 個玩家是 jason 這個 AI
---
## 小叮嚀
* 如果 AI 的運算量太大,可能會影響到遊戲的進行
* 在 debug 的時候,如果你覺得 AI 的行為跟你想像中不一樣可以加個參數 `python main.py $1 $2 $3 $4 --debug`,或把東西 print 出來,看看他的值是不是跟你想像的一樣
* 有任何問題都可以來信問我們ㄡ!
---
## 小挑戰
三個手動玩家打一個 default AI,其中兩個以上手動玩家獲勝,獲得加分卡 *1
Note:
這個等等大家可以試,現在先繼續聽我講完最後的小叮嚀
雖然這邊叫大家合作來打 default AI,但其實最後各小隊的比賽不是合作模式,是競爭模式喔
---
那麼,祝好運!
Note:
1:https://drive.google.com/drive/folders/1cQ4mPFjxZiXQlxVTU90H2Te7B8-3ecMh?usp=sharing
2:https://drive.google.com/drive/folders/19884qPmQrbP_eXx1YkQzNUg2MMH2qN8n?usp=sharing
3:https://drive.google.com/drive/folders/1ZLOppX8lbCWI87FFKfH6mHtf0hPzuyoK?usp=sharing
4:https://drive.google.com/drive/folders/1260-w4s68EIFFQrHGuAyT31XrWINYnWH?usp=sharing
5:https://drive.google.com/drive/folders/1gAOmzXtFoPrMoUhLfA3NdGKBo5c7_Ro5?usp=sharing
6:https://drive.google.com/drive/folders/1JmC-clyWDud-zYSXi0KpltYcimXBIR7Q?usp=sharing
7:https://drive.google.com/drive/folders/1c04ZFvcb15OZG4mlV9hrGpSe4iXGpInd?usp=sharing
8:https://drive.google.com/drive/folders/1MstNJMLS0LxnEZSziAnHgEYDMo60pjX8?usp=sharing
9:https://drive.google.com/drive/folders/1vo488xqLdsR1VI_p0_knEyJFB4tHb_IP?usp=sharing
10:https://drive.google.com/drive/folders/11W5LFVEoC7eXPlzyuu9XIDhYkildP_Bt?usp=sharing
{"metaMigratedAt":"2023-06-16T18:21:00.644Z","metaMigratedFrom":"YAML","title":"Untitled","breaks":"true","slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"914a5020-4c19-4f73-afb8-0ce06e275ba9\",\"add\":6479,\"del\":1175},{\"id\":\"1a94d910-a05e-4f8c-92dd-ec5a338fa9b4\",\"add\":305,\"del\":168}]"}