じゃんけん2.0 プロトコル

LL Ring 2006 実行委員会

1. ラウンド

このじゃんけんには2 種類の通信者によって構成されます。

  • エージェント … 手を出して勝負をするもの
  • コーディネイタ … 対戦表を組み双方の手を仲介し勝敗を決めるもの

じゃんけんは手の繰り返しからなるラウンドを複数回実施することで行われます。 1 つのラウンドは3 つの状態、READY, FIGHT, MATCH で表現されます。

READY
ラウンド開始前。ルールと繰り返しの回数がコーディネイタからプレイヤーに通 知されます。
FIGHT
ラウンド実施中。コーディネイタから次の手の催促が直前の相手の手とともに 渡され、プレイヤーは次の手を返します。
MATCH

ラウンド終了後。ラウンドの終わった後。 これらの3 つの状態間の遷移規則は (遷移前の状態, コーディネイタのコマンド, 遷 移後の状態) で表すと次の3 つの規則で表されます。

  • (READY, 手の交換, FIGHT)
  • (FIGHT, 手の交換, FIGHT)
  • (FIGHT, ラウンド終結宣言, MATCH)

ラウンドの終了条件

  • 1 ラウンドには全体時間制約があります。
  • 1 ラウンドにはじゃんけん回数制約があります。
  • コーディネイタは、1 ラウンドの状態遷移を制御中に、 上記2 つの制約のどちらか一方の制約を満たさなくなった場合、ラウンド終了と判断します。
  • 全体時間制約によりラウンド終了と判断された場合、プロトコル中で指示され た予定じゃんけん回数より少ない回数のじゃんけん実施でありながら、ラウン ド終了のための状態遷移がはじまります。エージェントはこれに対応する必要があります。

2. プロトコル

2.1. セッション

TCP 接続一つに対しセッションという単位を割り当てます。 セッションはラウンドを複 数回実行するための容れもののような働きをします。 セッション内では一定の手順に したがって複数回のラウンドが繰返し実行されます。

2.2. 対戦の概要

コーディネイタを介した対戦は次の順に進みます。

  • 接続の確認
  • セッションの開始
  • ラウンド
  • 次のラウンド
  • セッションの終了→接続の切断

じゃんけんの状態は上記のラウンドの中の状態で表現されます。

2.2.1. 接続確認

セッションが開始するまでのシナリオには、コーディネイタがTCP 接続を開く場合と、 エージェントがTCP 接続を開く場合の2 つの場合があります。 違いは最初にメッセー ジを送るのがどちらかということです。 コーディネイタがTCP 接続を開く場合

  1. コーディネイタがTCP 接続を開きます。
  2. コーディネイタが HELLO を送ります。

エージェントがTCP 接続を開く場合

  1. エージェントがTCP 接続を開きます。
  2. エージェントが HELLO を送ります。
2.2.2. セッションの開始
  1. コーディネイタが INITIATE を送り、セッションの開始を要求します。
  2. エージェントが INITIATE を送り、セッションの開始が成立します。
2.2.3. ラウンド
  1. コーディネイタが READY を送り、ラウンドの準備を要求します。
  2. エージェントが READY を送り、ラウンドの準備が成立します。
  3. コーディネイタが CALL を送り、じゃんけんの手を要求します。
  4. エージェントが MOVE を送り、じゃんけんの手を返します。
  5. コーディネイタが RESULT を送り、相手の出した手を知らせます。
  6. コーディネイタからREADY で知らされた回数だけ 3-5 をこなすと、コーディネ イタは MATCH を送り、ラウンドの終了が成立します。
2.2.4. 次のラウンド

再びコーディネイタがラウンドを送れば、 一つのセッションのなかで複数のラウンドを 行なうことができます。

2.2.5. セッションの終了

コーディネイタは CLOSE を送ることでエージェントにセッションの終了を 通知できま す。 エージェント、コーディネイタは、TCP 切断によるセッション終了を検出する必要があり ます。 セッションは終了とされ、 ルールに従ってコーディネイタが勝敗判断をします (再開はしません)。 実際にはコーディネイタは、全体時間制約に達したら、 いきなりTCP セッションを切る かもしれません。:-)

2.3. 状態

TCP 接続が確立してから消失するまでをセッションと呼びます。 セッションには14 の 状態があります。

ESTABLISHED
TCP 接続が確立
C_HELLO
コーディネイタが HELLO を送った
A_HELLO
エージェントが HELLO を送った
C_INITIATION
コーディネイタが INITIATE を送った
INITIATED
エージェントが INITIATE に答えた
C_ROUND_READY
コーディネイタがラウンドの開始を要求した
ROUND_READY
エージェントがラウンドの開始を受け入れた
CALL
コーディネイタがじゃんけんの手をエージェントに求めた
MOVE
エージェントがじゃんけんの手を出した
RESULT_UPDATED
コーディネイタが相手の出した手を知らせた
MATCH
コーディネイタがラウンドの終了を通知した
C_CLOSE
コーディネイタがセッションの終了を通知した

セッションの状態はどちらかが送るコマンドによって遷移します。 セッションの状態規 則を (遷移前の状態, コマンド, 遷移後の状態) で表すと、 以下の16 個の規則にな ります。

  • (ESTABLISHED, Coordinator HELLO, C_HELLO)
  • (ESTABLISHED, Agent HELLO, A_HELLO)
  • (C_HELLO, Coordinator INITIATE, C_INITIATION)
  • (A_HELLO, Coordinator INITIATE, C_INITIATION)
  • (C_INITIATION, Agent INITIATE, INITIATED)
  • (INITIATED, Coordinator CLOSE, C_CLOSE)
  • (C_ROUND_READY, Agent READY, ROUND_READY)
  • (INITIATED, Coordinator READY, C_ROUND_READY)
  • (ROUND_READY, Coordinator CALL, CALL)
  • (ROUND_READY, Coordinator MATCH, MATCH)
  • (CALL, Agent MOVE, MOVE)
  • (MOVE, Coordinator RESULT, RESULT_UPDATED)
  • (RESULT_UPDATED, Coordinator CALL, CALL)
  • (RESULT_UPDATED, Coordinator MATCH, MATCH)
  • (MATCH, Coordinator READY, C_ROUND_READY)
  • (MATCH, Coordinator CLOSE, C_CLOSE)

3. コマンド

個々のコマンドについて説明します。 コマンドは1 行のテキストとして送られます。 行末は CR LF (0x0d 0x0a) です。

3.1. HELLO

HELLO
TCP 接続を開いた側が送ります。 コーディネイタが開いた場合もエージェントが開い た場合も書式は共通です。

引数

引数はありません。

3.2. Coordinator INITIATE

INITIATE session-id
コーディネイタがセッションの開始を送ります。

引数

session-id

一つの接続で複数のセッションを扱うためのセッションID です。 Coordinator INITIATE においてコーディネイタが発番します。これ以降の同一セッションな いでのコマンドでは第一引数として同じセッションID を用います。

3.3. Agent INITIATE

INITIATE session-id agent-name capacity
Coordinator INITIATE に対するエージェントの返答です。

引数

session-id
Coordinator INITIATE で指定されたセッションID です。
agent-name
エージェントが名乗る名前です。プロトコルでは用いられませんが表示などの ために送ります。
capatity
参加可能なルールの集合の識別子です。現時点で有効な値は 1 のみです。

3.4. Coordinator READY

READY session-id round-id iteration rule-id
ready はひとつのセッションで複数のラウンドを扱うためのメソッドです。 コーディネイ タから ready が通知されると ready 状態に戻ります。

引数

session-id
Coordinator INITIATE で指定されたセッションID です。
round-id
ラウンドを区別するためのID です。
iteration
1 ラウンドで一つのエージェントが何回手を出すかを指定する数値です。通信 状況によってこの回数のじゃんけんを行えない場合もあるので、ラウンドの終 了はこの iteration の値に依存することなく必ず Coordinator MATCH に従っ てください。
rule-id
このラウンドで用いるルールを表します。現時点で有効な値は 1 のみです。

3.5. Agent READY

READY session-id round-id
Coordinator READY に応えて、 エージェントがラウンドの準備完了を宣言するコマン ドです。

引数

session-id
Coordinator INITIATE で指定されたセッションID です。
round-id
Coordinator READY で指定されたラウンドID です。

3.6. Coordinator CALL

CALL session-id round-id
コーディネイタがエージェントに手の送信を要求するコマンドです。

引数

session-id
Coordinator INITIATE で指定されたセッションID です。
round-id
Coordinator READY で指定されたラウンドID です。

3.7. Agent MOVE

MOVE session-id round-id move
Coordinator CALL に応えて、 エージェントがコーディネイタに手を送信するコマンド です。 手は数字に符号化され、ぐー、ちょき、ぱー、はそれぞれ 1, 2, 3 に対応します。 move は 1, 2, 3 のいずれかでなければなりません。

引数

session-id
Coordinator INITIATE で指定されたセッションID です。
round-id
Coordinator READY で指定されたラウンドID です。
move
手です。

3.8. Coordinator RESULT update

RESULT session-id round-id previous-opposite-move

引数

previous-opposite-move
対戦相手からコーディネイタにAgent MOVE で送られた直前の相手の手です。 値はぐー、ちょき、ぱーを表す 1, 2, 3 のほかに無効な手を意味する 0 の場 合があります。

3.9. coordinator called MATCH

MATCH session-id round-id

引数

session-id
Coordinator INITIATE で指定されたセッションID です。
round-id
Coordinator READY で指定されたラウンドID です。

3.10. coordinator CLOSE

CLOSE session-id
セッションの終了を促します。

4. 字句規則

それぞれの識別子は次の字句規則に従います。:

session-id = word
round-id = word
rule-id = numeric
capacity = numeric
agent-name = word
move = DIGIT
previous-opposite-move = DIGIT
word = 1*32(ALPHA / DIGIT / "-" / "_" / ".")
numeric = 1*DIGIT
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

5. タイムアウト

プレイヤーからのレスポンスが一定時間内に返ってこない場合、タイムアウトとして扱 われることがあります。 タイムアウトがコーディネイタによって検出されるとコーディネ イタはTCP 接続を切ります。タイムアウトは5 秒とします。

6. TCP 接続

スループットをあげるために、 プレイヤーは複数のセッションを同時に張れることが 推奨されます。 具体的には5 個以上の接続ができることが期待されます。

Coordinator からの接続を待つサーバー型のエージェントはコーディネイタから来る 接続要求を、 5 個は受け入れられるのが望ましい挙動です。

Coordinator への接続を開始するクライアント型のエージェントは接続が5 個に満た ない場合、 コーディネイタへの接続を開くことが期待されます。

サーバー型、クライアント型いずれのエージェントの場合もタイムアウトなどの理由で、 すべての接続が切れた場合に再接続するための方法を用意しておかないと、 じゃん けんに参加できないために負けることがあります。


最終更新: 2006-08-14

Event/LL2006 じゃんけん2.0 (last edited 2006-08-19 11:40:27 by KeisukeUrago)