============================================================================
V1.0 からの変更点

・対局者名の表記は、混乱を防止するため、'N+', 'N-'の表記を中止し、
Name+, Name-だけに。
・入玉による勝利宣言ルール
対局の局面情報から対局の一般情報へ移動し、Declaration:で宣言するように。
・以上の変更に合わせ、Protocol_Versionを 1.0 から 1.1 に。
============================================================================
TCP/IPによるCSA1対1接続対局プロトコル

V1.1 2004年10月7日 CSA選手権LAN化委員 柿木

目次
1. プロトコルの背景
2. 通信モデル
3. プロトコル
3.1. サーバ
3.2. ログインとログアウト
3.3. 対局条件と対局の開始
3.3.1. 対局の一般情報
3.3.2. 対局の持時間情報
3.3.3. 対局の局面情報
3.4. 対局の合意
3.5. 指し手と意思表示
3.5.1. 通常の指し手
3.5.2. 対局を終了・中断させるコマンド
3.6. 再開の方法
3.7. トラブル発生時の処理
3.8. タイムライン
4. ケーブル、コネクタ
5. プロトコル改定履歴
-------------------

1. プロトコルの背景

本プロトコルは、次の目的を持っている。

(1) 本格的な審判サーバを使った対局に移行するための RS232Cからの切り替えの第1歩の位置付けとする。したがって、本プロトコルは、審判サーバを使う CSAサーバ プロトコル(以下、「サーバプロトコル」とする)にできるだけ互換性を持たせる。ただし、共通にできない、あるいは、共通にする必要のない部分は、従来のRS232Cの方式に合わせたり、できるだけ単純なものとする。

(2) 審判サーバに移行後は、審判サーバに接続できない場合のバックアップとしての対局方法とする。バックアップは、RS232Cを使った現方式でも可能であるが、RS232C自体が廃止の方向にあるので、TCP/IPを使用したほうが将来性がある。また、通信をTCP/IPに統一できる。

(3) コンピュータ将棋の開発のためのソフト同士の対局手段とする。
現在、市販ソフトの多くは、TCP/IP対局機能を備えているが、互換性がなく、異なったソフト同士では、対局できない。
本プロトコルを公開し、無条件で市販のソフトにも組み込むことを認める。これによって、異なったソフト同士での対局を可能にし、開発の際に使われる自動対戦(連続対戦を含む)も可能とする。

単に対局するだけなら、もっと単純にできるが、サーバプロトコルとの互換を保つため、やや複雑になっている。


2. 通信モデル

本プロトコルが想定するネットワーク環境は、対局する2者の間でTCP接続する。片方がサーバの役割を果たし、もう1方(クライアント側)からのTCP接続を待つ。接続後、サーバ役が相手に対局条件を通知し、クライアント側がそれを確認し、対局を開始する。その後、指し手のみを送り合い、消費時間は各自で計測・記録する。
相手の消費時間は、互いに計り合うことになる。
対局終了後、クライアントとのコネクションを切断する。
通信開始時の条件の確認以外は、従来のRS232Cの通信に近い。
連続対戦を行う場合は、以上の処理を繰り返す。連続対戦の仕様は、本プロトコルの規格外とする(現在のRS232Cを使った連続対戦と同様に可能と思われる)。
以下、「サーバ」とあるのは、サーバの役割を果たす対局者である。


3. プロトコル

コネクションの確立は常に、クライアントからサーバへのオープン要求によって行われる。オープン要求を受け付ける
標準的なサーバ側のポート番号は、4081(駒40枚、盤81枡の意味)とする。
コネクション確立後は、行単位の可読なコマンドのやりとりによって通信を行う。行末には常にLF(0x0a)の1バイトが記述されるものとする。
文字はすべて7ビットASCIIで表記し、大文字と小文字を明確に区別する。

3.1. サーバ

審判サーバがないため、双方のどちらかが、サーバの役割を果たす。
通常、サーバは手番でない方とする。初期配置からなら、
後手(下手)がサーバとなる(RS232Cの方式に合う)。


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

コネクション確立後、クライアントは次のコマンドでサーバにログインする。

LOGIN <username> <password>

ここで、<username>は、自分の名前(ソフト名)とする。
<username>は、空白を含まない32文字以内の7ビットASCII文字列とする。
<password>は、空白を含まない32文字以内の7ビットASCII文字列とする。
相手を特定して対局したい場合のため、パスワード機能を持つ(サーバプロトコルと互換も取れる)。

パスワード認証が成功した場合、サーバは

LOGIN:<username> OK

というメッセージでログインの完了をクライアントに伝える。
認証が失敗した場合は、

LOGIN:incorrect

というメッセージでログインの失敗を伝える。

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

LOGOUT

というコマンドを、対局が行われていない状態で送信することによって行う。サーバは、

LOGOUT:completed

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


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

ログイン後、クライアントはサーバによって対局の通知が行われるのを待つ。サーバはクライアントに、以下のようなメッセージで対局の開始を伝える。


BEGIN Game_Summary
Protocol_Version:1.1
Protocol_Mode:Direct
Format:Shogi 1.0
Declaration:Jishogi 1.1
Game_ID:20040505-CSA14-3-5-7
Name+:Sente_Name
Name-:Gote_Name
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
+
END Position
END Game_Summary


3.3.1. 対局の一般情報

開始する対局の情報は、'BEGIN Game_Summary' と書かれた行と、'END Game_Summary' と書かれた行の間に記述される。
この情報のうち、持時間情報と局面情報については、この中の下部階層に記述され、その他一般情報についてはこの階層に記述される。以下、一般情報として表される情報について述べる。

Protocol_Version: (必須)
このプロトコルのバージョン番号を表す。バージョン番号は、このプロトコル全体の書式を規定する。

Protocol_Mode: (必須:省略時はServer)
'Direct'の場合は、1対1対局であることを表す。
'Server' の場合は、審判サーバを経由する対局プロトコルであることを表す。
審判サーバのクライアントと1対1接続対局のクライアントは、この情報によって、相手が審判サーバか1対1接続の対戦相手であるかを自動認識することができる。

Format: (必須)
このプロトコルの、ゲーム種目に依存した情報の書式を識別する文字列を表す。具体的には、'BEGIN Position' の行で始まり、'END Position' の行で終わる階層の内部の書式と、指し手の表記方法を規定する。

Declaration: (省略時は情報なし)
ゲームのプレイ時、指し手以外の宣言に関する規定を示す文字列を表す。情報の意味は、Formatに記述された文字列に依存する。
'Jishogi 1.1' の記述がある場合、日本将棋連盟ルールに基づく、入玉による勝利宣言ルールが採用されることを示す。
現状では、この記述のみ許可されている。

Game_ID: (任意)※サーバプロトコルと異なる。
このゲームを識別するためのユニークな文字列を表す。
1対1接続対局では、必要なく、省略できる(この情報は使用されない)。

Name+, Name-: (必須)
先手、後手の対局者名を表す。
V1.0で認めていた省略形:'N+', 'N-'の表記は、混乱を防止するため、認めない。
1対1接続対局のサーバは、クライアントのログイン名を相手の対局者名とする。

Your_Turn: (必須)
このメッセージを受け取るクライアントの手番を表す。
選手権以外では、両対局者の対局者名が同じ場合があり得、その場合、この情報によって、どちらが手番であるかが決まる。

Rematch_On_Draw: (省略時はNO)
サーバプロトコルでは、このゲームの結果がドローであった場合に、自動的に再試合を行う場合はYES、そうでなければNOが記述される。
1対1接続対局では、実装を単純にするため、本情報は、常に省略することとする。

To_Move: (必須)
対局の開始直後に指す方の手番を示す。
対局が途中局面からの再開である場合は、再開直後の手番を示すので、常に先手番が示されるとは限らない。
手番は、開始局面でも指定しているので、指し手情報のない1対1接続対局では冗長になるが、サーバプロトコルと互換のため記述することとする。


3.3.2. 対局の持時間情報

開始する対局の持時間情報は、'BEGIN Time' と書かれた行と、'END Time' と書かれた行の間に記述され、対局者の持時間を表す。'Time' の階層に情報が書かれている場合は、全対局者が共通の持時間を用いる。手番ごとに個別の持時間を記述する場合は、それぞれ '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手の消費時間がこの数値以上になった場合は、時間切れとなる。

3.3.3. 対局の局面情報

開始する対局の局面情報は、'BEGIN Position' と書かれた行と、'END Position' と書かれた行の間に記述され、初期状態の局面を表す。この階層の書式は、Formatに記述された文字列によって識別される。ここでは、将棋の書式についてのみ述べる。
書式はCSAファイル形式に準拠した初期局面表記からなる。ただし、CSA標準棋譜ファイル形式(V2)は、書き方が多様過ぎるので、単純にするため、次のように制限する。

(1) 盤上の駒の配置
一括表現で、1段から9段までを順に記述する形式のみとする。

例:
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

(2) 持駒
"AL"は使用しない。
先手(下手)持駒、後手(上手)持駒を各1行に記述する。
持駒がないときは、持駒の表記は省略可能とする。

例:
P+00KIOOFU
P-00FU

(3) 指し手
サーバプロトコルと異なり、指し手情報は記述しない。
これは、1対1接続対局では、互いの正確な消費時間が不明なためである。
途中局面からの再開方法は、後述する。

3.4. 対局の合意

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

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

と書かれたコマンドを返す。
1対1接続対局では、<GameID>の情報は不要であり、省略していいし、記述があっても無視する(これは、以下も同様である)。
これをもって対局の合意が得られたとみなし、サーバは、

START[:<GameID>]

というメッセージをクライアントに送信し、対局状態に移行を宣言するとともに、最初に指し手を行うクライアントの消費時間の計測を開始する。
クライアントもこのコマンドを受信し、消費時間の計測を開始し、開始局面後の最初の手の思考を開始する。
クライアントが、対局条件を拒絶する場合は、

REJECT[ <GameID>]

と書かれたコマンドを返す。
REJECTコマンドを送信した場合、対局の合意が得られなかったとみなし、サーバは、対局条件送信前の状態に戻る。

3.5. 指し手と意思表示

両対局者は、対局開始メッセージのFormatで定義されたフォーマットに準拠したメッセージによって指し手を
表現する。ここでは、将棋の書式についてのみ述べる。
ここで定義する指し手表現は、おおむねCSAファイル形式で定義されたものを使用する。

3.5.1. 通常の指し手

通常の指し手の一例として

+7776FU

という文字列を送信する。
受信した対局者は、この文字列・指し手が合法であるか判定する。
千日手の判定も行う。

3.5.2. 対局を終了・中断させるコマンド

(a) 投了
投了によって対局の終了とする。コンピュータが負けと判断したならば、次の投了コマンドを送信し、対局を終了する。

%TORYO

詰ませても対局を終了せず、相手からの投了コマンドを待って対局を終了する。

(b) 千日手
自分の手番の局面において、千日手と判断された場合、次の千日手コマンドを送信し、対局を終了する(自動可)。

%SENNICHITE

相手の手番(自分が指した後)の局面における千日手を検出しても、受信を中断してはいけない。
千日手コマンドを受信した場合、対局を終了する。
どちらの場合も、その状態から再開できることが望ましい。

(c) 持将棋
持将棋と判断した場合、次の持将棋コマンドを送信し、対局を終了する(持将棋の判定は、試合のルールによる)。

%JISHOGI

(d) 入玉による勝ち
入玉し、一定の条件を満たしたとき、次のコマンドの送信で、勝ちを宣言できる(試合のルールによる)。

%KACHI

対局の一般情報の内部にある下記の記述がこのルールの使用を示す。

Declaration:Jishogi 1.1

--------------------------------
「入玉宣言勝ち」の条件(第13回選手権で使用のもの):

次の条件が成立する場合、勝ちを宣言できる(以下「入玉宣言勝ち」と云う)。
条件:
(a) 宣言側の手番である。
(b) 宣言側の玉が敵陣三段目以内に入っている。
(c) 宣言側が(大駒5点小駒1点の計算で)
・先手の場合28点以上の持点がある。
・後手の場合27点以上の持点がある。
・点数の対象となるのは、宣言側の持駒と敵陣三段目
以内に存在する玉を除く宣言側の駒のみである。
(d) 宣言側の敵陣三段目以内の駒は、玉を除いて10枚以上存在する。
(e) 宣言側の玉に王手がかかっていない。
(詰めろや必死であることは関係ない)
(f) 宣言側の持ち時間が残っている。(切れ負けの場合)
以上1つでも条件を満たしていない場合、宣言した方が負けとなる。
(注) このルールは、日本将棋連盟がアマチュアの公式戦で使用しているものである。

以上の宣言は、コンピュータが行い、画面上に明示する。
--------------------------------


(e) 中断
受信待ちの状態において、何らかの操作で強制的に対局を中断できるようにしなければならない。その際には、相手から中断コマンドが送られてきたときと同様の処理を行う。
中断は、次のコマンドを送信することによって行う。

%CHUDAN

対局を終了・中断させるコマンドの送・受信後、クライアントはLOGOUTし、コネクションを切断する。
コンピュータ同士の通信対局では、待った・中断を自動的に行ってはならない。

3.6. 再開の方法

途中局面から再開する場合、双方の消費時間は互いに自分のものしかわからない。
そのため、再開は次のように行う。
対局している両者で手数が異なるときは、進んでいる方の局面を戻し(戻した手の消費時間も戻す)、同一局面とする。
同一局面で中断している場合は、双方でその局面とする。
そこで、手番でない方(指し手を待つ方)がサーバとなり、接続待機する。
接続後、サーバがその局面の情報を送り、クライアント側は、局面が一致していることを確認し、思考後、指し手を送り、対局を再開する。
双方共、棋譜が残っていない場合は、双方で中断局面を作成し、審判と協議し、妥当と思われる消費時間で、上記手順で、再開を行う。
本プロトコルの対局の局面情報は、開始局面だけで、指し手情報はない

3.7. トラブル発生時の処理

ルール上指せない手や意味不明の文字列等が送られてきた場合には、送られてきた文字列を画面に表示し、中断処理を行う。


3.8. タイムライン

client server

1 LOGIN →
2 ← LOGIN:<username> OK
3 ← [対局条件]
4 AGREE →
5 ← START:
6 [指し手(初手)] →
7 ← [指し手(2手目)]

8 [投了] →
9 LOGOUT →
10 ← LOGOUT:completed


4. ケーブル、コネクタ

CSA の試合は、10BASE-T Ethernetによって構築されたネットワークが用いられる。
2台のコンピュータを直結する場合は、クロスケーブルを使用する。
HUBを使う場合は、ストレートケーブルを使用する。

5. プロトコル改定履歴

●2003年 9月 3日 V1.0

●2004年10月 7日 V1.1
V1.0 からの変更点
・対局者名の表記は、混乱を防止するため、'N+', 'N-'の表記を中止し、
Name+, Name-だけに。
・入玉による勝利宣言ルール
対局の局面情報から対局の一般情報へ移動し、Declaration:で宣言するように。
・以上の変更に合わせ、Protocol_Versionを 1.0 から 1.1 に。
===============================================