通信プロトコル - peria/SosuDaifugo GitHub Wiki

通信プロトコル

  • TCP/IP で接続する
    • 接続が切れた場合の再接続は考慮しない
  • メッセージは改行文字(LF)区切りでやり取りする単位とする
  • 各メッセージは JSON フォーマットを使う
  • 全体としてのやり取りは以下のようになる
    1. 接続確認
    2. ゲーム設定の共有
    3. ゲーム毎にループ
      1. ゲーム初期設定
      2. 各プレイヤーのプレイ (ループ)
      3. 終了時のゲーム情報
    4. 複数ゲームの合計統計値の結果報告

以下、やり取りするメッセージの詳細を記載する。読みやすさのため、本来メッセージは改行なしでやりとりするが、ここでは改行を含めて記載する。

接続確認

  1. Player → Server 名前を伝える
{"name": "Euler"}
  1. Player ← Server 通じたことの ack。伝えられた name を返す。
{"name": "Euler"}

ゲーム設定の共有

Player ← Server 複数回ゲームを行う中で共通の情報について通知する。

{
  "version": "1.0",
  "rules": { ... },
  "players": 4
}

"version" は通信プロトコルのバージョン。変更があれば変わっていく。基本的に下位互換。 "rules" は変更可能なルールの記載。記載の無い項目についてはデフォルトルールが適用される。 "players" はゲームプレイする人数。

ゲーム初期設定

Player ← Server 今回のゲームでの情報を通知する。

{
  "player_id": 1,
  "cards": ["CA", "C4", "D5", "H", "C7", "JO", "SQ", "HJ", "D4", "S2", "DT"]
}

"player_id" は自分の手番が何番目かを示す。 [0, players) の範囲の整数になる。 "cards" は自分の初期手札リスト。各カードの表記法については別記。

ゲーム進行

  1. Player ← Server ゲーム進捗を伝える。
{
  "plays": [
    {"cards": ["D7"], "hand": 10},  // プレイヤー 0 の情報
    {"cards": ["HQ", "H2", "D2", "S3"], "hand": 7},  // プレイヤー 1 の情報
    {"cards": ["D2"], "hand": 10},  // プレイヤー 2 (=自分) の情報
    {"cards": ["H6", "C2", "D3"], "hand": 8}  // プレイヤー 3 の情報
  ],
  "field": "HQ"
}

"plays" は前回の自分のターンからのプレイヤーの提出状況を示す。 i 番目の要素は player_id が i のプレイヤーの情報。 "cards" は使ったカード、"hand" はそのプレイヤーの現在の手札枚数を示す。 "field" は現在場の一番上に置かれているカード。

  1. Player → Server どういう手を打つか伝える。

TBD: Joker の情報についての表記法

TBD: 素因数分解の中の指数表記法

{
  "cards": ["SA", "CT", "HK"],  // 11013 になる
  "factors": ["S3"], ["H3", "D6", "C7", "DA"](/peria/SosuDaifugo/wiki/"S3"],-["H3",-"D6",-"C7",-"DA"),  // 11013 = 3 x 3671
}