bin
precompiled binariesserver
code for the mahjong serverapi
python api code to interact with the serverml
files related to rl algorithm
Starts on localhost port 8000
, change this by setting the PORT
env variable.
All API requests return JSON
GET /
Server index.
Status Code 200
{
message: string
version: string
games_started: int
new_game: url
}
- GET /new
Create a new game, returns the game id and the location.
Status Code 201
{
message: string
id: int
location: url
}
- GET /game/<id>
View the human readable game state.
Status Code 200
{
has_ended: bool
state_name: string
prevalent_wind: string
active_players: []int
active_discard: string
players: string -> {
actions: string -> string
score: int
wind: string
received: string
concealed: []string
exposed: []string
discarded: []string
}
wall: []string
}
- POST /game/<id>
Update the game state. Requires POST data to contain a map with as keys the players (0-indexed)
required to perform an action in the current state and as values the index of the action to be performed by that player.
Status Code 202
{
message: string
id: int
location: url
}
Status Code 400 (In case an incorrect action was sent)
{
error: string
status_code: int
}
- GET /game/<id>/player/<player>
View the human readable player state. This contains only part of the state that
is visible to the selected player.
Status Code 200
{
actions: string -> string
prevalent_wind: string
discarding_player: int
active_discard: string
score: int
wind: string
received: string
concealed: []string
exposed: []string
discarded: []string
other_players: string -> {
score: int
wind: string
exposed: []string
discarded: []string
}
}
- GET /game/<id>/player/<player>?vec=1
View the vectorized player state.
Status Code 200
{
score: int 1
bonus_tiles: []int 1x8
prevalent_wind: []int 1x4
player_wind: []int 1x4
discarding_player: []int 1x3
active_discard: []int 1x3 [tile]
received_tile: []int 1x3 [tile]
concealed_tiles: [][]int 13x3 [tile]
exposed_chows: [][][]int 4x3x3 [tile]
exposed_pungs: [][]int 4x3 [tile]
exposed_kongs: [][]int 4x3 [tile]
hidden_kongs: [][]int 4x3 [tile]
discards: [][]int 40x3 [tile]
right_player_score: int 1
right_player_bonus_tiles: []int 1x8
right_player_wind: []int 1x4
right_player_exposed_chows: [][][]int 4x3x3 [tile]
right_player_exposed_pungs: [][]int 4x3 [tile]
right_player_exposed_kongs: [][]int 4x3 [tile]
right_player_discards: [][]int 40x3 [tile]
opposite_player_score: int 1
opposite_player_bonus_tiles: []int 1x8
opposite_player_wind: []int 1x4
opposite_player_exposed_chows: [][][]int 4x3x3 [tile]
opposite_player_exposed_pungs: [][]int 4x3 [tile]
opposite_player_exposed_kongs: [][]int 4x3 [tile]
opposite_player_hidden_kongs: [][]int 4x3 [tile]
opposite_player_discards: [][]int 40x3 [tile]
left_player_score: int 1
left_player_bonus_tiles: []int 1x8
left_player_wind: []int 1x4
left_player_exposed_chows: [][][]int 4x3x3 [tile]
left_player_exposed_pungs: [][]int 4x3 [tile]
left_player_exposed_kongs: [][]int 4x3 [tile]
left_player_hidden_kongs: [][]int 4x3 [tile]
left_player_discards: [][]int 40x3 [tile]
}
Tested with python 3.7.