09 August 2020

    マンカラアプリ マンカラアプリ

    結構アクセスがあったので続編

     前回の記事が意外に多くのアクセスがあった1ので続編を書いてみます。おそらく前回の記事にアクセスした人はプログラムにはあまり関心はないけど、マンカラの攻略法・勝ち方・必勝手順を知りたくてアクセスした人が多いのだと思いますが、それを知るには前回の記事の最後に追記したように非常に時間がかかるので、いつかまとめて最も遊ばれていると思われる6×2列のカラハに関してだけ別の記事で書こうと思ってます。時間かけて先読みした結果、結局50手読みでは結論出なかったという可能性もあります。
     今回はマンカライージーに関して、前回同様必勝手順の有無についての実験結果を書いてみます。マンカライージーのルールについてはここにベーシックとカラハと比較して書かれています。相手のストアには石を撒かない点と自分のストアに溜まった石の数で勝敗を決める点でカラハと同じです。カラハと違うのは相手の石を横取り(Capture)するルールが無いことです。

    実験結果(3×2列イージー)

     石の数を1〜5個にして、50手先読みしたそれぞれの結果です。

    石の数
    戻り値 [0, 1] [0, 3] [999, 1] [0, 1] [0, 1]
    読みの深さ 50手 50手 25手 50手 50手
    結論 引分け 引分け 先手必勝 引分け 引分け

    検証

     相変わらず石3個でも20手以上かかるので、遷移を書いて検証するのは大変です。そこでさらに計算量が少ない2×2列で検証することにしました。


    0
    (0)
    2
    (5)
    2
    (4)
    0
    (3)
    2
    (1)
    2
    (2)


    ※( )内の数字は配列(board = [0,2,2,0,2,2])の添字です。添字の03がストアになります。

    実験結果(2×2列イージー)

    石の数
    戻り値 [0, 2] [-999, 2] [0, 1] [0, 2] [-999, 2] [999, 2] [999, 1] [0, 1] [-999, 2]
    読みの深さ 50手 5手 50手 50手 18手 20手 21手 50手 25手
    結論 引分け 後手必勝 引分け 引分け 後手必勝 先手必勝 先手必勝 引分け 後手必勝

     ※連続で指し手を進めている場合一手と数えているケースがあるので手数はやや不正確です。

    検証1(2×2イージー)

     上の表を見て分かるように前回同様反復深化で調べると、2×2列で石の数が2個の場合5手読みで後手必勝となります。この手数なら短いので表を書いて確認出来そうです。

    [0, 2, 2, 0, 2, 2]
    === result = 0, 2, i = 1
    === result = 1, 2, i = 2
    === result = 0, 2, i = 3
    === result = -999, 2, i = 4
    
    [-999, 2]
    

     先読みメソッドからの戻り値は[-999, 2]となっていますが、先手は初手にどこを選んでも負けるけど最善手として2を選んだという意味です。
     まず、先手が1を選んだ場合を見てみます。先手が1を選んだら、自分のストアで撒き終わるのでもう一度先手の番となり、以下のように遷移します。

    0 2 2 0
    2 2
    0 2 2 1
    0 3
    0 3 3 2
    0 0
    6 0 0 2
    0 0


     なんと後手の手番を迎えること無く、いきなり先手サイドの石が無くなってゲーム終了。イージーのルールの場合カラハと同じで、残った石は自分のストアに集めて数えるので、先手2対後手6で後手の勝ちになります。
     だから先読みメソッドで先手の最善手として1ではなく2を返してきたわけです。
     では先手が2を選んだ場合を見てみます。

    0 2 2 0
    2 2
    0 2 3 1
    2 0


     上の局面で後手は2通りの手(45)がありますが、この局面から後手の手番で先読みしてみると

    final List board = [0,2,0,1,3,2];
    result = second.think(board, first, 50, SECOND_WIN);
    

     result = [-999, 4]となり4を選べば後手が勝てると言ってます。
     後手が2手目に4を選んだら以下のようになります。

    0 2 2 0
    2 2
    0 2 3 1
    2 0
    1 3 0 1
    3 0


     次の先手は指し手が1に限定されるので進めると以下のようになります。

    1 3 1 2
    0 1


     この局面で後手の指し手は2通りありますが、ここまで来れば後手がもう一度4を選べば勝てることが分かると思います。お互いが最善手を選ぶことが前提となっていますので、ここで後手が4を選んだ場合を初手から省略せずに書くと以下のようになります。

    0 2 2 0
    2 2
    0 2 3 1
    2 0
    1 3 0 1
    3 0
    1 3 1 2
    0 1
    1 4 0 2
    0 1
    1 4 0 3
    0 0
    5 0 0 3
    0 0


     通算5手読みで後手必勝の結論は正しいようです。
     ちなみに後手が2手目に5を選んだ場合は、遷移は省略しますが先手が勝つ変化もあるようです。

    相変わらず派生ルールが多過ぎ

     ここまで書いてからマンカライージーのルールについて、「終了時にポケットにある石は無効になります。どちらの数にも入れません」と書かれているサイトを見つけてしまいました。そう言えば上で紹介したサイトには、「基本はベーシックと同じ」と書かれているだけでゲーム終了時に残った石の扱いについては書かれていません。カラハと同じでいいだろうと勝手に判断してしまいました。折角コツコツと遷移表を書いたのが勿体ないので上の文はそのままにして、表だけ「終了時にポケットにある石は無効にする」ルールで更新しておきます。

    実験結果(3×2列イージー、終了時にポケットにある石は無効にするルール)

    石の数
    戻り値 [999, 1] [0, 3] [999, 1] [0, 1] [0, 1]
    読みの深さ 5手 50手 25手 50手 50手
    結論 先手必勝 引分け 先手必勝 引分け 引分け

    実験結果(2×2列イージー、終了時にポケットにある石は無効にするルール)

    石の数
    戻り値 [999, 2] [999, 1] [-999, 2] [999, 1] [-999, 2] [999, 2] [0, 1] [999, 2] [-999, 2]
    読みの深さ 5手 1手 7手 5手 16手 18手 50手 26手 25手
    結論 先手必勝 先手必勝 後手必勝 先手必勝 後手必勝 先手必勝 引分け 先手必勝 後手必勝

     上の検証で説明していた2×2列で石が2個のケースも全く逆の結論になります。
     上の説明で書いた先読みメソッドの実行結果も以下のように変わります。戻り値は[999, 1]で、1を選べば先手必勝と返してきます。

    [0, 2, 2, 0, 2, 2]
    === result = 999, 1, i = 1
    
    [999, 1]
    

     「終了時にポケットにある石は無効にする」ルールだと、本文の検証を読んで貰えれば一手で先手必勝になることは分かると思います。ルールが変わると結果が真逆になるいい例として説明文も無駄にならなくてよかったです。

    カラハのルール

     マンカラカラハにもいろいろな派生ルールが存在するようで、ゲーム終了時に残った石は相手の物になるというルールも存在するようです。このアプリではどちらのルールにするかオプションで選べるようになっていて、残った石は相手に取られるルールの方がpopular、自分の石になるルールがclassicとなっています。残った石が相手のものになるルールの方が海外ではポピュラーなんでしょうか?そしてこのアプリどちらのルールでもAIが非常に強いです。
     任天堂のアソビ大全51に収録されているマンカラはclassicルールのようですが、日本ではこのルールがメジャーになると思われるので、今後マンカラに関する記事はアソビ大全51のルールに絞ろうと思います。アプリもそうなっています。


    1. 電子書籍を買っていただいた方も数人いたようです、有難うございます。 



    blog comments powered by Disqus