AGPL-3.0 授權開源
還沒有人教會 AI 掌握集換式卡牌遊戲的反應時機,我們正在嘗試。
公開的卡牌遊戲 AI 研究,大多停在對手能在你的回合裡出手的那一刻。這個計畫在做的是那之後、範圍收斂過的版本,而且完全公開,每一行都能查證。
為什麼這件事很難,幾乎沒人做過
棋盤遊戲是完全資訊遊戲,盤面攤在桌上,可以直接搜尋。卡牌遊戲第一步就打破這件事:牌堆是隨機的,對手的手牌是隱藏的,「目前的盤面」根本不是單一一種可能。
第二道障礙,才是真正決定哪些遊戲能被「解決」的關鍵:對手能不能在你的回合裡出手。爐石戰記是公開研究做得最遠的一款,而卡池比較小其實是次要的理由。真正的理由是對手在你的回合裡幾乎沒有出手的空間,於是一個回合就是一段封閉的序列,可以一路算到底。即使是爐石,研究也不是跑在官方客戶端上,而是跑在社群自己重寫的實作上。得先有人把規則寫成程式,才有立足點,這件事對這份清單上的每一款遊戲都成立。
把規則寫成程式這件事,規模最大的一次嘗試發生在魔法風雲會,而那個結果值得精確地講出來。2016 年 Google DeepMind 發表了 Latent Predictor Networks for Code Generation,它的 benchmark 任務就是這一件事:讀一張卡的印刷文字,產生實作這張卡的程式碼。訓練目標是真的引擎——來自 Java 版 XMage 的 11,969 張魔法風雲會卡牌,以及來自 Python 版 hearthbreaker 的 533 張爐石卡牌。最好的模型,只有 4.8% 的魔法風雲會卡牌完全正確。而它的 BLEU 分數是 61.4:它寫出來的程式碼,看起來非常像它應該寫出來的那一份。這兩個數字放在一起,就是整個問題。「說得通」跟「是對的」是兩種不同的性質,而只有其中一種跑得起來。
那是十年前的事,之後沒有任何研究宣稱這個落差已經被補上。今天存在的東西都是人手寫、社群維護的:魔法風雲會這一側有 XMage 與 Forge,遊戲王有 ygo-agent,而它能訓練是因為底層有 ygopro-core 撐著。兩款遊戲最近各自的 benchmark,MTG-Causal-RL 跟 PTCG-Bench,都顯示 LLM agent 能打出非零的表現,但沒有一個顯示它打得穩定。兩者都是把一組有限的原型牌組放進固定的觀察空間裡比較不同方法,是研究用的 benchmark,不是一個能讓你自我對弈的世界。
Riftbound 站在困難的那一側。它有連鎖,會傳遞優先權與焦點,有反應時機,盤面會在對手的動作之間持續變化。已經有人嘗試過:至少有一個公開的 Riftbound 模擬器接上了樹搜尋,而且是正面處理連鎖結算,沒有迴避它。
這些嘗試都沒有的是一套一致性測試:能逐條核對「實作出來的時機」是不是規則寫的那個時機,也能明確說出哪些部分根本沒實作。沒有這個,「不合法」跟「沒實作」會是同一個答案。對打牌來說沒差,反正兩者都代表你做不到;但對任何要從這個環境裡學習、或引用它當證據的東西來說,這是一個結果跟一個猜測之間的差別。
所以障礙從來不是模型不夠聰明。障礙在於得先有人把規則寫成程式。2016 年之後改變的,是誰來做這件事。這頁講的規則核心不是人一行一行手寫出來的:它由語言模型 agent 寫、由人審、再用綁著官方條號的一致性套件擋下來。那就是 DeepMind 2016 年的那個任務,只是它現在以工程的方式在跑,而不是一次性的 benchmark——而一致性套件取代的正是當年的 exact-match。這件事在這裡特別重要,因為 Riftbound 沒有一個權威實作可以拿來對答案。
另一半的改變,是目標不必再是兩萬張卡。Riftbound 繼承了魔法風雲會的結構——連鎖、優先權、反應時機——困難的機制一個都沒少,但印出來的卡池只有它的一小部分。小到做得完,又結構完整到做完這件事是有意義的。
賭注:範圍收斂,而且容許說「不知道」
不必把每一張卡都做出來。實務上一個環境真正用到的卡只是印出來的一小部分,誠實的工程做法就是收斂範圍:把實際會用到的機制做出來,其餘的明確標成「未實作」。
這只有在一個條件下才成立:系統必須被允許回答 unsupported,而且這個答案要是正式的結果,不是被吞掉的失敗。一旦「拒答」被當成要遮掩的東西,收斂過的範圍就會悄悄變成一個假裝什麼都涵蓋的系統,比乾脆不做還糟。
所以分工是固定的:機械層歸程式管,模型只在程式留下的空間裡推理。不是把規則翻譯成一段 prompt 讓模型讀,而是把規則真的執行出來,劃出一塊它辯不掉的空間。
現在確切走到哪裡
上面講的是目標的完整尺寸,這一節講的是精確現況,兩者不是同一件事。這裡的每一行都由 repo 裡的一致性測試檢查過;測試改了,這頁就是錯的。
- 已完成 時機與權限核心。四種回合狀態、行動與反應時機、優先權與焦點、待定與已結算的連鎖項目。21 個可執行的測試案例,每個都附上它對應的官方條文。
- 已完成 有型別的效果中介表示。12 種操作,加上排序、目標、連動效果、致命清理與觸發發送。直譯器裡沒有靠卡名判斷的條件式:一張卡要嘛用型別化的操作組成,要嘛就是沒實作,而且系統會明講是後者。
- 已完成 共用的結果封裝。五種結果:支援、不合法、不支援、需要人為決定、輸入無效,每個結果都帶著產生時的覆蓋範圍限制。三個使用端系統裡有兩個已經接上。
- 部分完成 卡牌行為包。逐卡條文覆蓋的合約已經存在,也驗證過了,但還沒有正式的卡牌包上線,所以對一副真實牌組來說,誠實的答案還是「無法使用」,工具會照實講,不會硬湊。
- 未開始 合法動作列舉。卡在一致性測試的覆蓋率,不是卡在蒐集對局紀錄。這是讓下游任何東西能搜尋或學習的關鍵一塊。
- 未開始 一場能打完的對局。戰鬥、清理、對決結算、戰場控制,以及所有其他東西都在等的那一項——征服結算、計分與勝負判定。沒有勝負訊號,就沒有東西可以拿來評估,所以這一條擋住了所有「這副牌實際上打得好不好」的下游問題。
- 未開始 對局重建與賽後回顧。規格已經寫完,但刻意不接上,等啟動條件通過才會開。
為什麼我們決定做一個核心出來
這個計畫一開始是一個推導出來的知識庫:每一條都是直接從卡面文字與遊戲機制寫出來的,不是從別人的攻略摘要而來,這讓每一條的重製成本很低,但單獨看也還沒被驗證過。所以全部 46 條都拿去對照既有的實戰打法檢查,其中 3 條完全不用改。
抓到最有價值的問題,其實跟傳奇本身無關。禁牌清單的替換邏輯,把一張無條件發符文給每位玩家的卡,換成一張只發給掌控戰場那方的卡:同領域、同貨幣、完全合法,但這副牌組本來就是刻意放棄前期戰場來換取節奏,這樣替換等於在資助對手。發現這個問題的是計畫外的一名玩家,不是內部檢查抓到的。
那次稽核就是核心存在的理由。從卡面推導出來的東西是站得住腳的;但一旦問題變成一副牌實際上想做什麼、或者現在機制上合不合法,它就撐不住了,而機制那一半沒辦法用推導的,只能靠真的執行。
我們瞄準的那條線
圍棋 AI 值得那些投入,是因為它打贏所有人類。集換式卡牌遊戲不是這種形狀,就算真的做出一個超人類玩家,也不會有多大的價值。這裡瞄準的那條線刻意不一樣,而且用它自己的方式更難:
目標不是打贏人,而是正確地教會人:能說出一副牌在做什麼,也能秀出這個說法根據什麼,並且在它真的不知道的地方停下來。
學會怎麼打,結果是比較容易的那一半。困難的那一半是組牌、讀懂環境,還有知道一張卡被禁的時候該換什麼,而這正是我們自己的替換邏輯出錯的地方,出在一副牌明明有充分合法理由該有信心的地方。這次失敗就是問題本身的形狀,不是要收起來遮掩的難堪。
這會不會有一天長成完整的規則引擎、或是一套學習系統,我們不知道。但它現在累積的東西,結構化的狀態、可執行的一致性測試案例、一條證據軌跡,正是那兩者不管哪一個都需要的地基。
它從哪裡來,產出又回到哪裡去
這不是一個先有 AI、再去找用途的專案。它起於符文戰場編年史的一個內容問題——那是一個繁體中文的 Riftbound 網站:寫一篇牌組攻略,等於在宣稱這副牌實際上怎麼打,而當時沒有任何辦法可以檢查那個宣稱。另一邊,玩家一直在問有沒有東西能解釋規則互動、而且講得出答案是憑什麼。組牌教練與規則諮詢就是這兩個問題,而且是照這個順序來的。
那個網站至今仍是第一個生產環境使用者,這也是這個專案沒有變成展示品的原因。站上的牌組攻略,打法分析就是從這套知識庫產出的,每一篇都掛著明確的 AI 分析標記與方法論連結。寫攻略時撞到的問題會回流進 skill,而上面那場稽核,就是這個迴圈第一次被認真跑起來的結果。
真正能幫上忙的事
靠一個人做太慢了,缺的那些部分,剛好都需要懂這款遊戲或懂工程的人。這裡沒有任何一件事需要先取得許可才能開始:fork 它、把它玩壞、或直接開一個 issue 都可以。
- 找出推導的破綻
- 那個替換邏輯的 bug,是一個比程式更懂那副牌的玩家找出來的。這現在還是價值最高的貢獻方式,而且完全不用寫程式。
- 把機制寫進核心
- 型別化的操作跟一致性測試案例,每一個都要對應到一條官方條文。這是目前的瓶頸:把規則變成程式就是整個障礙所在,而且這件事可以並行分工。
- 把一場對局收尾
- 計分與勝負判定是上面唯一擋住其他所有東西的那一項,而且它是普通的、可測試的工程,不是研究。所有能評估一副牌的東西都排在它後面。
- 把這套方法搬到另一款遊戲——包括魔法風雲會
- 這套做法沒有一處是 Riftbound 專屬的,而最明顯的目標就是魔法風雲會本身。XMage 與 Forge 已經實作它二十年,但兩者都沒有綁著條號的一致性套件——所以兩者都分不出「不合法」跟「沒建模」,而那正是任何要從它們身上學東西的系統所仰賴的區別。魔法風雲會之外,這幾年冒出來的西式卡牌遊戲比九〇年代之後的任何一個十年都多:Flesh and Blood、Star Wars: Unlimited、Disney Lorcana、Sorcery: Contested Realm、Altered、Grand Archive。它們在「對手能在你的回合裡做多少事」這件事上差異極大,而那正是這個專案整個組織起來的那條軸線;就我們找得到的範圍,它們沒有一款有附一致性套件的公開規則核心。第二款遊戲才是這套方法能不能推廣的真正檢驗——而第一個做出套件的人,會讓後面每一款都變便宜。
什麼是拒絕,什麼只是還沒做
規則引擎、AI agent、訓練出來的玩家模型,是三件不同的東西。這個專案從第二件開始,後來寫出了第一件的一小塊。這裡沒有訓練好的策略、沒有自我對弈語料、沒有完整狀態機,也沒有全卡效果引擎。
那是一個順序,不是一個拒絕。學出來的策略在正確環境的下游:拿沒有人驗證過的規則去訓練,它學到的就是那個環境的 bug——而且是自信且隱形地學到,因為它確實在贏你交給它的那個遊戲。一致性套件不是擋在學習前面的障礙,它才是讓學習結果有意義的東西。
真正被拒絕的東西窄得多,而且會一直拒絕下去。它不替你打牌。這裡所有東西都在準備階段——組牌、理解、練習、回顧。在二號玩家模式裡,隱藏資訊、合法性、結算與每一次狀態更新都由真人掌握,引擎的結果動不了其中任何一項。它不發布勝率、使用率、Tier 排名或對局表。一套權威的規則引擎——包括哪天真的出現官方數位客戶端——只會讓這個專案更有用,而不是變得多餘:那個引擎服務的是「打」,這個服務的是「準備」。
Riot 的 Digital Tools Policy 對組牌管理工具與教育性質的工具是開放的,但也明講不會預先核准自動執行規則的工具或對戰模擬器。這條界線在野心之前就先決定了設計方向:每一個出牌建議都要等人確認過才算數。它是為研究與教育用途打造的,賽事期間使用會違反賽制規定。