-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBackendServer.jl
83 lines (73 loc) · 2.13 KB
/
BackendServer.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using Oxygen
import HTTP
include("MCTS.jl")
game_count = 0
game_pool = Dict()
mutable struct Game
id::Int64
state::HexState
ai::MCTS
function Game()
state = HexState(copy(empty_board), 1)
global game_count += 1
game = new(game_count, state, MCTS())
@info "Create Game[id=$(game.id)]"
game_pool[game_count] = game
return game
end
end
function take_action!(game::Game, action::Action)
game.state = take_action(game.state, action)
end
function kill!(game::Game)
@info "Delete Game[id=$(game.id)]"
delete!(game_pool, game.id)
end
function play!(game::Game, action::Action)
@info "Player played at $action"
take_action!(game, action)
winner, gameover = check(game.state.board, action)
if gameover
@info "Gameover, Winner: $winner"
kill!(game)
return Dict("gameover" => true, "winner" => winner)
end
action, detail = search!(game.ai, game.state, action)
@info "AI played at $action"
@debug "AI search detail: $detail"
take_action!(game, action)
winner, gameover = check(game.state.board, action)
if gameover
@info "Gameover Winner: $winner"
kill!(game)
end
return Dict("gameover" => gameover, "winner" => winner, "action" => collect(action))
end
@post "/play" function (req::HTTP.Request)
data = json(req)
if haskey(data, "id") && haskey(game_pool, data["id"])
game = game_pool[data["id"]]
return play!(game, tuple(data["action"]...))
end
return Dict("msg" => "Error.")
end
@post "/new" function (req::HTTP.Request)
data = json(req)
game = Game()
if !data["you_are_black"]
action = (6, 6)
take_action!(game, action)
return Dict("id" => game.id, "gameover" => false, "action" => collect(action))
end
Dict("id" => game.id, "gameover" => false)
end
@get "/kill" function (req::HTTP.Request)
data = queryparams(req)
if haskey(data, "id") && haskey(game_pool, data["id"])
kill!(game_pool[data["id"]])
return Dict("msg" => "Success.")
end
return Dict("msg" => "Error.")
end
# # start the web server
serve()