3三将棋

    「3三将棋」について

     以前にも「3三将棋」に関する記事を書きましたが、実際に作ってみました。
     リリース当初15通りの初期配置パターンだったものが現在148個の初期配置パターンまで増えてますが、盤面編集機能を追加したので今後は増やす予定はありません。
     あと、全てのユーザーが使用している端末がAndroid7.0以上になったので他の将棋関連アプリ(5五将棋7七将棋禽将棋)も含めて動作条件をAndroid7.0以上に変更しました。

    ルール

    • 駒の動きは将棋と同じです。
    • 打ち歩詰め、二歩は禁止です。
    • 先手は一段目、後手は三段目に駒を移動すると成ることができます。
    • 同一局面(手番も同じ)が4回現れると千日手でゲーム終了としています。
    • 行き場の無い駒は打てません(桂馬を二段目に打ったり、先手が歩を一段目に打ったり)
    • 王手放置は出来ません(王の自殺手も不可)

    初期配置編集機能

     Version1.1.7.0から初期配置の編集機能を追加しました。編集したパターンを保存すると初期配置選択画面に反映されます。
     この機能追加により、148個の初期配置パターンは予め用意されているだけで自由に上書き可能なものとなりました。3三将棋は最善手を見つけるのも楽しいですが、いい勝負(或いは長手数の詰み)になる初期配置パターンを考えるのも楽しいものですので、予め用意されているパターンが簡単過ぎて詰まらないと感じたら自分独自の初期配置を考えて楽しんでみてください。

    初期配置編集

    • 左上のチェックマークアイコンをタップすると編集モードになります。
    • 将棋盤の空いてる場所をタップすると駒選択ダイアログが表示されるので、駒を選ぶと新しく駒が配置されます。
    • 既に駒があるマス目をタップすると駒が削除されます。
    • 持ち駒は先手・後手それぞれの駒のボタンをタップすると7枚を上限にカウントアップします。7に達した後タップするとカウントダウンします。

    初期配置保存

    • 編集モード中はメニュー操作は出来ません。盤面を編集し終えたら保存か中止を選んで下さい。保存すると初期配置選択画面に反映されます。中止を選ぶと編集は無かったことになります。

    対局画面

    対戦画面

    AI同士の対戦の時だけ局面の評価値を表示するようにしています。左上の数値は手数です。

    盤面反転機能追加

     Version1.1.2.0から盤面の反転(先手・後手を上下逆さま)表示機能追加しました。画面右上の回転矢印アイコンをタップすると後手を手前にして将棋盤を表示出来ます。

    盤面反転機能

     この機能追加により今までAndroid4.4以上が動作対象機種でしたが、Android5.0以上が必要になります。

    メニュー

    • 先手・後手/AIレベル

    AIレベルは4通りから選べます。

    Menu - 先手・後手

    • 初期配置

    ここで選んだ後に盤面編集して保存すると、この画面に反映されます。

    Menu - 初期配置

    「初期配置」のタブをタップして一度閉じてから再度タップすると、現在選択中の初期配置パターンの位置まで選択リスト画面がスクロールします。

    Menu - 選択中の初期配置1


    Menu - 選択中の初期配置2

    • 初期配置検索機能

     初期配置パターンが100を超えてきたので、Version1.0.2.6から初期配置検索機能を付けました。

    Menu - 初期配置検索

     駒を選択して検索ボタンを押下すると、持ち駒あるいは盤上にその駒を使用している初期配置がリストアップされます。駒の選択条件はアンド(&)検索になっているので、例えば「角」と「香」を選んで検索すると「角」も「香」も使用されている初期配置だけが検索結果に表示されます。

    Menu - 初期配置検索結果

    多言語対応

     Version1.0.4.1から多言語対応しました。対応言語は英語、日本語、繁体中国語、スペイン語で、アプリで使用するメッセージが全てAndroidの言語設定で選んだ言語で表示されます。デフォルトは英語です。

    クリップボードを使った棋譜の入出力対応

     Version1.0.5.0からCSA形式(*.csa)の棋譜の入出力に対応しました。CSA形式(*.csa)では棋譜ファイルのヘッダー部分に駒の配置を定義出来るので、好きなように初期配置を定義して読み込ませれば自分が試してみたい初期配置から対戦が可能です。

    • 棋譜出力

    棋譜出力画面

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

    ' #3三将棋 https://play.google.com/store/apps/details?id=shogi33.io.github.happyclam 
    'No. 52
    '
    V2.2
    N+AI
    N-AI
    P1+OU-KA * 
    P2 *  *  * 
    P3 * +KA-OU
    P+00KE
    P-00KE
    +
    +3121OU
    -1323OU
    +0011KA
    -0013KA
    +0033KE
    -0031KE
    +1122KA
    -1322KA
    
    • 棋譜入力

    棋譜入力画面1

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

    棋譜入力画面2

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

    独自の初期配置から対局開始する例

     Version1.1.7.0から初期配置の編集機能を追加したので棋譜を自分で編集して読み込む必要はなくなりましたが、一応棋譜の入出力機能は残しています。
     棋譜ファイルはCSA形式(*.csa)のルールに従ってアルファベット2文字からなる駒の略号を使って記述します。CSA形式(*.csa)の規約を網羅しているわけではないので、必要最小限のデータの例は以下のようになります。

    P1 *  * -OU
    P2 *  *  *
    P3+OU *  *
    P+00KA00FU
    P-00GI00GI
    +
    

     Pに続く盤面データ持ち駒データ、それに続く手番データの3つを記述すれば読み込んで対局可能です。駒の無い升目は * (スペース+アスタリスク+スペースの3バイト)で、持ち駒は00に続けて駒の略号を記述します。駒の略号についてはこのページの「駒の動きガイド」の表かアプリ内にある「駒の動き」メニューを参照してください。

    棋譜入力画面

     必要最小限の上記データを読み込んだ直後の画面です。ここで「再開」ボタンをタップすると通常通りゲームを開始できます。
     誤って「新規対局」ボタンをタップすると読み込んだ棋譜ではなく、現在「初期配置」メニューで選ばれている初期配置から新規対局が始まってしまうので気をつけてください。

    出力される棋譜ファイルの例

    1. 上記の初期盤面からAI同士で対戦した後の出力ファイル例
      ' #3三将棋 https://play.google.com/store/apps/details?id=shogi33.io.github.happyclam 
      '
      '
      V2.2
      N+AI
      N-AI
      P1 *  * -OU
      P2 *  *  *
      P3+OU *  *
      P+00KA00FU
      P-00GI00GI
      +
      +0022KA
      -1121OU
      +0032FU
      -2112OU
      +3231TO
      -0023GI
      +3132TO
      -2332GI
      +3332OU
      -0021GI
      +3231OU
      -2122GI
      +3132OU
      -0021KA
      

       手番データの後に指し手データが続きます。

    2. 初期配置メニューのArrange4を選んでAI同士で対戦した後の出力ファイル例
      ' #3三将棋 https://play.google.com/store/apps/details?id=shogi33.io.github.happyclam 
      'No. 4
      '
      V2.2
      N+AI
      N-AI
      P1 * -KA-OU
      P2 *  *  * 
      P3+OU+KA * 
      P+00HI00FU
      P-00HI00FU
      -
      +0032FU
      -0012FU
      +3231TO
      -1213TO
      +3121TO
      -1121OU
      +0032KA
      -2131OU
      +0021HI
      

       アプリ内のメニューから初期配置を選んで棋譜ファイルを出力した場合は、コメントとして初期配置の番号(No. 4)が出力されます。

    読み込みエラーの意味

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

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

    駒に毛筆フォント

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

    フォント選択メニュー


    衡山毛筆フォント

    Push通知対応

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

    Push通知サンプル

    自動保存機能追加

     メモリ逼迫時にAndroidによってアプリが強制終了されるケースがあるので、Version1.1.5.0から一手指す毎に棋譜を自動保存する機能を追加しました。
    不意にアプリが落ちても起動後「再開」ボタンをタップすることで対局の続きが可能です。
     ※棋譜入力欄から入力された棋譜は自動保存の対象になりませんので、必要であれば棋譜出力して保存してください。
     ※万が一自動保存に失敗して何らかのエラーが発生しても、「新規開始」すれば新たにファイルが作成されるので問題ありません。それでもエラーが表示される場合は、「アプリ情報」メニューから「ストレージ」を選んで「ストレージを消去」の操作をしてください。その際には対局データは消失し各種設定も初期化されますがご了承ください。

    ソースファイル

     githubでCoffeeScriptのソースファイルを公開しました。GUI部分にはまだバグが潜んでいるかもしれませんが、思考ルーチン部分はほぼ落ち着いていると思っています。実際のアプリの先読みメソッド(思考ルーチン)は、浅い先読みを行い候補手のリストを作成しその候補手リストからさらに深読みするという方法を取っているのですが、混みいったコードになるのでその部分は省いています。リリースしてからバグを発生させていたのはほとんどこの候補手を絞り込む部分に関するもので、基本的なところはリリース当初からほとんど変わっていません。対戦型将棋ソフトを作る上で必要最低限なコードになっていると思います。このコードを元に3三将棋だけでなく9×9の本将棋に移行するのも容易だと思います、というか元々Rubyで作った自作の将棋ソフトのコードをスマホアプリにするためにCoffeeScript(JavaScript)に書き換えたものです。
     今度はMINI-MAX法+αβ法ではなく学習型のAIに挑戦したいと思っています。

    開発資料

    • クラス図

    クラス図

    • テストツール
       mocha + chai でテストケースを書きました。CoffeeScript+mocha+chai=CaffeineJSと誰かが言ってましたが、まさに依存性のあるカフェインのように癖になりそうなぐらい作りやすかったです。いずれgithubでソースもテストスクリプトも公開する予定です。その時はこの記事を更新します。

    • コンソール版

    CUI版

     最初は作り易さもあってコンソール画面でも遊べるCUI版(Gameクラス、Boardクラス)から作っていたのですが、将棋の指し手は複数の駒が動ける可能性がある時に「1一銀右」とか「3二銀引成」とか「3一金直」とかいろんなケースが発生するので、それをコンソール画面でコマンドラインのパラメータとして入力させる処理が非常に面倒になります。だから一通りコンソールでも遊べるようになったところで細かいところは未対応のまま放置してGUI版の開発に移行しました。GUIなら駒をタッチ(クリック)するだけなのでUI(ユーザーインターフェース)が作り易くなるからです。それでもコンソールで作っていたBoardクラスは変更を加える必要がなくそのまま継承してBoardGUIクラスを作るだけで済むのはオブジェクト指向プログラミングの面目躍如と言ったところです。