文件 指南

範例 Bot

四個由淺入深的範例,每個都能直接執行,每一段邏輯都對應一項 SDK 能力。另附一個完整的參考大腦。

範例都在 brains/examples/,後一個繼承前一個,只加入新東西。建議依序閱讀:

範例學什麼執行方式
hello_bot.py採集(一座礦 5 人、礦滿了就去伐木)、生產農民(佇列只排 1 個)、蓋人口建築、續建停工的地基;四個種族都能跑python tools/play.py --bot brains/examples/hello_bot.py
rush_bot.py兵營和祭壇(沒有就用 build_near 蓋)、先出英雄(陣亡就復活)、有技能點就學、湊滿一波就攻擊移動… --bot brains/examples/rush_bot.py
macro_bot.py建造順序 + 蓋完自動回礦(Shift)、人口卡住立刻補、兵營佇列 1 個、攻防升級、升級主堡和高階兵種、依地面實際路程選目標並沿路徑前進… --bot brains/examples/macro_bot.py --speed 200
micro_bot.py在運營之上接手戰鬥:集火最快能擊殺的目標、拉回殘血單位、英雄保命、夜裡挑打得贏的野怪營地、敵人摸到家門口就回防;一拍的命令一批送出… --bot brains/examples/micro_bot.py --fair

hello_bot 和 rush_bot 的註解裡記錄了實機踩到的坑,例如「每次都挑第一個工人去蓋房子,結果 3 座農場全是蓋到一半的地基」「寫死的兵營座標剛好是樹林,3 分鐘一座都沒蓋出來」。讀註解比讀程式碼更有收穫。

hello_bot:經濟

# 種族 -> (工人, 各級大廳, 人口建築)
RACES = {
    "h": ("hpea", {"htow", "hkee", "hcas"}, "hhou"),
    "o": ("opeo", {"ogre", "ostr", "ofrt"}, "otrb"),
    "u": ("uaco", {"unpl", "unp1", "unp2"}, "uzig"),
    "e": ("ewsp", {"etol", "etoa", "etoe"}, "emow"),
}
MINE_CAP = 5            # 一座礦最多 5 個農民(再多收入也不會增加)
LUMBER_CREW = 5         # 伐木人數:每座礦 5 個採金 + 這麼多伐木 = 工人目標數

做三件事:閒置工人去採金(自己記錄每座礦有幾個人,礦滿了就去伐木);工人不夠就生產(佇列裡只排 1 個);人口快滿時,找一個沒在蓋房子的工人,在大廳旁邊蓋人口建築(人類、獸人還會派人去續建停工的地基)。

rush_bot:出兵與出擊

在 hello_bot 的基礎上加三件事:兵營和祭壇沒有就蓋;祭壇出英雄(陣亡了先復活,英雄是唯一的)、有技能點就學;湊到 8 個兵就全體攻擊移動到敵方大廳,打殘了就回家重新集結。只對閒置的兵下令,避免每一拍都打斷戰鬥。

macro_bot:運營基本功

TECH = {
    "h": dict(order=["halt", "hbar", "hbla", "hlum"], altar="halt", hero="Hamg", skills=["AHwe", "AHbz", "AHab"],
              barracks="hbar", soldiers=["hfoo", "hrif", "hkni"], smith="hbla", upgrades=["Rhme", "Rhar", "Rhra", "Rhla"],
              tiers=["hkee", "hcas"]),
    ...
}

職業玩家每局都在做的幾件事,每一條都對應一項 SDK 能力:建造順序表 + gather(..., queue="after") 蓋完回礦;production().blocked 偵測人口卡住;g.queue 確保兵營只排 1 個;can_do 詢問引擎能不能研究下一級攻防;升級主堡和高階兵種(實機教訓:一直停在 T1,23 分鐘被 T3 的騎士、獅鷲騎士推平);依 path_distance 選目標、用 path() 沿轉折點前進。

micro_bot:開打之後

def _fight(self, g, army, foes, home, now):
    ...
    visible = [e for e in foes if e.visible_to(me)]              # 看不見的目標會被拒(1001)
    atk = [s for s in (g.stats(u) for u in fighters) if s]
    target = min(visible, key=lambda e: _ttk(g, atk, e))         # 最快能擊殺的,不是最近的
    idle_or_other = [u for u in fighters if g.current_target(u) is None
                     or g.current_target(u).handle != target.handle]
    if idle_or_other:
        g.attack(idle_or_other, target)

實機結果:5 分鐘 1497 拍、3023 條命令、0 錯誤。

參考大腦:一個完整的 AI

brains/xwar3/ 是一個完整的、會開分礦、練功、出擊的 AI,分為三層:

層位置節奏做什麼
策略層strategy/秒級AMAI 式的多戰略選擇與切換、建造表、反制兵種、選英雄;可選的 LLM 運營顧問
毫秒層reflex/(4 個獨立行程)100 ms 級保命、施法、集火、撿裝備
勝率模型worldmodel/—打不打得贏(推理子集)

多個行程透過仲裁表共用單位,依優先順序決定誰說了算:手動操作 95 > 保命 90 > 閃避技能 85 > 施法 80 > 撿裝備 70 > … > 策略 50 > 派工 45。你自己的 Bot 在表裡的身分是 bot,預設優先順序為 50。

參考大腦直接使用 SDK 的底層(w3cmd/act),而且大量依賴全圖資訊。它適合當作「思路」參考,不建議讓 LLM 直接照抄。它需要 AMAI 資料:start.bat 第一次部署時會從 AMAI 的公開儲存庫拉取並產生(AMAI 採自訂授權,產出的檔案不納入 git;沒有成功的話,用 start.bat setup 重試)。

啟動參考大腦最簡單的方法是用遠見指揮台:在「實例與開局」頁勾選實例編號,點「開始測試」。