11 March 2018

    5五将棋

    「5五将棋」アプリについて

     現在リリースしている「3三将棋」アプリとUI部分以外はほとんど同じソースを使って作った5五将棋アプリです。幾つかの5五将棋アプリと対戦させてみたところ、結構勝ったり負けたりのいい勝負なので機種によっては動作が重いとはいえ、そこそこ楽しめるかもしれません。アプリの仕様は3三将棋アプリとほとんど同じなので3三将棋アプリの記事を見ていただくとして、ここでは3三将棋アプリと違う点について書いておこうと思います。  

    5五将棋ならではの仕様(桂馬の扱い)

     本来の5五将棋?では敵陣一段目(後手は5段目)に駒が進むと駒が成れますが、5五将棋アプリでは初期配置によって駒が成れる段が変わる仕様にしています。使用する駒に桂馬が含まれている場合に一段目(後手は五段目)でしか駒を成れないとすると不都合が生じるからです。
     例えば以下の局面は持ち駒の桂馬を2四に打ったところですが、

    桂馬を打った局面

    打った桂馬が3二に跳ねた場合に、その時点で駒が成れないと次に駒の行き場がなくなってしまいます。通常の将棋で先手の歩が一段目に進んだ場合強制的に「と金」になりますが、それと同じで使用する駒に桂馬がある場合は二段目でも成れるようにする必要があります。そのため「初期配置に桂馬が含まれている場合は、桂馬だけでなくすべての駒が二段目(後手は四段目)で成れるルールにしています」。
     詳しくないですが、一段目で駒が成れるルールの本来の5五将棋に桂馬が使われていない理由は、もしかしたらこのことが理由かもしれません。たしかに全部で五段しかないのに敵陣が2段を占めるというのもバランスが悪い気がしますので、5五将棋では桂馬は使うべきではないのかもしれません。でも7七将棋ならちょうど良いバランスになるような気がしているので、次は先手が二段目、後手は六段目で成れるルールで7七将棋を作ってみようかと思っています。

    読みの深さ

     Version0.9.9.5で読む範囲を変更しました。「弱い」モードは3手読みで全ての手を読みます。「普通」「長考」モードでは、まず3手読みで候補手を13手に絞った後、その候補手に対して「普通」モードで4手読み、「長考」モードで5手読みをしています。「3三将棋」アプリの「長考」モードが9手読み1であることを考えると性能が落ちてますが、3三将棋に比べると5五将棋の局面数が飛躍的に増えるためこうなってしまっています:sweat:以前のバージョンは深読みする候補手を6手に絞っていたのですが、持ち駒が豊富な時には一局面で大体30〜40手の候補手があるので、たった6手に絞るのはあまりにも無理があると思い直して変更しました2。「普通」「長考」モードでは候補手を絞って他の手は捨てているのに対して、「弱い」モードではすべての手を読んでいるので、5五将棋アプリに関しては「弱い」モードの方がいい手を指す可能性が高いかもしれません。

     Version1.0.6.3から探索部を変更しました3

    AIモード\ Version  1.0.6.2まで    1.0.6.3以降
    弱い 全件探索、3手読み(depth = 2) 全件探索、3手読み(depth = 2)
    普通 全件探索、4手読み(depth = 3) 反復深化部分探索(60手)、4手読み(depth = 3)
    長考 候補手選択後、5手読み(depth = 4) 反復深化部分探索(20手)、5手読み(depth = 4)
    瞑想 候補手選択後、5手読み(depth = 4) 反復深化部分探索(21手)、5手読み(depth = 4)

    ※アルゴリズムの詳しい内容はこの記事を参照してください。
    ※瞑想モードとそれ以外では評価関数も違います、「7七将棋の評価関数」参照。

    千日手回避

     「3三将棋」アプリでは千日手回避のために特別な処理はしていません、千日手になるのが当然の成り行きと思えるケースが多いためです4。しかし5五将棋アプリの場合は駒の損得が発生しない序盤の段階で千日手になってしまうケースがあまりにも多いので千日手回避のロジックを組み込んでいます。同じ局面が3回発生した場合にはAIの手を次善手(あくまでもアプリのAIが次善手と判断しているだけです)を指すようにして、なるべく千日手を回避するようにしています。但し次善手を指していても千日手になることもあるので、絶対千日手を避けるというわけではありません。

    瞑想モード追加

     Version1.0.0.2で瞑想モードを追加しました。「読みの深さ」のところで説明していますが、「長考」モードでは3手読みで候補手を13手に絞ってその候補手に対して5手読みを行いますが、「瞑想」モードでは候補手を絞らずに3手読みしたすべての手を評価値でソートした後に5手読みしています。読みの深さは変わっていませんので、詰みを見つけた場合等、枝刈りが効果的に働いて「長考」モードより応答が速くなることもあります。但し、ゲーム終盤に詰みを逃しにくくなったのは確かですが、自分がテストしている限りにおいては「長考」モードより強いかどうかは微妙なところです。

    瞑想モードの評価関数変更

     Version1.0.2.0から瞑想モードの評価関数が新しくなりました。瞑想モード以外は「駒得」しか考慮していない評価関数を使用していますが、瞑想モードでは「駒得」+「駒の働き」を考慮した評価関数を使用しています。人によっては対戦して棋風が違うと感じるかもしれません。少し強くなったとは思いますが、長考モードより指し手に時間をかけていることを考慮すると、強くなったと言っていいかは相変わらず微妙なところです。
     評価関数の変更がどのように作用したのかは詳しくは分かりません。評価関数の変更内容に関してはこの記事を参照してください。

    二ヶ国語対応

     Version1.0.1.0から二ヶ国語対応しました。Androidの言語設定で日本語以外を選ぶとアプリで使用するメッセージが全て英語表現になります。

    クリップボードを使った棋譜出力

     Version1.0.2.0からCSA形式(*.csa)での棋譜出力が出来るようになりました。

    棋譜出力画面

     左上のチェックマークアイコンをタップすると共有画面(インテント)が表示されるので、クリップボードを選べばテキストファイルを扱えるアプリに棋譜データを貼り付けて保存出来ます。
     CSA形式の棋譜はヘッダ部分に駒の初期配置を定義出来る(駒落ち将棋にも対応している)ので、駒の初期配置パターンを選択出来るこのアプリに都合がいいと思ったので採用しました。但しCSA形式の規約を全て網羅しているわけではなく、必要最小限の部分だけ実装しています。Tで始まる指し手の消費時間や$で始まる棋譜情報は出力されません。以下が出力される棋譜の一例です。

    ' #5五将棋 https://play.google.com/store/apps/details?id=shogi55.io.github.happyclam 
    '
    V2.2
    N+Player
    N-AI
    P1-HI-KA-GI-KI-OU
    P2 *  *  *  * -FU
    P3 *  *  *  *  * 
    P4+FU *  *  *  * 
    P5+OU+KI+GI+KA+HI
    -
    +4544KI
    -4132KA
    +5453FU
    -2122KI
    +2534KA
    -5141HI
    +3524GI
    -1213FU
    +2413GI
    -2213KI
    +1513HI
    -0012GI
    +1312HI
    -1121OU
    +0011KI
    

    クリップボードを使った棋譜読み込み

     Version1.0.2.4からCSA形式(*.csa)の棋譜入力が出来るようになりました。

    棋譜入力画面1

     テキストボックスに棋譜テキストデータを貼り付けて読み込みボタンをタップすれば、棋譜を読み込みます。このアプリ自身が出力した棋譜データは読めますが、他のソフトから出力された棋譜データは読み込みに失敗するかもしれません。エラーが発生した場合はその行数を表示しますので、データを編集して試してください。
     ※カンマ区切りのマルチステートメントには対応していません。
     ※たとえCSA形式(*.csa)の棋譜であっても本将棋(9×9)の棋譜は読めません、5五将棋専用です。

    棋譜入力画面2

     棋譜を読み込んだ後は通常の対局通り、対局者を変更したり局面を戻して途中から指し継いだり出来ます。

    CSA形式の初期配置定義を利用する

     CSA形式の棋譜読み込みが出来るということは初期配置を自由に定義出来るということです。試しに以下のような上下左右の隅に飛車を配置した棋譜(飛車が4枚)を読み込ませてみました。

    ' #5五将棋 https://play.google.com/store/apps/details?id=shogi55.io.github.happyclam
    '
    V2.2
    N+AI
    N-AI
    P1-HI-KI-OU-GI-HI
    P2-FU *  *  *  *
    P3 *  *  *  *  *
    P4 *  *  *  * +FU
    P5+HI+GI+OU+KI+HI
    +
    

    独自定義初期盤面

     飛車4枚の盤面がちゃんと表示されました。ここで「再開」ボタンをタップすると通常通りゲームを開始できます。
     誤って「新規対局」ボタンをタップすると読み込んだ棋譜ではなく、現在「初期配置」メニューで選ばれている初期配置から新規対局が始まってしまうので気をつけてください。

    読み込みエラーの意味

     独自に編集した棋譜ファイルや他のソフトから出力したファイルを読み込む場合はエラーになる可能性があります。以下の表を参考に棋譜ファイルを編集して再度読み込みを試してみてください。

    エラー番号 エラーの意味、可能性のある原因
    01 盤面データの一行が長すぎるか短すぎます。駒のない場所はスペース+アスタリスク+スペース( * )の3バイトです。
    盤面データは一行ずつ改行する必要があります。
    02 盤面データのアルファベット2文字の駒の略号が間違えている可能性があります。
    03 持ち駒データのアルファベット2文字の駒の略号が間違えている可能性があります。
    04 盤面データの先頭Pの文字の次は、数値か+-です。
    05 指し手データの持ち駒を打つ時の記述が間違えている可能性があります。
    06 指し手データの指し手に誤りがあります。飛車(HI)が成っていないのに斜め後ろに移動している等5
    07 P+-'VT%N$以外の文字が行の先頭にあります。
    ちなみにP+-以外の文字は読み飛ばして無視しています。
    08 指し手データのアルファベット2文字の駒の略号が間違えています。
    09 手番データ(+-)は盤面データが記述された後に書かれている必要があります。

    駒に毛筆フォント

     Version1.0.5.3から駒のフォントに毛筆フォントを選べるようになりました。無料フォントの中でも「衡山毛筆フォント」のように再配布可能というものはなかなか無いと思います6

    フォント選択メニュー


    衡山毛筆フォント

     自分も幼稚園の頃に書道教室に通っていたことがありますが、お近くの方は「青二書道教室」に行きましょう。

    Push通知対応

     Version1.0.7.2からPush通知を受信できます。左上右側にあるアイコンをタップすると受信した最新のメッセージを再度表示します。受信したメッセージがないときは何も表示されません。

    Push通知サンプル


    1. 9手先を読んでいるから9手詰めの詰将棋が解けるかというと、そうではなく7手詰めしか解けません。詰み局面までの手数ではなく、相手の玉を取るところまでの手数を読まないといけないためです。 

    2. 読みの範囲を広げたことで強くなっているのですが、その分少し遅くなってます:sweat: 

    3. 互いに持ち駒が多い時には一局面で100手近くの候補手があるケースもあり、たとえ「普通」モードの4手読みでも全件探索(100の4乗=1億手)だとメモリ不足でアプリがクラッシュ(固まる)するケースがあったようです。部分探索に変更したことで今後はおそらく大丈夫だと思います。 

    4. 千日手になって当然に見えると言ってもその局面を迎える前にもっといい手(最善手)を逃していると思われるケースが多いのですが、同一局面の繰り返しが始まってからでは時すでに遅しとなっていて千日手を避けられなくなっているという意味です。この辺りの事情はAIの出来の悪さなので仕方がありません。3三将棋の場合は無理に千日手を避けると致命的な悪手になるので敢えてそのままにしています。 

    5. 5五将棋大会の棋譜を読み込んでテストしていたら、成りを不成で出力していると思われる棋譜も混じっていました。 

    6. svgファイルにフォントデータを埋め込んでいるため、再配布可能なフォントが必要でした。将棋の駒に使用する文字分だけなので自作も考えられますが、当然有名な書家が書いた字の方がいいでしょう。また、アプリ内にリンクを貼ったほうがいいのかどうかわからなかったので、一応権利者にも確認しました。 



    blog comments powered by Disqus