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