← 開發手記
《經典暗棋》遊戲畫面

經典暗棋的設計手記:一個不偷看蓋牌的電腦

PiuPiu Games 團隊 · 2026 年 11 月 5 日 · 台灣暗棋 · 電腦對手 · 難度分級

▶立即免費玩

《經典暗棋》是 PiuPiu Games 的台灣暗棋網頁遊戲:32 顆象棋全部蓋著、洗亂排在 4×8 的棋盤上,雙方輪流翻棋或走棋,大吃小、兵吃帥、炮隔一顆跳吃。可以跟三種難度的電腦對下,也可以開房間跟朋友連線。這篇手記記錄兩件事:規則為什麼這樣選,以及我們怎麼做出一個「不作弊、而且三種難度真的分得開」的電腦對手。

為什麼只做最通用的規則

暗棋幾乎每個台灣人都下過,但幾乎每一桌的規則都有點不一樣:有人允許車直衝一整排、有人允許連吃、有人禁止長捉。我們在平台上其實已經有一款原創的暗棋變體《激戰象棋》,所以這一款的目標很單純:做大家最熟悉、爭議最少的版本。

車直衝、連吃、長捉這些地方規則一律不做。想玩變化的,可以去玩激戰象棋。

和局規則:連續 60 手沒吃也沒翻

暗棋的殘局有個老問題:雙方都只剩幾顆棋時,弱的一方只要一直繞圈逃跑,強的一方常常怎麼追都追不到,整盤棋就這樣永遠下不完。現場下棋時大家會說「好啦算和局」,但電腦遊戲需要一條明確的規則。

我們的規則是:雙方合計連續 60 手(各 30 手)沒有吃子、也沒有翻棋,就判和局。剩 20 手時畫面會開始倒數提醒,讓佔優勢的一方知道要加快推進。60 手夠長,不會在正常攻防中誤判;也夠短,不會讓一盤註定和局的棋拖到讓人想關掉遊戲。

電腦不偷看蓋著的棋

做暗棋電腦最容易的作弊方式,是讓它知道每一顆蓋著的棋是什麼。這樣它永遠知道翻哪裡最好,但對玩家完全不公平。我們的電腦看不到蓋著的棋,它只知道「還沒翻出來的棋裡,各剩幾顆」。

當電腦考慮要不要翻某一格時,它會把每一種可能都想一遍:這格有多少機率是對方的帥、多少機率是自己的兵……每種結果各自往後推算,再依機率加權平均,得出「翻這一格」的期望值,再拿去和「走一步明棋」比較。這跟人在下暗棋時的思考其實一樣:「對方的炮都還沒出來,這時候翻旁邊那格風險很大。」

好友對戰時也一樣,蓋著的棋只存在伺服器上,你的手機只知道那一格是「蓋著的」。所以不管是電腦還是朋友,都不可能偷看。

每顆棋值多少:炮為什麼比車值錢

電腦判斷局勢好壞,第一步是幫每顆棋估一個價值。照一般象棋的直覺,車應該比炮值錢,但暗棋不一樣:

棋子每方幾顆電腦估的價值理由
帥/將160最大,但對方每多一顆兵活著,價值就打一點折扣
仕/士230只怕帥,幾乎什麼都能吃
炮/砲218跳吃不分大小,連帥都吃得到
相/象215排第三大
俥/車29暗棋裡車只能走一格,比不過上面幾顆
傌/馬26只比炮和兵大
兵/卒54(對方帥還在時是 8)平常最小,但它是唯一能吃帥的棋

炮的價值排在車前面,是因為在暗棋裡,炮是唯一「不看大小」的棋:只要有砲架,它連對方的帥都吃得到。兵也很特別:對方的帥還活著時,每一顆兵都是潛在的刺客,價值會加倍;帥被吃掉之後,兵就變回最小的棋。

殘局:只會追,追不到

早期版本的電腦有一個明顯的弱點:殘局佔優勢時,它只會「往對方的棋靠近」,結果對方一閃,它又跟過去,兩邊在棋盤上繞圈,最後被 60 手規則判和局。

問題在於,暗棋的殘局不是靠追,而是靠包夾。4×8 的棋盤很小,一顆棋最多只有上下左右四個方向可以逃。所以我們在殘局(所有棋都翻開之後)加了一個新的判斷:對方每顆棋周圍,還剩幾格「走過去不會被吃」的安全空格?安全空格越少,局勢對我方越好。普通和困難的電腦到了殘局,還會比平常多往後算兩層。

另外,當雙方已經有 20 手沒有進展時,電腦會把自己的優勢估低一點,逼自己主動推進,而不是安穩地繞圈等和局。

算不完的翻棋:電腦在哪裡偷懶

暗棋電腦最大的難題是分支太多。一顆蓋著的棋,翻開來可能是雙方 7 種棋子中的任何一種,最多有 14 種結果;開局時有 32 顆蓋棋,光是「這一手要翻哪裡」就有上百種情況要各自往後推算。如果每往後想一步都把所有翻棋可能全部展開,運算量會呈倍數爆炸,手機根本跑不動。

所以我們讓電腦只在「這一手」認真計算翻棋的期望值;往後推算對方和自己接下來的步驟時,就不再展開翻棋,而是用一個近似:假設那一方去翻了一顆不痛不癢的棋,局面大致維持現狀,直接拿當下的局勢評分代替。這個近似的代價很清楚:電腦在往後推算時,不會想到對方下一手可能剛好翻出一顆大棋在它旁邊。好處是運算量降到手機一秒內算得完,而且這個盲點對人和電腦是公平的——人在下暗棋時,也沒辦法預料下一顆翻出來的是什麼。

另一個要拿捏的是「追」。電腦評估局勢時,會替「我方能吃的棋靠近對方」加分。但開局時棋盤上大多還是蓋棋,追過去的棋旁邊隨時可能翻出更大的對手,所以蓋棋還多的時候,這項加分壓得很低;等到蓋棋剩 6 顆以下,才把追擊看重到原本的 4 倍。全部翻開之後,再換成前面提到的包夾判斷。

計算量也有上限。每一手開始前,電腦會先數一數有幾個候選走法和翻棋位置,把總計算量平均分給每個候選,算到額度就停。這樣不管是開局翻棋選擇多、還是殘局走法多,思考時間都不會突然暴增。困難的額度是普通的兩倍、簡單的六倍。

等待本身也要看得見。輪到電腦時,畫面會先顯示「電腦思考中」,稍等一下讓這行字確實畫到螢幕上,才開始計算;否則在比較慢的手機上,困難的電腦算那一秒時畫面會像當掉一樣停住,玩家分不清是電腦在想,還是遊戲卡住了。

三種難度怎麼分

三種難度用的是同一個電腦,差別在它「往後想幾步」和「會不會手滑」:

把三種難度的設定攤開來看,差別不只在「想幾步」:

設定簡單普通困難
走明棋時往後想1 步2 步3 步
翻棋時往後想只看翻開那一刻1 步2 步
吃子交換追到底的深度1 手3 手3 手
隨機誤差很大很小沒有
對翻棋的偏好最愛翻普通最少
每手計算量上限(相對)136

「吃子交換追到底」是指:電腦想到預定的步數時,如果盤面上正好有一連串的互吃還沒結束,它會只沿著吃子的走法再多看幾手,避免在「我吃了你的車、但下一手我的仕會被吃」這種交換的一半就停下來,誤以為自己賺了。簡單只多看 1 手,所以它常常吃了一顆棋,下一手就把更大的棋送掉。

「對翻棋的偏好」是在兩個選擇評價差不多時,給翻棋多加一點分數。簡單的加分最多,所以它很愛翻棋、少用明棋算計,盤面比較靠運氣;困難的加分最少,只有在翻棋真的划算時才翻。這讓簡單的電腦下起來像一個剛學會規則、喜歡碰運氣的朋友,而不只是「算得比較淺的困難」。

難度分得開才有意義。上線前我們讓電腦互下大量棋局確認:普通對簡單是 23 勝 1 敗(另有 6 盤和局),困難對普通是 20 勝 6 敗(另有 4 盤和局)。高一級的電腦穩定贏低一級的,但困難也不是不可能被打敗——暗棋本來就有翻棋的運氣成分,這也是它好玩的地方。

三種難度要逐級解鎖:贏過簡單才能挑戰普通,贏過普通才能挑戰困難。排行榜比的是你贏過的最高難度,同難度再比單局分數:贏得越快、剩下的棋越多,分數越高。

好友對戰:開局才扣愛心

經典暗棋可以開房間,把連結傳給朋友一起下。和平台上的其他對戰遊戲不同,經典暗棋的好友對戰會扣愛心,而且我們刻意選在朋友真的加入、開局的那一刻才雙方各扣 1 顆;開房間不扣,等不到人也不扣。如果開房時就先扣,朋友沒來,你的愛心就白白少了一顆。下完想「再來一盤」,雙方再各扣 1 顆。

連線對戰:每手 60 秒,超時由伺服器代走

跟朋友連線時,棋盤和所有蓋著的棋都由伺服器保管,裁判也是伺服器:電腦對戰和好友對戰用的是同一份規則判定,所以兩種模式不會出現「這步在電腦局可以、在連線局不行」的差異。你翻一顆棋時,畫面會等伺服器回報結果才播翻面動畫,因為在那之前,你的手機真的不知道那格是什麼。連線時棋盤也不旋轉——暗棋沒有「我方陣地」,雙方看同一個方向的棋盤最直覺。

每一手限時 60 秒。超時的那一方,伺服器會替他走一步;同一個人連續超時 2 次就判負,避免有人掛著不下、讓朋友乾等。代走用的不是前面那個會思考一秒的電腦,而是一個很單純的規則:能吃就吃最大的那顆,不能吃就隨機翻一顆,沒得翻才隨機走一步。原因是伺服器每次處理請求能用的運算時間很有限,不適合跑完整的搜尋;而且代走只是讓棋局繼續下去的保險,不應該替掛機的人下出好棋。

悔棋只給輸的那一刻

跟電腦對下時,如果你輸了,可以看一次廣告悔棋:棋盤退回你最後一步之前,重新選一次。這個功能每局只能用一次,只在輸棋的結算畫面出現,好友對戰沒有。我們把它放在「輸了之後」而不是「每一步都能悔」,是因為暗棋常常一步走錯就整盤崩掉,給一次重來的機會很合理;但如果每一步都能退,翻棋的風險就消失了,這個遊戲最有張力的地方也跟著消失。

悔棋贏下來的局,分數會打七折。另外,開局誰先走是擲骰決定的(連線時由伺服器擲),不會固定由玩家或電腦先手。至於成績,伺服器只做休閒級的合理性檢查,例如一局從開始到贏棋至少要花上一段合理的時間,分數也不能超過該難度的上限。

寫在最後

暗棋看起來簡單,真正難做的是「公平」:電腦不能偷看、難度標示要可信、殘局要下得完。我們沒有讓電腦變得無敵,而是讓它像一個認真、不作弊的對手。如果你覺得困難的電腦在你的手機上想太久,或是某一步走得很奇怪,歡迎透過關於我們頁面的信箱告訴我們。

讀完幕後,下一盤暗棋

免下載、免安裝,手機與電腦瀏覽器直接玩

▶立即免費玩經典暗棋

看《經典暗棋》完整攻略 →

相關開發手記

更多內容:開發手記總覽 · 攻略總覽 · 關於我們 · 回首頁