USIプロトコルを理解せよ

コンピュータ将棋

棋戦を中継するのはNG!?

ちょっと前に朝日杯の棋譜をリアルタイム中継していたために朝日新聞社のツイッターアカウントから怒られていた実況者がいたことは記憶に新しい。

別にテレビ中継をミラーしていたわけでもないのに何故怒られたのか?

それは、朝日新聞社が朝日杯のスポンサーであり、棋戦を(おそらく優先的、独占的に)放送する権利を持っているからである。

棋戦をテレビ放送することで「朝日杯は多くの人が視聴していますよ。スポンサーの方々、朝日杯中継にCM(広告)をだしませんか?」という仕組みがあるからである。

多くの人が視聴しているのであれば当然企業はCMを出したいと思うし、その広告料が朝日杯を支える資本の一分になっているのは間違いないわけである。

なのに無断でリアルタイムに棋譜を中継されてしまっては本来テレビ放送を見ていてくれたはずの視聴者がそちらに流れてしまう。これでは朝日新聞社も商売上がったりである。

というわけで、少なくとも「棋戦が終わるまでは棋譜中継はしないほうがいい」という結論が得られるわけである。

棋譜自体にはおそらく権利がないので棋戦終了後に棋譜並べをして自分なりに分析するとか、そういう動画を上げるのは多分問題ないでしょう。

放送じゃなければいいのだろうか

では、例えばリアルタイムで検討をおこなうのはどうだろう?

  • 現在の局面
  • 評価値
  • 検討ソフト
  • 検討の深さ(ノード数)
  • 候補手

をTwitterでつぶやくような形式である。

ここまで詳しくやっている人はいないだろうが、たまに手元のPCで評価値を求めてそれをつぶやいている人はTwitterで見かける。

あれなら問題ないのだろうか?

USIプロトコルについて

めっちゃ話が逸れたのだが、今回考えたいのはUSIプロトコルである。

たしかこれはUniversal Shogi Interfaceかなにかの略だった気がする。つまり、将棋ソフト間での言語だと思ってもらって良い。

記憶では確かエンジン起動時にusi readyと送ると基本情報を返してusi okと返ってきたはずである。なので確かめてみた。

すると正しく通信ができた。

ここから局面情報を送ってやればいいはずである。

しかしUSIプロトコルについてあんまり詳しくないので将棋神やねうら王のデバッグウィンドウを元にコマンドを推察することにした。

usi
isready
usinewgame
setoption name MultiPV value 1
position sfen lr4n1l/2n4+R1/2g2k3/p1p1psp1p/5N3/PPP3P1P/2S1PG3/2G6/LNK5L w G2P2b2s5p 100
go btime 0 wtime 0 byoyomi 60000

するとなにやらこんなコマンドを送っていた。

MultiPVというのは候補手をいくつ検討するかという意味で、1にしたほうが圧倒的に強い。最強を目指すコンピュータであればわざわざ複数選ぶ意味もないのだが、人間的には他にどんな候補手があるのか知りたいところなのでこの値を2や3にしている人も多い。

まあ今はめんどくさいことを考えずに1に設定してみよう。

goとやると検討を開始したのかズラズラとログが返ってきた。

にやけながらこんなログをスタバで流していたらたちまちハッカーの仲間入りである(棒

どういう仕組みが必要か

さっき解説した、評価値botをつくるためには何が必要だろう?

棋譜データに関しては公式からパクるもといデータ取得してこれば問題なかろう。

問題はそれがSfenデータでないことである。うわー、めんどくさい!!!

http://live.shogi.or.jp/ryuou/kifu/31/ryuou201811010101.kif

竜王戦の棋譜データに関してはソースコードをみたらすぐに見つかりました。

まあ当然ただのkifデータなのでこれを現在の局面sfenに直さなくてはいけません…

え、これぼくがやるんですか!?

ここまでの大まかな流れはこんな感じ。今回は「Sfen→検討ソフト」で正しく検討できそうだということがわかったのである。

KIF→Sfenが結構難しくて、まず日本語の棋譜データから正しく局面データをつくるのは難しそう…

なんとかできました!!!

結局見たいのは最終局面だけなので既存のソフトで何とかならんのかなと思っています。

欲しいもの

KIFデータから最終局面のpositionを出力するプログラム。

やねうら王がwindowsでしか動かなさそうなのでwindowsで動くようにしたい。

となると最有力候補はC++とかになるのだが、最近全く書いていないので自信がない。

しかもどうせなら棋譜データも自分で取得してきてそれを表示するようにしたいわけである。

となるとサーバサイドでPHPかなんかでコードを書いて最終局面をSfenで出力する(例えばposition ~のような形式で返すコード)方がいいのではないかという気もしてくる。

どっちにしてもやねうら王をlinux版でビルドするより、棋譜変換するコードを書いたほうが早そうである。

あー、考えるのがめんどくさいー(泣)

コメント

タイトルとURLをコピーしました