2018年1月11日 星期四

[遊戲] "暗棋王"的翻棋策略

Android 版本
iOS 版本

暗棋是一個深受台灣人喜愛的象棋遊戲,
除了實力外,運氣的好壞也會影響到輸贏,
暗棋的手遊不少,最受人攻擊的點就是有沒有作弊之類的,
以下就"暗棋王"APP開發過程中所考量的翻棋策略做小小的探討,
當然,也期待更多的高手先進多多指教,
讓"暗棋王"的程式演算法更加進步。

以下範例以電腦是紅棋,對手(玩家)是黑棋來講解...
1. "兵"旁邊翻棋
"兵"是所有棋子最弱的,幾乎所有棋子可以吃它,所以在它旁邊翻棋其實是很危險的,有極有的機會害它被對方吃掉,
然而,它也是最強的,因為只有它可以吃"將",
有些玩家會在"兵"旁邊直接翻棋,如果剛好翻到對方的"將",那就賺到了,如果沒翻到,大不了損失一隻"兵",影響不大,不過,已經死了幾隻"兵",這種策略就不適合,萬一"兵"全死光了,對方的"將"可能就會無敵

2. "帥"旁邊翻棋
 "帥 "是棋子裡最強的,所以在它旁邊翻棋,有機會可以一路吃下去,
然而,常常事與願違,偏偏旁邊翻出的是一隻 "卒 ",這也是暗棋王常常被說作弊的主因, "帥 "旁邊是 "卒 "的機率太高了,
讓我們從數學機率來解釋好了,
如果 "帥 "是位於棋盤4個角,它旁邊會有2顆棋子, "卒 "有5顆,所以 "帥 "旁邊有 "卒 "的機率是2*(5/31),棋盤有4個角,所以總機率是2*(5/31)*(4/32),約0.040,也就是4%,
如果 "帥 "是位於棋盤邊上,它旁邊會有3顆棋子, "卒 "有5顆,所以 "帥 "旁邊有 "卒 "的機率是3*(5/31),棋盤邊上的位置有16個,所以總機率是3*(5/31)*(16/32),約0.242,也就是24.2%,
如果 "帥 "是位於棋盤中間,它旁邊會有4顆棋子, "卒 "有5顆,所以 "帥 "旁邊有 "卒 "的機率是4*(5/31),棋盤中間的位置有12個,所以總機率是4*(5/31)*(12/32),約0.242,也就是24.2%,
將以上所有可能加總0.040+0.242+0.242 = 0.524,也就是52.4%,
換句話說, "帥 "旁邊是 "卒 "是機率約5成左右,機率很高,所以不建議在 "帥 "旁邊直接翻棋,除非 "卒 "已經全死光了^^,
以上的機率是用概估的方式,如有錯誤,歡迎更正

3. "炮"隔子翻棋
"炮"不能直接吃任何隔壁棋子,但如果隔一棋子,它可以吃任何一顆棋,而且距離不限,如下圖:
"炮"可以吃A,B,C三顆棋,紅方可以翻這三顆棋,如果是黑棋,下一輪就可以吃掉它們,
然而,如果翻出的剛好是"包","炮"反而會被吃掉,紅方不可一廂情願,
但如果如上圖中"炮"旁邊有一顆"俥",這時就可以肆無忌憚的翻ABC三顆棋,就算翻出"包",頂多同歸於盡

4. 防止被"包"吃
"包"隔子可吃任何棋,如果己方的棋要被"包"吃了,怎麼處理呢?
如果是如下圖的情形:

紅方可以翻ABC任何一顆棋,如果翻出"帥""仕""相""俥""傌"等棋子,就可以間接達到保護紅"仕"的作用,當然,如果黑方認為用"包"去換"仕"是值得的,那黑方還是會照吃。
如果是下圖的情形:

"包"往下走一步就可以吃紅"仕",紅方可以翻DEF三個位置的棋子,如果翻出"帥""仕""相""俥""傌"等棋子,就可以直接達到保護紅仕的作用,當然,紅方還是可以翻ABC位置的棋,如上段所提,可以間接保護紅"仕",選擇翻AC二處還有一個作用,如果是黑棋,比紅"仕"小的話,紅"仕"吃它就可以逃離"包"的威脅,翻到"將""士"也沒差,反正紅"仕"本來就快可了

5. "包"隔壁翻棋
"包"無法吃任何隔壁棋子,所以我們可以直接在"包"旁邊直接翻棋,反正翻出來的棋一定不會死,反之,如果翻出的棋可以吃掉"包",那就賺到了,因為"包"的威力很強

6. 保護性翻棋
如下圖左方,"仕"要被"將"吃了:

紅方可選擇翻ABC三個位置的棋,如果剛好翻到"兵",可達到間接保護"仕"的作用,因為"兵"有好幾顆,翻出機率大,有時可以做這樣的賭注,不過,還是有不小的可能會翻出其它紅棋,這樣便會讓"將"有連吃的機會。另外如果紅方"炮"還在,可選擇翻D處,這種翻法是最安全的,翻到"炮",可間接保護仕,翻到其它紅棋也不會被"將"吃掉,
如果是如上圖右方,"帥"要被"卒"吃了,紅方一樣可選擇翻GEF或H處的棋,不過,這種情形下間接保護的作用就不大了,因為不管翻到什麼棋,黑方一定會選擇了吃了"帥"再說,死一顆"卒"無所謂

4 則留言:

  1. 人玩暗棋,程式玩的是明棋,至於 "帥 "旁邊是 "卒 "是機率是獨立事件,不能用加總機率約5成左右認定,局在四角落翻棋剛好是"將"或是"帥",發生兵、卒機率在旁邊只有4%

    玩家總是反應幾乎會遇到兵卒問題,是程式刻意為之,還是設定有錯?

    回覆刪除
  2. 感謝您的留言,程式可以看到所有的棋沒錯,但,在編寫程式時,我就是按照暗棋的規則,也就是說,程式裡不會去看未翻出的棋來修改演算法,和人一樣,程式只會針對已翻出的棋來計算最佳走法,當然,懷疑程式作弊的人一樣會懷疑,不管程式設計者怎樣解釋,就算公開程式碼還是一樣,這或許是暗棋遊戲的宿命吧,
    坦白說,以程式設計的角度,要作弊比不作弊更難,因為除了要遵守暗棋的規則外,還要考慮各種情形來施加作弊方法,暗棋也不會一直只是翻棋,棋翻開後,總無法再作弊吧,最終還是靠棋力對決,
    以商業的角度,作弊又不會讓我賺到更多錢,為什麼需要作弊呢?遊戲是免費下戴,也不販賣任何道具,只靠遊戲裡的廣告賺錢,也就是說,刻意作弊讓玩家輸應該反而會讓玩家不想玩吧,這樣不是更賺不到錢嗎?實在不懂需要作弊的邏輯是什麼,
    回到機率問題,您提的例子,4%不是和我說的一樣嗎???
    機率是獨立事件,要計算發生的機率就是所有可能發生情形的機率加總,舉例來說,擲一顆骰子,出現1的機率是1/6,出現2,3,4,5,6的機率也各都是1/6,如果要算出現偶數的機率,就是出現2,4,6的機率加總,也就是1/6 + 1/6 + 1/6 = 1/2,很久沒碰機率了,希望我的理解沒錯,
    題外話,我個人平常也會玩這個暗棋遊戲,因為它需要稍微動一點點腦,但又不會很燒腦,很適合消遺和打發時間

    回覆刪除
    回覆
    1. 我相信你沒作弊。不過看完也同覺得你卒的機率邏輯有問題。而且用骰子無法解釋你的卒機率邏輯。骰子擲一次為偶數的機率和帥旁邊為卒的機率是兩種邏輯不同的問題。

      骰子就是單純把所有各偶數機率相加就等於答案,也就是說擲一次骰子為偶數的機率就是把擲一次骰子出現2或4或6的機率相加。但繆點在於當我們想問“一局棋裡,卒在帥旁的機率”時,我們可能有很多情況會影響機率

      例如:

      1.棋盤有沒有其他棋子被翻開了,不管該棋是不是帥或卒,也不管它的位置。這會影響到你的分母(31、32),進而影響機率值。

      2.是否帥出現的可能性位置已有其他翻開的棋佔去了。例如,以帥要出現在角落的情況下,如果還沒翻到帥就已經有三個角落被翻出其他棋,那該情況就不可能是你文章中提到的“4/32”。

      3.帥旁邊是否有棋子被翻開了。這會影響到你機率值要乘以幾。

      所以今天如果單純問“同一局裡卒在帥旁邊機率有多少”的話,你上述的三種機率絕對是不正確的。因為你沒有考量到上述各種情況會有各種機率。照你上述的機率算式,你的機率只有代表著“該局棋第一顆棋翻開就要是帥,且同時第二顆棋翻在帥的鄰邊任意位置是卒的機率”。所以和你原來的問題是不同的。


      另外結果呈現也不應該相加,而是將帥出現在角落、邊、中間的各種機率分開表示才是。

      刪除
    2. 您提的其實和抽籤時先抽後抽的問題一樣,假設100隻籤裡有一隻是中的籤,第一個抽的人抽人的機率是1/100,那第二個抽的人呢?有人說第一個已經抽掉一隻,第二個人抽中的機率是1/99,但其實第二人要輪到他抽,表示第一個人一定沒抽中,所以第二個抽中的機率是(99/100)*(1/99) = 1/00,先抽後抽都是一樣的,
      回到棋局,因為棋子有位置和是那一顆棋的機率同時要考慮,所以複雜些,假設我們只考慮帥,那就專心在位置的考量,如果四個角落已經有三個角落被翻出,在這種假設下,當然帥出現在剩下的角落機率不會是4/32,因為已經有假設的條件了,如同剛剛抽籤的問題,如果假設第一個人沒抽中,那第二個人抽中的機率就是1/99,不是1/100,
      另外,文章裡的機率是用概估的,有些分母用32或31可能沒有用得很精確沒錯,或許機率高手可以幫忙精準計算,畢竟我離高中機率二三十年了

      刪除