作成している将棋アプリに、対局後の棋譜解析機能を実装した。
機能内容
対局終了後に表示されるダイアログで、「棋譜解析」ボタンを押すと棋譜を解析して形勢グラフを表示する。
対局中のプレイヤー手番では、プレイヤー側の評価を非同期で行っているので、評価結果を残しておき、まずはその結果をすぐに表示する。
AI側の評価は、AIのレベルが低い場合、温度パラメータ等を変更しているため、AIの探索結果をそのまま使えないので、再評価する。
再評価は非同期で行い、解析が終わったものからグラフに反映される。
解析時間を考慮して、再評価時の探索は64プレイアウトに制限する。
棋力測定モードではAI側の探索結果がそのまま使えるので、再評価なしですぐに表示できる。
好手、悪手(10%)、悪手(20%)はマークするようにした。
局面の移動
棋譜解析では、形勢グラフのタップもしくは、ボタンで、局面の移動ができる。
局面を移動すると、512プレイアウトまで解析を行い形勢グラフに反映する。
移動した局面で、ヒントと定跡を使用して、検討ができる。
実装上苦労した点
実装には、想定以上に時間がかかった。
グラフを表示するために、線を引く必要があるが、Unityで綺麗な線が引けず試行錯誤する必要があった。
解決した方法については、別途記事にした。
UnityのLineRendererのアンチエイリアシングを有効にする - TadaoYamaokaの開発日記
また、線が折れると線が細くなる現象が起きたが、Corner Vertecesを1にすることで解決できた。
あと、スマホの画面に、形勢グラフを見やすいように収めるのに、グラフの表示領域や文字サイズの調整を繰り返す必要があった。
Unityでこの調整を行うと、確認のためにアプリを実行するのにビルドで1分くらい待たされるのでかなり効率が悪い。
デザインは、はじめにAdobe XDとかで行う方がよいと思う。