ここに書いてある情報は開発中のため、変更される恐れがあります。
全国高等専門学校第30 回プログラミングコンテストで使われた回答システムを参考に製作
参考ページ
競技部門・データ書式に関する情報を公開しました
簡易回答システムを公開しました!
ここに書いてあるExample ResponsBody
は成功したときのレスポンスである。
リクエストが間違っていた場合などは、コード:400で、Bodyに以下のようなエラーメッセージが入ったレスポンスが帰ってくる。
{
"error":errorMessage
}
POST /users/regist
{
"screenName":"高専太郎",
"name":"nit-taro"
"password":"password"
}
screenName
:表示名、好きな名前を指定できるname
:ユーザネーム、固有password
:パスワード
{
"screenName": "高専太郎",
"name": "nit-taro",
"id": "565b5b1e-a2c7-4769-a6ed-332a917f4fff",
"password": "password"
}
id
:ユーザ固有のID。ユーザネームはあとから変更できるが、IDは変更不可(ユーザーネーム変更APIは未実装)GET /users/show/:(userId or userName or 無し)
userId
またはuserName
で指定したユーザの情報を取得することができる。
指定しないと、全ユーザの情報が配列で帰ってくる。
{
"screenName": "高専太郎",
"name": "nit-taro",
"id": "565b5b1e-a2c7-4769-a6ed-332a917f4fff"
}
POST /users/delete
{
"name": "nit-taro",
"id": "565b5b1e-a2c7-4769-a6ed-332a917f4fff",
"password": "password"
}
name
またはid
:どちらかを指定。どちらも指定した場合はid
が優先されるpassword
:アカウント登録時に設定したパスワードを指定レスポンスはなし。
POST /match
name
とspec
をBodyに含めてリクエストすると、playerId
とroomId
が取得できる。
{
"name": "nit-taro",
"id": "565b5b1e-a2c7-4769-a6ed-332a917f4fff",
"password": "password",
"spec":"human",
"useAi": true,
"aiOption": {
"aiName": "a1"
}
}
Name | Type | Discription |
---|---|---|
name |
string | ユーザネーム。id とどちらかは指定しなければならない |
id |
string | ユーザID。name とどちらかは指定しなければならない |
password 必須 |
string | ユーザのパスワード |
spec 任意 |
string | スペック(任意、ゲームには影響しない) |
gameId 任意 |
string | 参加するゲームID |
useAi 任意 |
boolean | 対AI戦を利用するかどうか |
aiOption.aiName 任意 |
string | 対AI戦を利用する場合に使用するAI名(useAiがtrueの場合は必須パラメータ) |
aiOption.boardName 任意 |
string | 対AI戦を利用する場合に使用するボード名 |
{
"userId": "e848248b-0182-4433-8b6e-9d17fd65d816",
"spec": "test",
"accessToken": "ed2b135c-2c46-488e-8453-562272ed0fe3",
"gameId": "734bdd48-7b16-4f52-89b5-fda3f631df62",
"index":0,
}
userId
:ユーザID(リクエストでname
のみ送信した場合にもユーザIDが帰ってくる)accessToken
:行動(Action)するときに必要なトークンgameId
:ゲームID。試合情報を取得するときにはこのIDを使用する。index
:自身がplayer1かplayer2かを判別用(試合情報のplayers配列番号)GET /match/:gameId
gameId
が分かれば、誰でも試合状態を取得することができる。
{
"gameId":"8c080c7b-286f-4407-82e2-4d6e8cd06b61",
"gaming":false,
"ending":false,
"board":{
"width":10,
"height":10,
"nAgent":8,
"nPlayer":2,
"nTurn": 30,
"nSec": 1,
"points":[
12,3,5,3,1,1,3,5,3,12,
3,5,7,5,3,3,5,7,5,3,
5,7,10,7,5,5,7,10,7,5,
3,5,7,5,3,3,5,7,5,3,
1,3,5,3,12,12,3,5,3,1,
1,3,5,3,12,12,3,5,3,1,
3,5,7,5,3,3,5,7,5,3,
5,7,10,7,5,5,7,10,7,5,
3,5,7,5,3,3,5,7,5,3,
12,3,5,3,1,1,3,5,3,12
]
},
"startedAtUnixTime":1597162330,
"nextTurnUnixTime":1597162333,
"turn":0,
"totalTurn":30,
"tiled":[
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],
[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1]
],
"players":[
{
"id":"3678abbc-1249-4b4a-90e8-b75a5688fe47",
"agents":[
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1}
],
"point":{
"basepoint":0,
"wallpoint":0
},
"tilePoint":null,
"areaPoint":null
},
{
"id":"3678abbc-1249-4b4a-90e8-b75a5688fe47",
"agents":[
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1},
{"x":-1,"y":-1}
],
"point":{
"basepoint":0,
"wallpoint":0
},
"tilePoint":null,
"areaPoint":null
}
],
"log": [
[
{
"point": {
"basepoint": 0,
"wallpoint": 5
},
"actions": [
{
"agentId": 0,
"type": 1,
"x": 1,
"y": 1,
"res": 0
}
]
},
{
"point": {
"basepoint": 0,
"wallpoint": 0
},
"actions": []
}
]
]
}
gameId
:ゲームIDgaming
:ゲーム中かどうかending
:ゲーム終了したかどうかboard
:ボード情報(両プレイヤーが揃ったら開示。揃ってない時にはnull)
width
:フィールドの横幅height
:フィールドの縦幅nAgent
:エージェントの数nPlayer
:ゲームに参加しているプレイヤー人数points
:フィールドのポイント配列(1次元配列)startedAtUnixTime
:ゲームのスタート時間nextTurnUnixTime
:次のターンまでの時間turn
:現在のターン数totalTurn
:総ターン数(非推奨、代わりにboard.nTurnを使用)tiled
:タイル配置状況配列(1次元配列)
players
:各プレイヤー状況
id
:ユーザIDagents
:各エージェント状況
x
:x座標y
:y座標tilePoint
:タイルポイントareaPoint
:領域ポイントlog
:ログ
points
basepoint
wallpoint
actions
agentId
:エージェント IDtype
:行動の種類,1:配置, 2:停留, 3:移動, 4:除去x
:x座標y
:y座標res
:行動の適応状況,0:成功, 1:競合, 2:REVERT, 3:同じエージェントに対して複数のアクションを同時に送った, 4:ERR_ILLEGAL_AGENT, 5:ERR_ILLEGAL_ACTIONPOST /match/:RoomID/action
各アクションを送信できる。
matchで取得できるaccessToken
をヘッダーAuthorization
に含める必要がある。
{
actions:[
{ "agentId": 0, "type": "PUT", "x": 1, "y": 1},
{ "agentId": 1, "type": "MOVE", "x": 2, "y": 2}
]
}
agentId
:エージェント IDtype
:行動の種類,"PUT":配置, “MOVE”:移動, “REMOVE”:除去, “STAY”:停留x
:x座標y
:y座標
{
"receptionUnixTime": 1597323035,
"turn": 1
}
receptionUnixTime
:サーバ受理時刻(タイムラグなどの判定に使える?)turn
:Actionが実行されるターン数/pingにトークンを付けてアクセスすることで トークン がプログラムからサーバーに 正しく送られているかを確認できます。
後ほど…