※旧版からの変更により、コンピュータ将棋選手権のみに関係する部分は、コンピュータ将棋選手権出場クライアントに対応していただくことに移行されました。コンピュータ将棋選手権に参加される方は、そちらもご参照ください。
本案は、直接的には、CSAが主催する世界コンピュータ将棋選手権をLAN上にて行うためのプロトコルを規定するものである。
その一方、多くの多人数ゲームをインターネットを介して行うため、また、さまざまな持時間制のバリエーションを持たせるための拡張が可能な設計が行われて いる。これによって、多様な分野へのプロトコルの普及を促し、多くのソフトウェアにデファクト・スタンダードとして搭載されることを目指す。
結果として、コンピュータ将棋の裾野が広がり、選手権参加者のプログラミング環境が整備されることを目標とする。
本プロトコルが想定するネットワーク環境は、ひとつの対局サーバに多数の対局クライアントがTCP/IP接続する形態である。サーバは中立の立場で、クライアント同士の対局を管理する審判の役割を果たす。
最初に、クライアントがサーバにTCP接続することによって、各クライアントがサーバとのコネクションを確立する。サーバは何らかの方法によって、接続さ れたクライアント同士のマッチメイクを行い、対戦相手の名前その他の対局条件を通知するメッセージを対象となる複数のクライアントへ送出する。その後サー バは、対局条件に同意するメッセージを双方のクライアントから受信した時点から対局開始とし、最初に着手を行うクライアントの消費時間の計測を開始する。
消費時間は、計測開始から、手番を握っているクライアントの指し手を表すメッセージの最後の文字に該当するLFがサーバに到着した直後の時間となる。 サーバは消費時間を計測し、時間切れか否かを判定するとともに、クライアントの指し手に従ってその局面を作成し、その着手がルールに合致しているか否か、 また対局が終了したか否かの判定を行う。判定後、その指し手と消費時間、必要ならば判定結果を加えて両対局者に送信する。 直後に、新たに手番を握ったクライアントの消費時間の計測を開始する。 これを対局終了まで行う。 対局終了後、クライアントはマッチメイク前の状態に戻る。
マッチメイクや対局条件の交渉を通信の中で行うようなケースは、ひとまず本案の対象外とする。
コネクションの確立は常に、クライアントからサーバへのオープン要求によって開始される。オープン要求を受け付ける標準的なサーバ側のポート番号は、4081とする。
コネクション確立後は、行単位の可読なコマンドのやりとりによって通信を行う。コマンド文字列は常に、LF(ラインフィード文字、ASCIIコード 0x0a)、空白文字(' '、ASCIIコード0x20)およびASCIIコード0x21~0x7fをもつ7ビットASCII文字列とし、大文字と小文字を明確に区別する。行末に は常にLFが記述されるものとする。タブ文字は使用できない。また、複数の空白をひとつの空白として使ってはならない。
コネクション確立後、クライアントはサーバにログインする。対局を行うためには、クライアントは必ずログインしなければならない。ログインは原則としてクライアントからのログアウトによって解消される。場合によっては、サーバが接続を切断する場合がある。 ログイン中、クライアントは複数の対局を繰り返し行うことができる。
クライアントは、以下のコマンドでサーバにログインする。
LOGIN <username> <password>ここで、<username> は 数字('0'-'9')、英大文字('A'-'Z')、英小文字('a'-'z')、アンダースコア('_')、ハイフン('-')のいずれかの文字を用 いた32バイト以内のクライアントを識別するための文字列、<password> は空白を含まない32バイト以内の<username> に固有のパスワード文字列とする。パスワード認証が成功した場合、サーバは
LOGIN:<username> OKというメッセージでログインの完了をクライアントに伝える。 ログイン後、クライアントは対局待ちの状態となる。認証が失敗した場合は、
LOGIN:incorrectというメッセージでログインの失敗を伝える。
ログアウトは、クライアントが
LOGOUTというコマンドを、対局待ち状態で送信することによって行う。 サーバは、
LOGOUT:completedというメッセージを返して、ログアウトが完了し通信が切断されたことを示す。また必要に応じて、クライアントからログアウトコマンドが送られなくても、サーバがクライアントのログアウトを強制的に行うことがある。
対局待ち状態では、クライアントはサーバによって対局の通知が行われるのを待つ。サーバはクライアントに、以下のようなメッセージで対局条件を通知する。
BEGIN Game_Summary Protocol_Version:1.2 Protocol_Mode:Server Format:Shogi 1.0 Declaration:Jishogi 1.1 Game_ID:20150505-CSA25-3-5-7 Name+:TANUKI Name-:KITSUNE Your_Turn:+ Rematch_On_Draw:NO To_Move:+ Max_Moves:256 BEGIN Time Time_Unit:1sec Total_Time:600 Byoyomi:10 Least_Time_Per_Move:1 END Time BEGIN Position P1-KY-KE-GI-KI-OU-KI-GI-KE-KY P2 * -HI * * * * * -KA * P3-FU-FU-FU-FU-FU-FU-FU-FU-FU P4 * * * * * * * * * P5 * * * * * * * * * P6 * * * * * * * * * P7+FU+FU+FU+FU+FU+FU+FU+FU+FU P8 * +KA * * * * * +HI * P9+KY+KE+GI+KI+OU+KI+GI+KE+KY P+ P- + +2726FU,T12 -3334FU,T6 END Position END Game_Summary対局の情報は、BEGIN~ENDによって階層構造で表現される。 プロトコルのバージョンは将来のプロトコルの拡張のため、フォーマットは多くの競技への対応のために準備される。 消費時間の書式は通算時間のほか、1手あたりの時間の定義、およびそれらの併用をサポートする。初期局面の表現は、後述するように、CSAファイル形式の 局面表現形式に多少の変更を加えたものを用いる。初期局面から対局開始(再開)局面までの指し手は、CSAファイル形式の指し手表現形式にカンマ付きの消 費時間情報を添付したものを用いて表現する。最後に、手番側のクライアントに指し手を要求するメッセージを送信し、そのクライアントの消費時間の計測を開始する。
開始する対局の情報は、'BEGIN Game_Summary' と書かれた行と、'END Game_Summary' と書かれた行の間に記述される。 この情報のうち、持時間情報と局面情報については、この中の下部階層に記述され、その他一般情報についてはこの階層に記述される。以下、一般情報として表される情報について述べる。
Protocol_Version: (必須)このプロトコルのバージョン番号を表す。バージョン番号は、このプロトコル全体の書式を規定する。
Protocol_Mode:(省略時はServer)'Server' の場合は、サーバを経由する対局プロトコルであることを表す。'Direct' の場合は、対局者同士が直接指し手を送り合う1対1のプロトコルであることを表す。 なお、本文書では1対1のプロトコルについて取り扱わない。
Format: (必須)このプロトコルの、種目に依存した情報の書式を識別する文字列を表す。具体的には、'BEGIN Position' の行で始まり、'END Position' の行で終わる階層の内部の書式と、指し手の表記方法、および 'Declaration:' の行に記述された情報の意味内容を規定する。 ここでは、将棋に関する記述についてのみ述べる。 'Shogi 1.0' となっている場合、このプロトコルにおいて規定された将棋のゲームをプレイすることを意味する。
Declaration: (省略時は情報なし)ゲームのプレイ時、指し手以外の宣言に関する規定を示す文字列を表す。情報の意味は、Formatに記述された文字列に依存する。 'Jishogi 1.1' の記述がある場合、日本将棋連盟ルールに基づく、入玉による勝利宣言ルールが採用されることを示す。 現状では、この記述のみ許可されている。
Game_ID: (省略時は空文字列)このゲームを識別するためのユニークな文字列を表す。
Name+, Name-: (必須)先手、後手のプレイヤ名を表す。
Your_Turn: (必須)このメッセージを受け取るクライアントの手番を表す。 したがって、このフィールドはクライアントごとに異なる。
Rematch_On_Draw: (省略時はNO)このゲームの結果が引き分けであった場合に、自動的に再試合を行う場合はYES、ゲームを終了する場合はNOが記述される。 現時点では、NOのみ許可されている。
To_Move: (必須)対局の開始直後に指し手を行う手番を示す。対局が途中局面からの再開である場合は、再開直後に指し手を行う手番を示すので、常に先手番が示されるとは限らない。
Max_Moves: (省略可)対局の継続が可能な手数を示す。この記述が省略された場合、対局の手数の制限はないものとする。 ここで手数とは、先手の着手の数と後手の着手の数との合計値とする。対局が中断された後再開されたものである場合は、中断前の着手を含めたすべての着手を手数に算入する。 手数がこの値と一致したとき、最後の着手が投了、勝利宣言、中断のいずれか、もしくは、最後の着手によって反則、千日手のいずれかが成立した場合を除き、対局は打ち切りとなる。 対局の打ち切りが成立した場合、対局の結果の決定は別に定めることができるものとする。
開始する対局の持時間情報は、'BEGIN Time' と書かれた行と、'END Time' と書かれた行の間に記述され、対局者の持時間を表す。'Time' の階層に情報が書かれている場合は、全対局者が共通の持時間を用いる。手番ごとに個別の持時間を記述する場合は、それぞれ 'Time+', 'Time-' の階層に記述することによって区別し、'Time' の階層は省略される。
Timeの階層が省略された場合、消費時間は計測されず、指し手は時間無制限となる。
以下、この階層で用いられる表現について述べる。
Time_Unit: (省略時は1秒とする)消費時間を計測する単位時間を示す。 秒単位の数値を表す場合は 'sec', 分単位の数値を表す場合は 'min', ミリ秒単位は 'msec' の文字列を用いる。 例えば最小単位が1分の場合、消費時間は1分ごとに記録され、秒単位以下の時間は切り捨てその他の適切な処理が行われる。
Least_Time_Per_Move: (省略時は0)1手の着手に必ず記録される消費時間(最少消費時間)を単位時間で表現する。 これが1秒である場合、少なくとも1手あたり1秒が消費される。
Time_Roundup: (省略時はNO)YESの場合、単位時間未満の時間が切り上げて記録される。NOの場合は切り捨てられる。
以下、実際の時間を表記する表現について述べる。階層中には、以下のいずれかの表現がたかだか1つ含まれる。すべて省略された場合は、消費時間無制限とする。
Total_Time: (省略可)対局中の持時間の初期値を単位時間で表す。 通算の消費時間が通算の持時間以上になった場合は、時間切れとなる。 時間切れとなった際、秒読みの記述が存在していなければ、その時点で負けとなる。 時間切れとなった際、秒読みの記述が存在していれば、時間切れとなった直後から秒読み時間内に着手を行うことにより対局の継続が可能となる。 この記述と加算時間の両方の記述が省略された場合、対局全体を通じた時間制限は存在しない。
Byoyomi: (省略可)持時間および加算時間に関する定義が存在しない場合、または残り時間がなくなっている場合、あるいは時間消費中に残り時間をすべて消費した場合に、指し手1手ごとに付与される時間(秒読み)を単位時間で表す。 残り時間がある状態で時間消費が開始され、かつ着手が行われないまま残り時間をすべて消費した場合、残り時間をすべて消費した直後から残りの着手期限としての秒読みが付与される。この状態で秒読み時間内に着手が行われたとき、着手の消費時間は秒読み開始前と開始後の消費時間の合計がその着手の消費時間として記録される。 残り時間がある間は、秒読みは開始されない。 秒読み開始後に持時間が1手の消費時間がこの数値以上になった場合は、時間切れとなり、その時点で負けとなる。 ここで「残り時間」とは、各地点において通算持時間から通算消費時間を差し引いた時間であり、現在以降に消費可能な時間を意味する。 この記述が省略された場合、1手単位での時間制限は課せられない。
Delay: (省略可)手番側の時間の計測が開始されてから消費時間として記録される時間の計測が開始されるまでの時間(遅延時間)を単位時間で表す。 この記述が存在する場合、手番側の時間の計測が開始されてから遅延時間内に行われた着手は、時間の消費を行っていないものとみなされる。手番側の時間の計測が開始されてから遅延時間を超えて行われた着手は、時間計測が開始されて着手が行われるまでの時間から遅延時間を差し引いた時間が消費時間とみなされる。 このような着手では、 'Least_Time_Per_Move' の記述がある場合に限り最少消費時間が消費されたものとみなされる。 'Least_Time_Per_Move' の記述がない場合には、消費時間は0となる。 この記述が省略された場合、消費時間の計測は手番側の時間の計測の開始と同時に開始される。
Increment: (省略可)手番側の時間の計測が開始される直前に持時間に加算される時間(加算時間)を単位時間で表す。 この記述が省略された場合、持時間は初期値から加算されない。 通算の消費時間が持時間以上になった場合は、時間切れとなる。加算時間が定義されている場合、通算の消費時間が持時間の初期値以上になっても、持時間の初期値と各手番において加算された時間の総計が通算の消費時間を上回っていれば時間切れにはならない。 時間切れとなった際、秒読みの記述が存在していなければ、その時点で負けとなる。 時間切れとなった際、秒読みの記述が存在していれば、時間切れとなった直後から秒読み時間内に着手を行うことにより対局の継続が可能となる。 時間切れとなった直後から秒読み時間内に着手を行った場合、次の指し手の直前に加算時間が持時間に加算されることによって、再度持時間を消費する状態となる。
以下に、持時間の初期値、秒読み、遅延時間、加算時間の記述が存在している場合の各着手における消費時間の決定過程の事例を示す。
BEGIN Time Time_Unit:1sec Total_Time:300 Byoyomi:10 Delay:3 Increment:5 END Time上記は 'BEGIN Time' から 'END Time' までの記述例である。上記は、持時間の初期値が300秒、秒読みが10秒、遅延時間が3秒、加算時間が5秒であることを示している。これらすべての時間要素が採用される事例は過去にも将来にもほとんどないと想定されるが、便宜上すべてがある場合で説明する。
上記の初期設定から対局が開始され、今、80手目の後手の着手が行われた直後の状態とし、先手が79手目までに消費した通算消費時間が320秒になっているものと仮定する。先手の通算消費時間は持時間の初期値をすでに上回っているが、加算時間の記述により、先手が79手目までに着手した合計40の指し手の直前に各5秒が持時間に加算されているため、現時点で通算持時間が500秒に増大しており、残り時間が180秒になっていることになる。
この状態で81手目の局面を迎えた直後、加算時間によって残り時間が180秒から185秒に増大する。仮に加算時間の記述がないなら、残り時間の増大は生じない。ここから、
以下、上記の各時間要素について、異なる設定の場合の説明をいくつか追記する。 持時間の初期値または加算時間のいずれか一方、もしくは両方の定義が存在する場合は、何らかの形で持時間が生じることになる。 持時間の初期値と加算時間の定義がともに存在しないとき、すべての着手の時間制限は遅延時間と秒読みを合計した時間以内となり、時間超過が生じた場合は即時間切れ負けとなる。 持時間がない場合、もしくは加算時間なしで持時間をすべて消費した場合、たとえば「遅延時間10秒、秒読みなし」「遅延時間5秒、秒読み5秒」「遅延時間なし、秒読み10秒」の3者はすべて同じ時間条件となるが、消費時間の記述は異なる(秒読み中に経過した時間のみ消費時間に記録される)。 加算時間は必ず指し手の直前に加算される。指し手の後ではないので、たとえば「加算時間5秒、持時間なし、遅延時間なし、秒読みなし」の場合、初手および2手目には必ず5秒の考慮時間が確保され、以降は1手平均5秒未満の消費時間が確保される。 持時間の初期値、秒読み、遅延時間、加算時間の各時間要素は、追加されることによって着手に使用可能な時間を増大させるが、すべての時間要素の記述が省略された場合に限り、着手は時間無制限となる。
開始する対局の局面情報は、'BEGIN Position' と書かれた行と、'END Position' と書かれた行の間に記述され、初期状態の局面を表す。この階層の書式は、Formatに記述された文字列によって識別される。ここでは、将棋の書式につい てのみ述べる。
書式はCSAファイル形式に準拠した初期局面表記と指し手表記に一部変更を加えた形式からなる。指し手表記がない場合、対局は初期局面から開始される。指し手表記がある場合、初期局面と規定の持時間が与えられた状態から、表記された指し手がすでに完了しているもの とし、そこから再開される。
以下にCSAファイル形式からの変更点を示す。まず対局者名を表す情報については、対局の一般情報 に移されたことにより、局面情報としては表記されない。したがってCSAファイル形式における 'N+','N-' は用いられない。次に初期局面表記は、必ず 'P1' - 'P9', 'P+','P-' で始まる各行によって表記され、'AL' は使用されない。
持駒がないときは、持駒の表記は省略可能とする。クライアントは、サーバが示した対局条件に同意する場合は、
AGREE[ <GameID>](注:[]内は省略可能である事を示す。以下も同様。) と書かれたコマンドを返す。<GameID>には、同意する対局条件中のGame_IDで示された文字列を記述し、その文字列が示す対局に同意した ことを示す。省略された場合は、直前にサーバが送信した対局条件のGame_IDを指すものとする。対局するすべてのクライアントのAGREEコマンドが得られた場合、これをもって対局の合意が得られたとみなし、サーバは、
START:<GameID>というメッセージを全クライアントに送信し、対局状態に移行を宣言するとともに、最初に指し手を行うクライアントの消費時間の計測を開始する。
クライアントが、対局条件を拒絶する場合は、
REJECT[ <GameID>]と書かれたコマンドを返す。<GameID>には、拒絶する対局条件中のGame_IDで示された文字列を記述し、その文字列が示す対局を拒 絶したことを示す。省略された場合は、直前にサーバが送信した対局条件のGame_IDを指すものとする。対局するクライアントのうちのいずれかが REJECTコマンドを送信した場合、対局の合意が得られなかったとみなし、サーバは、
REJECT:<GameID> by <rejector>というメッセージを双方に送信し、<rejector>で示されたクライアントの対局拒絶により、サーバによる対局条件の送信が無効になったことを宣言し、双方のクライアントは対局待ち状態に戻る。
クライアントとサーバは、対局開始メッセージのFormatで定義されたフォーマットに準拠したメッセージによって指し手を表現する。ここでは、将棋の書式についてのみ述べる。 本案で定義する指し手表現は、おおむねCSAファイル形式で定義されたものを使用する。
クライアントは手番を握っているときに、一例として
+7776FUという文字列を送信する。サーバはこの手を判定し、合法的であれば、
+7776FU,T12と、カンマ付きの消費時間情報を添付し、対局する両方のクライアントに送信する。このメッセージは対戦相手への指し手の通知、手を指したクライアントへの確認と判定結果の通知、双方への消費時間の通知を行うためのものである。
投了、勝利宣言、千日手、連続王手の千日手ほか、対局の終了、打ち切り、もしくは中断に至る何らかの事象が発生した場合、サーバは '#' で始まる文字列を2行続けて送信し、何らかの事象の発生を通知する。事象発生後、双方のクライアントは対局待ち状態に戻る。まず、サーバは千日手と禁手の チェックを行う。指し手によって連続王手でない千日手が成立した場合、サーバは
+6978KI,T2 #SENNICHITE #DRAWと、通常の指し手および消費時間に加え、その手によって千日手が成立したことを示す2行目の情報と、無勝負であることを示す3行目の情報の計3行を双方に送る。
連続王手の千日手が成立した場合、サーバは
-8493OU,T2 #OUTE_SENNICHITE #WIN(LOSE)と、通常の指し手および消費時間に加え、その手によって連続王手の千日手が成立したことを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。以後、このように無勝負以外の勝敗情報が送られる場合、その内容は勝利した側と敗北した側で異なる。
連続王手の千日手以外の不正な着手、もしくは不正な書式の指し手が送信された場合、サーバは、
+0031FU,T1 #ILLEGAL_MOVE #WIN(LOSE)と、通常の指し手および消費時間に加え、その手が不正な指し手であることを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。不正な書式の指し手が送られた場合、その内容のすべてを表示しないことがある。Formatが 'Shogi 1.0'である場合、不正な書式の指し手文字列は、文字列の先頭7文字から使用可能な文字のみが切り出されて送信される。
また、規定時間内に指し手が送信されなかった場合、サーバは着手を待つことなく、
#TIME_UP #WIN(LOSE)という2行の情報を双方に送信する。
クライアントは、投了する場合、自らの手番において、
%TORYOという文字列をサーバに送信する。サーバは、これを受信した場合、対局する双方のクライアントに、
%TORYO,T4 #RESIGN #WIN(LOSE)と、投了を示す文字列および文字列送信までの消費時間に加え、投了が行われたことを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。
一方、勝利宣言の条件を満たしている状態でクライアントが勝利宣言を行う場合、クライアントは自らの手番において、
%KACHIという文字列をサーバに送信する。サーバは、これを受信したとき、条件が満たされている場合には、対局する双方のクライアントに、
%KACHI,T8 #JISHOGI #WIN(LOSE)と、勝利宣言を示す文字列および文字列送信までの消費時間に加え、勝利宣言によって対局が終了したことを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。また条件を満たしていない場合には、この宣言を不正な着手と同様に取り扱い、
%KACHI,T8 #ILLEGAL_MOVE #WIN(LOSE)という3行のメッセージを送信する。
対局条件にMax_Movesの記述が含まれ、かつ手数がMax_Movesの数値に到達するまでに上記のいずれかによって対局が終了しなかった場合、サーバは
#MAX_MOVES #CENSOREDと、規定手数への到達を示す1行目の情報と、対局が打ち切られたことを表す2行目の情報の計2行を双方に送る。
その他、サーバは必要に応じて、
#CHUDANというメッセージを送信し、対局の中断を宣言することがある。 この場合、クライアントは自動的もしくは手動により、その時点からの再開が可能な状態で対局を中断する。
一方クライアントは、一定の状況のもとで、サーバに対局の中断を要請するため、
%CHUDANというメッセージを送ることができる。これを受け、サーバは対局の中断を宣言することがあるが、状況によってはこのメッセージを送ったクライアントを反則負けとして扱う。 クライアントによる中断要請の是非は、現状ではプロトコルの外部において規定されるものとし、このプロトコルでは規定を設けない。
またクライアントは対局中、手番にかかわらず、長さゼロの文字列、もしくはLF1文字のみをサーバに送信することができる。 サーバは前者を受け取った場合、単純に無視する。後者を受け取った場合、短い待ち時間の後にLF1文字のみをそのクライアントに返信する。クライアントは、これらの送信を頻繁に行ってはならない。 具体的には、当該クライアントからの何らかの文字列をサーバが受信してから30秒を経ずして同一のクライアントからこれらの送信を行ってはならない。クライアントがこの規定に反した場合、サーバは当該クライアントを反則負けとして扱うことができる。
対局中のクライアントの情報送信は、すべて自身の手番のときにのみ実行可能とする。対局中の自身の手番でないとき、すなわち相手の手番のときに指し手などの送信を行った場合、サーバは
#ILLEGAL_ACTION #LOSE(WIN)という2行のメッセージを両クライアントに送信して対局を終了し、手番でないクライアントの反則負け(手番のクライアントの反則勝ち)とする。
対局終了後、クライアントは対局待ち状態に復帰する。
クライアントがログイン中の、対局開始から終了までの タイムラインは以下の通りとなる。対局終了後は、ログイン状態が続く限りにおいて、繰り返し対局が可能である。
machine1 server machine2 1 ← [対局条件] → 2 AGREE aGAME → ← AGREE aGAME 3 ← START:aGAME → 4 ← [指し手(初手)] 5 ← [確認&時間] → 6 [指し手(2手目)]→ 7 ← [確認&時間] → 8 ←[指し手(3手目)] 9 ← [確認&時間] → … [投了] → ←[結果通知&終了] →