iPadのNeural Engineで将棋AI part10 CSAプロトコルに対応する
前回まででiPadで動作する将棋エンジンのコアはできましたが、USIプロトコルでMac上で動作している将棋所と通信する仕様となっており、iPad単独では世界コンピュータ将棋選手権やfloodgateでの対局がまだできませんでした。選手権等での対局にはCSAプロトコルが用いられているため、これを実装する必要があります。
CSAプロトコルの説明は以下のリンクから参照できます。今回は最新のバージョン1.2.1に対応します。
CSAプロトコルは汎用性が高く、駒落ち対局などの特殊な条件にも対応しています。CSAプロトコル全体を実装するのは大変なので、選手権とfloodgateで必要となる最低限の機能だけを実装します。
最低限必要なステップは以下の通りになります。
- TCPでサーバに接続する
- LOGIN送る
- 相手が決まると、対局条件が来る
- "Your_Turn:+"で自分が先手か後手かを知る
- "END Game_Summary"を待つ
- "AGREE"を送る
- "START"を待つ
- これが来たら対局開始、時間計測開始
- 先手番の時、STARTを待たずに初手を送る実装をするとトラブルにつながるケースもあるようで注意
- 手番なら、思考して手を返す ("+7776FU")
- サーバからの指し手(自分、相手両方の指し手)を待つ("+7776FU,T12")
- 相手が投了すれば"%TORYO,T4"など
- 指し手によって対局が終わる場合、指し手の次の行で、"#SENNICHITE"や"#WIN"などが来る
- "#ILLEGAL_MOVE"の場合があり、その場合直前の手の表記は間違っている可能性がある(厳格に対処するのは大変なので気にしない)
- 指し手の行が来た時点で思考に入るが、対局終了のメッセージが来たらそれを打ち切って終了画面に移行することが望ましい(できなくても負けにはならないと思うが)
- LOGOUTを送るほうがより適切
- floodgateで連続対局したい場合は、TCP接続が切れたら新しく接続しなおして、LOGINから通信をやり直す実装が必要。
- floodgateでは、拡張モードを用いることでTCP接続を切らずに連続対局したり読み筋を送ったりすることが可能。しかし選手権のサーバでは対応していないため、拡張モードは実装しない。
CSAプロトコルのちょっと困る・USIより面倒なポイント
- 千日手が成立する手と、指し手の後に千日手成立のメッセージが分かれて送られてくる
- 手が来た時点で思考を始めてしまうため、それを止める機構を実装しないと連続対局に支障がある(手動で再起動する分には問題ないが)
- 指し手の表記("+2726FU")に駒の種類や手番が含まれている
- 持ち時間の管理をクライアント側で行う必要がある。
- 通信をkeepaliveする必要がある。
これらの実装をして、CSAプロトコルでfloodgateに接続してiPad単独での対局が可能になりました。ただし、選手権のルールでは画面に最低限表示すべき内容が規定されており、将棋所を使うことで自動的に満たされていた要件を独自に実装する必要があります。次回は画面について記事にします。