通信プロトコル - peria/SosuDaifugo GitHub Wiki
通信プロトコル
- TCP/IP で接続する
- 接続が切れた場合の再接続は考慮しない
- メッセージは改行文字(LF)区切りでやり取りする単位とする
- 各メッセージは JSON フォーマットを使う
- 全体としてのやり取りは以下のようになる
- 接続確認
- ゲーム設定の共有
- ゲーム毎にループ
- ゲーム初期設定
- 各プレイヤーのプレイ (ループ)
- 終了時のゲーム情報
- 複数ゲームの合計統計値の結果報告
以下、やり取りするメッセージの詳細を記載する。読みやすさのため、本来メッセージは改行なしでやりとりするが、ここでは改行を含めて記載する。
接続確認
- Player → Server 名前を伝える
{"name": "Euler"}
- 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"
は自分の初期手札リスト。各カードの表記法については別記。
ゲーム進行
- 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"
は現在場の一番上に置かれているカード。
- 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
}