CSAサーバ プロトコル ver.1.1.1

2006年1月10日
CSA選手権LAN化計画担当

※旧版からの変更により、コンピュータ将棋選手権のみに関係する部分は、コンピュータ将棋選手権出場クライアントに対応していただくことに移行されました。コンピュータ将棋選手権に参加される方は、そちらもご参照ください。

目次

  1. プロトコルの背景
  2. 通信モデル
  3. プロトコル
    1. ログインとログアウト
    2. 対局条件と対局の開始
      1. 対局の一般情報
      2. 対局の持時間情報
      3. 対局の局面情報
    3. 対局の合意
    4. 指し手と意思表示
    5. ログイン中のタイムライン
  4. プロトコル改定履歴

1. プロトコルの背景

 本案は、直接的には、CSAが主催する世界コンピュータ将棋選手権をLAN上にて行うためのプロトコルを規定するものである。

 その一方、多くの多人数ゲームをインターネットを介して行うため、また、さまざまな持時間制のバリエーションを持たせるための拡張が可能な設計が行われている。これによって、多様な分野へのプロトコルの普及を促し、多くのソフトウェアにデファクト・スタンダードとして搭載されることを目指す。

 結果として、コンピュータ将棋の裾野が広がり、選手権参加者のプログラミング環境が整備されることを目標とする。

2. 通信モデル

 本プロトコルが想定するネットワーク環境は、ひとつの対局サーバに多数の対局クライアントがTCP/IP接続する形態である。サーバは中立の立場で、クライアント同士の対局を管理する審判の役割を果たす。

 最初に、クライアントがサーバにTCP接続することによって、各クライアントがサーバとのコネクションを確立する。サーバは何らかの方法によって、接続されたクライアント同士のマッチメイクを行い、対戦相手の名前その他の対局条件を通知するメッセージを対象となる複数のクライアントへ送出する。その後サーバは、対局条件に同意するメッセージを双方のクライアントから受信した時点から対局開始とし、最初に着手を行うクライアントの消費時間の計測を開始する。

 消費時間は、計測開始から、手番を握っているクライアントの指し手を表すメッセージの最後の文字に該当するLFがサーバに到着した直後の時間となる。 サーバは消費時間を計測し、時間切れか否かを判定するとともに、クライアントの指し手に従ってその局面を作成し、その着手がルールに合致しているか否か、また対局が終了したか否かの判定を行う。判定後、その指し手と消費時間、必要ならば判定結果を加えて両対局者に送信する。直後に、新たに手番を握ったクライアントの消費時間の計測を開始する。これを対局終了まで行う。対局終了後、クライアントとのコネクションを切断する。

 マッチメイクや対局条件の交渉を通信の中で行うようなケースは、ひとまず本案の対象外とする。

3. プロトコル

 コネクションの確立は常に、クライアントからサーバへのオープン要求によって開始される。オープン要求を受け付ける標準的なサーバ側のポート番号は、4081とする。

 コネクション確立後は、行単位の可読なコマンドのやりとりによって通信を行う。コマンド文字列は常に、LF(ラインフィード文字、ASCIIコード0x0a)、空白文字(' '、ASCIIコード0x20)およびASCIIコード0x21〜0x7fをもつ7ビットASCII文字列とし、大文字と小文字を明確に区別する。行末には常にLFが記述されるものとする。タブ文字は使用できない。また、複数の空白をひとつの空白として使ってはならない。

3.1. ログインとログアウト

 コネクション確立後、クライアントはサーバにログインする。対局を行うためには、クライアントは必ずログインしなければならない。ログインは原則としてクライアントからのログアウトによって解消される。場合によっては、サーバが接続を切断する場合がある。 ログイン中、クライアントは複数の対局を繰り返し行うことができる。

 クライアントは、以下のコマンドでサーバにログインする。

LOGIN <username> <password>
ここで、<username> は 数字('0'-'9')、英大文字('A'-'Z')、英小文字('a'-'z')、アンダースコア('_')、ハイフン('-')のいずれかの文字を用いた32バイト以内のクライアントを識別するための文字列、<password> は空白を含まない32バイト以内の<username> に固有のパスワード文字列とする。パスワード認証が成功した場合、サーバは
LOGIN:<username> OK
というメッセージでログインの完了をクライアントに伝える。 ログイン後、クライアントは対局待ちの状態となる。認証が失敗した場合は、
LOGIN:incorrect
というメッセージでログインの失敗を伝える。

 ログアウトは、クライアントが

LOGOUT
というコマンドを、対局待ち状態で送信することによって行う。 サーバは、
LOGOUT:completed
というメッセージを返して、ログアウトが完了し通信が切断されたことを示す。また必要に応じて、クライアントからログアウトコマンドが送られなくても、サーバがクライアントのログアウトを強制的に行うことがある。

3.2. 対局条件と対局の開始

 対局待ち状態では、クライアントはサーバによって対局の通知が行われるのを待つ。サーバはクライアントに、以下のようなメッセージで対局条件を通知する。

BEGIN Game_Summary
Protocol_Version:1.1
Protocol_Mode:Server
Format:Shogi 1.0
Declaration:Jishogi 1.1
Game_ID:20060505-CSA14-3-5-7
Name+:TANUKI
Name-:KITSUNE
Your_Turn:+
Rematch_On_Draw:NO
To_Move:+
BEGIN Time
Time_Unit:1sec
Total_Time:1500
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ファイル形式の指し手表現形式にカンマ付きの消費時間情報を添付したものを用いて表現する。最後に、手番側のクライアントに指し手を要求するメッセージを送信し、そのクライアントの消費時間の計測を開始する。

3.2.1. 対局の一般情報

 開始する対局の情報は、'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: (必須)
対局の開始直後に指し手を行う手番を示す。対局が途中局面からの再開である場合は、再開直後に指し手を行う手番を示すので、常に先手番が示されるとは限らない。

3.2.2. 対局の持時間情報

 開始する対局の持時間情報は、'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:
対局中の通算の持時間を単位時間で表す。通算の消費時間がこの数値以上になった場合は、時間切れとなる。この記述が省略された場合、1局通算での時間制限は課せられない。
Byoyomi:
1手あたりの消費時間を単位時間で表す。1手の消費時間がこの数値以上になった場合は、時間切れとなる。この記述が省略された場合、1手単位での時間制限は課せられない。

3.2.3. 対局の局面情報

 開始する対局の局面情報は、'BEGIN Position' と書かれた行と、'END Position' と書かれた行の間に記述され、初期状態の局面を表す。この階層の書式は、Formatに記述された文字列によって識別される。ここでは、将棋の書式についてのみ述べる。

 書式はCSAファイル形式に準拠した初期局面表記と指し手表記に一部変更を加えた形式からなる。指し手表記がない場合、対局は初期局面から開始される。指し手表記がある場合、初期局面と規定の持時間が与えられた状態から、表記された指し手がすでに完了しているものとし、そこから再開される。

 以下にCSAファイル形式からの変更点を示す。まず対局者名を表す情報については、対局の一般情報に移されたことにより、局面情報としては表記されない。したがってCSAファイル形式における 'N+','N-' は用いられない。次に初期局面表記は、必ず 'P1' - 'P9', 'P+','P-' で始まる各行によって表記され、'AL' は使用されない。

持駒がないときは、持駒の表記は省略可能とする。

3.3. 対局の合意

 クライアントは、サーバが示した対局条件に同意する場合は、

AGREE[ <GameID>]

(注:[]内は省略可能である事を示す。以下も同様。)

と書かれたコマンドを返す。<GameID>には、同意する対局条件中のGame_IDで示された文字列を記述し、その文字列が示す対局に同意した ことを示す。省略された場合は、直前にサーバが送信した対局条件のGame_IDを指すものとする。対局するすべてのクライアントのAGREEコマンドが得られた場合、これをもって対局の合意が得られたとみなし、サーバは、
START:<GameID>
というメッセージを全クライアントに送信し、対局状態に移行を宣言するとともに、最初に指し手を行うクライアントの消費時間の計測を開始する。

 クライアントが、対局条件を拒絶する場合は、

REJECT[ <GameID>]
と書かれたコマンドを返す。<GameID>には、拒絶する対局条件中のGame_IDで示された文字列を記述し、その文字列が示す対局を拒絶したことを示す。省略された場合は、直前にサーバが送信した対局条件のGame_IDを指すものとする。対局するクライアントのうちのいずれかがREJECTコマンドを送信した場合、対局の合意が得られなかったとみなし、サーバは、
REJECT:<GameID> by <rejector>
というメッセージを双方に送信し、<rejector>で示されたクライアントの対局拒絶により、サーバによる対局条件の送信が無効になったことを宣言し、双方のクライアントは対局待ち状態に戻る。

3.4. 指し手と意思表示

 クライアントとサーバは、対局開始メッセージの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行のメッセージを送信する。

 その他、サーバは必要に応じて、

#CHUDAN
というメッセージを送信し、対局の中断を宣言することがある。 この場合、クライアントは自動的もしくは手動により、その時点からの再開が可能な状態で対局を中断する。

 一方クライアントは、一定の状況のもとで、サーバに対局の中断を要請するため、

%CHUDAN
というメッセージを送ることができる。これを受け、サーバは対局の中断を宣言することがあるが、状況によってはこのメッセージを送ったクライアントを反則負けとして扱う。 クライアントによる中断要請の是非は、現状ではプロトコルの外部において規定されるものとし、このプロトコルでは規定を設けない。

 またクライアントは対局中、手番にかかわらず、長さゼロの文字列、もしくはLF1文字のみをサーバに送信することができる。 サーバは前者を受け取った場合、単純に無視する。後者を受け取った場合、短い待ち時間の後にLF1文字のみをそのクライアントに返信する。クライアントは、これらの送信を頻繁に行ってはならない。 具体的には、当該クライアントからの何らかの文字列をサーバが受信してから30秒を経ずして同一のクライアントからこれらの送信を行ってはならない。クライアントがこの規定に反した場合、サーバは当該クライアントを反則負けとして扱うことができる。

 対局終了後、クライアントは対局待ち状態に復帰する。

3.5. ログイン中のタイムライン

 クライアントがログイン中の、対局開始から終了までの タイムラインは以下の通りとなる。対局終了後は、ログイン状態が続く限りにおいて、繰り返し対局が可能である。

          machine1         server         machine2

1                ←   [対局条件]   →
2  AGREE aGAME   →                ←  AGREE aGAME
3                ←  START:aGAME   →
4                                  ← [指し手(初手)]
5                ←  [確認&時間]   →
6 [指し手(2手目)]→
7                ←  [確認&時間]   →
8                                  ←[指し手(3手目)]
9                ←  [確認&時間]   →
   …
       [投了]     →
                 ←[結果通知&終了] →

4. プロトコル改定履歴

以上