iモード棋譜再生アプリを更新し続ける

明後日は、一昨年から参加している将棋大会である。
準備不足だった昨年は散々な内容だったので、それ以来、ちょっと本気で将棋に取り組もうかと思い、筆者が所有するドコモのガラケーで棋譜を持ち歩けるようにiモードアプリを作ったりしたものである。全ては明後日のためであった。
…と言いながら、結局、この1年間も、筆者の脳には十分に準備ができなかったので、やっぱり来年に向けて準備することにする。

自分がどうすれば強くなるかはわかっている。まずは、自分の戦法を決めて、相手がどう指してきても対応できるように定跡を覚えることだ。集中して先を漏れなく読むことも苦手なので、ある程度時間の長い将棋を指して読む訓練をすることも必要だが、序盤がまともに指せず、すぐに崩れると、同じくらいの棋力の相手とじっくり中盤を指す機会も得られない。
しかし、筆者は幼少の頃から、勝つことよりも奇抜な手を考えて楽しむことを目的に将棋を指してきたので、勝つ為に勉強をする習慣が無いのである。定跡本を読んでいても、すぐに飽きて、持ち時間を極端に短くできるYahoo!将棋での早指し対局に走ってしまう。
そもそも、筆者は昔から、覚えるための勉強が苦手なのである。おそらく、記憶力が悪く、覚えようとしても覚えられないから、覚える作業が嫌いになったのだろう。

そういうこともあって、1年前に自分の携帯電話用の棋譜再生アプリを作ったのである。覚えるべき定跡や棋譜を集める作業を怠っていたので、予定通りの準備はできていないが、暇な時にいつでも携帯電話で定跡の盤面やプロの棋譜を見ることは、思ったよりも学習効果を実感できることだった。同じ定跡局面を3ヶ月くらい繰り返し見ていても、最初は気付かなかったその手の意味に気付くなど、時々新たな発見があるものである。

今やすっかり、このDoJaアプリが動くことのみによって、ガラケーP-01Cが手放せなくなった。このアプリが動く限り、スマホに買い換える気がしない。無い物は作れば良いのである。DoJa万歳。
従って、この自作のiモード対応棋譜再生アプリをメンテナンスし続けることにした。

■変更内容

  • 異なる手順からの同一局面の選択肢を結合できるようにした。
    ▲2六歩△3四歩▲7六歩 で始まる棋譜の次の手が、▲7六歩△3四歩▲2六歩と辿ると選択できない問題への対策。
    携帯電話でiアプリ起動時に同一局面を検索すると時間がかかり過ぎるので、棋譜中にラベルを付けて同一局面として扱うことを指定できるようにした。
    結合先の局面に至る手の後ろに「#label 番号」を付け、同一局面に至る手の後ろに「#merge 番号」を付けると、双方の次の手がどちらからでも選べるようになる。
    例:
    ▲2六歩
    △3四歩
    ▲7六歩 #label 1
    △4四歩

    ▲7六歩
    △3四歩
    ▲2六歩 #merge 1
    △8四歩

    こうすると、どちらから辿っても同じことになり、4手目の選択肢として△4四歩と△8四歩の両方が表示される。
  • 次の手が9種類以上ある場合に、親ノードを分ける(表示されている以外の選択肢を選ぶためには一手戻して同じ表記の別の選択肢を選ぶ必要がある)のでなく、"9"を押すと次のページに移動して9番目以降の選択肢が表示されるようにした。
  • 同じマスに移動できる駒が複数ある場合の移動駒特定の不具合修正
    • 成れる駒が1つしかないのに「成」で特定できなかったのを修正
    • 「左上」とかで左側に上がらない選択肢があると特定できなかったのを修正
  • "*"や"#"で複数の選択肢があるノードに戻った時に前回の選択を表示するよう変更

■スクリーンショット(エミュレーターの画面)
screen shot
i-mode用ダウンロードページへのリンク
■ソースコード
 iKifuPlayer.java
 Board.java
 KifTree.java
■棋譜データの例
 Kifs.txt


なお、ついでに、データ量削減のため、ラベル付きノードからの分岐手順を

▲2六歩
△3四歩
▲7六歩 #label 1
△4四歩

#from 1
△8四歩

のように、それ以前の手順を省略して書けるようにもしようかと思ったが、このテキストファイルはjarで圧縮されるので、繰り返し部分を無くしてもデータ量削減の効果があまり無いことがわかったので、中止した。

なお、筆者は上記の同一局面のラベル付けをPC上でPythonスクリプトを作って自動的に行っているのだが、恐ろしく遅いスクリプトになったので、公開できなかった。

昨年は全く頭が回らず、全体的に自滅気味で、他の参加者がどれくらい強いのかを実感することもできなかったので、今年は、まず予選でまともな将棋を指せることを目標にする。