世界コンピュータ将棋オンライン大会の対戦環境をテストしていて、クライアントの将棋所からssh経由でサーバでdlshogiを実行していたが、回線が不安定なため途中で切れることがあったので、サーバから直接接続する方式に変更することにした。
dlshogiは標準入出力ベースのUSIプロトコルにしか対応していないが、世界コンピュータ将棋オンライン大会のサーバにはCSAプロトコルで通信する必要がある。
そのため、USIプロトコルとCSAプロトコルの変換が必要になる。
将棋所を使用する場合はその変換を行ってくれるが、将棋所はGUIが必要なためサーバのターミナルでは動かない。
python-shogiにCSAプロトコルのクラスがあるので、はじめそれを使用して変換しようとプログラムを書き始めていたが、Ponderとか時間管理とかを実装する必要があり、結構面倒である。
既存のプログラムがないかと探したら、usiToCsa.rbという目的そのもののプログラムが見つかった。
しかし、フィッシャールールに対応していないので修正が必要である。
さらに探したら、usiToCsa.rbをフォークしてフィッシャールールに対応させたプロジェクトが見つかった。
このプログラムを使用してfloodgateでテストしていたが、以下のような問題があったので修正した。
- gamenameが必須になっているので廃止(世界コンピュータ将棋オンライン大会では不要)
- ponder stopでresignを返した場合に投了してしまう
- infoにdepthがない場合、CSAコメントが出力されない
- PVが1手のみの場合、CSAコメントが出力されない
- mateが+のみの場合、評価値が正しく表示されない
これらを修正して、floodgateで10戦くらい安定して動かせることを確認した。
修正したプログラムをGitHubに公開した。
github.com
使いたい方はご自由にどうぞ。
実行には、rubyが必要です。Ubuntu 18.04 LTSの場合、「apt install ruby」でインストールしたrubyで動かせます。
動作は保証しませんm(__)m