PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

PySC2 2.0是在幾天前剛剛發佈的。最新版本的學習環境有了很大的的增強,但也出現了一些軟件不兼容的問題。

在本教程中,你將會構建一個基本的“蟲族機器人”,這個機器人將能夠生成跳蟲(遊戲"星際爭霸"中的兵種)並通過地圖座標對敵人發動攻擊。作者這裡已經假定你有基本的Python編程知識,並且能夠安裝PySC2 2.0。那麼,現在開始教程吧。

1. 創建基本代理

首先,我們導入基本模塊:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

現在我們可以創建代理:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

Step()方法是我們代理的核心部分,它是我們所有決策制定的地方。在每一步結束時,你必須返回一個動作,在這種情況下,這個動作就是什麼都不做。我們會盡快添加一些行動。

如果你看過作者以前的教程,你就會注意到這個動作的格式已經改變了,以前的最後一行是:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

作者認為新格式更容易遵循。這一步的完整代碼在這裡。

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step1.py)

2. 添加運行代碼

現在我們建立環境,以便我們可以運行它。在作者的原始教程中,我們在命令行上運行了代理並傳入了許多參數,但是在這裡,我們將添加一些代碼,以便代理可以在沒有這些額外參數的情況下運行。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

作者選擇在這裡使用深淵礁圖地圖,這比作者之前的教程中的Simple 64地圖更有趣。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這裡我們指定的第一個玩家是我們的代理人,並且代理人的種族是蟲族。如果你很勇敢,你可以通過使用sc2_env.Race.protoss,sc2_env.Race.terranor甚至sc2_env.Race.random來選擇其他種族。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

接下來我們指定第二個玩家是一個機器人,這意味著它使用遊戲的內部AI,機器人的種族是隨機的,難度級別較低。

在這個空間中,你可以指定另一個代理,允許兩個代理相互對戰!

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這裡我們指定屏幕和小地圖分辨率,這些是PySC2 1.x中的默認值。這些分辨率基本上決定了每個功能圖層中有多少"像素"數據,這些圖層包含地形高度、可見性和單位所有權等內容。你的機器人可以使用這些功能來做出決定。

PySC2 2.0的一個新功能是增加了RGB層,它本質上是可以看到的渲染遊戲,如果你想使用該層,你需要在這裡指定維度,但是作者不會在本教程中討論該問題。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

該參數決定了在你的機器人選擇要採取的動作之前會經過多少道"遊戲步驟"。 默認情況下,該設置為8,在"正常"遊戲速度下約為300 APM,我們將其設置為160,以將APM降低到150。在此階段,額外的APM不是必需的,如果你採取更少的行動,遊戲會更快地完成。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

在這裡我們設置了每個遊戲的固定長度,PySC2 1.x中的默認值在正常速度下大約為30分鐘。 在PySC2 2.0中,你可以將此值設置為0,從而允許遊戲在必要的時候運行。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這最後一個參數是可選的,但它可以方便地查看可視化,因為它包含有關機器人可用的所有觀測圖層的詳細信息。通過在屏幕上看到這些圖層,你可以更好地理解它們。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

代碼的其餘部分僅僅是循環,將步驟細節提供給代理,接收一個動作,並重復直到遊戲結束或直到終止。

現在你可以運行你的代理:python zerg_agent.py

你應該可以看到你的代理在收集礦物,直到它最終被敵人佔領。

這一步的完整代碼在這裡。

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step2.py)

3. 選擇一個無人機

在蟲族代理生產任何跳蟲之前,它需要一個產卵池。為了建立一個產卵池,我們需要選擇一個無人機。

PySC2 2.0的一個很酷的新功能是增加了功能單元,它允許你通過屏幕要素圖層獲取有關屏幕上無法觀察或獲取困難的單位的信息。我們將使用功能單元來選擇無人機。

另一個很酷的新功能是增加了一個單元列表,它允許你使用單元名稱檢索單元類型。以前我們用_TERRAN_SCV = 45之類的東西來編寫我們自己的單元類型,但現在我們可以使用諸如units.Terran.SCV之類的東西。

讓我們將單元列表添加到模塊導入中:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

我們還需要一些隨機模塊。

接下來,我們需要啟用功能單元:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

現在,在step()方法中,讓我們使用功能單元功能獲取屏幕上所有無人機的列表:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這很酷,對吧?!以前你可能做過類似的事情:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

現在,我們選擇一個無人機:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

此處的select_all_type參數的作用類似於CTRL +單擊,因此它將選擇屏幕上的所有無人機。正如你所看到的,無人機的x和ycoordinates可以作為屬性訪問。還有更多的屬性可以訪問,如健康、盾牌、能量、build_progress以及重要的ideal_harvesters和assigned_harvesters的基地和vespene。

如果你喜歡,你現在可以運行代理,以確保你的無人機已被選中。

這一步的完整代碼在這裡

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step3.py)

4. 建立一個產卵池

在上面的代碼之上,讓我們確定我們選擇了一個無人機。現在,在我們的課堂中添加一個小實用方法:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

該代碼檢查單選和多選,以查看第一個選定的單位是否是正確的類型。在step()的頂部,我們可以使用這個方法:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

接下來我們要確保我們可以建立一個產卵池。如果我們沒有足夠的礦物質,這是不可能完成的,所以如果我們不首先檢查就會導致崩潰:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

然後,我們可以在屏幕上選擇一個隨機點:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

最後,我們將隨機座標輸入到動作中。

試試看,如果你幸運的話,你將擁有大量的產卵池。我們如何阻止我們所有的無人機成為產卵池?

讓我們添加另一種實用方法來選擇給定單位類型的單位:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這與上面的代碼相同,但可以根據需要將unit_type換出。讓我們使用該方法來替換以前的代碼:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

然後我們可以使用該方法來獲取產卵池:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這樣比較好,現在我們需要只建立一個產卵池。

這一步的完整代碼在這裡。

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step4.py)

5. 建立跳蟲

現在我們有了一個產卵池,我們終於可以建立一些跳蟲了。我們首先選擇屏幕上的所有幼蟲:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

然後我們可以創建一些跳蟲。將此代碼放在前一個代碼的上方:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

測試它,你應該能得到一個跳蟲。

這很好,但我們無法建立足夠的跳蟲,我們的供應是有限的。我們需要一個霸主。

這一步的完整代碼在這裡。

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step5.py)

6. 產生更多霸主

當我們選擇了幼蟲時,如果我們不能自由的供應,我們可以產生一個霸主。

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

讓我們添加另一種方法:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

我們現在可以替換行動檢查:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

和:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

和:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

如果你現在測試你的機器人,你會發現它產生了很多的跳蟲,是時候進行攻擊了!

這一步的完整代碼在這裡。

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step6.py)

7. 攻擊

在我們攻擊之前,我們需要知道我們在哪裡以及敵人在哪裡。在本教程中,我們將假定產卵位置總是在左上角和右下角。所以我們需要找出我們的位置,並攻擊對方。

我們來創建一個__init __()方法來初始化一個變量:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

在step()方法開始時,添加以下內容:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

obs.first()代碼檢查它是否是遊戲的第一步。然後我們在小地圖上得到我們單位的中心x和y座標。這裡有一個功能圖層,它根據他們所屬的人員來顯示小地圖上的所有單位。

現在我們有攻擊位置,讓我們來攻擊。首先選擇我們的軍隊:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

在此之前,我們可以攻擊:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

測試一下。我們的跳蟲會被咬!在我們攻擊之前,等到我們有更多的跳蟲時進行這一步:

PySC2 2.0新功能利與弊,用“星際爭霸”的實例告訴你!

這一步的完整代碼在這裡

(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step7.py)


分享到:


相關文章: