Packages
islands_engine
0.1.7
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.13
0.2.12
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.0
Models the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/engine/game.ex
defmodule Islands.Engine.Game do
@moduledoc false
@behaviour Access
use PersistConfig
alias __MODULE__
alias Islands.Engine.{Board, Coord, Guesses, Player, State}
@enforce_keys [:player1, :player2]
defstruct player1: nil,
player2: nil,
request: {},
response: {},
state: State.new()
@type player_id :: :player1 | :player2
@type request :: tuple
@type response :: tuple
@type t :: %Game{
player1: Player.t(),
player2: Player.t(),
request: request,
response: response,
state: State.t()
}
@player_ids Application.get_env(@app, :player_ids)
# Access behaviour
defdelegate fetch(game, key), to: Map
defdelegate get(game, key, default), to: Map
defdelegate get_and_update(game, key, fun), to: Map
defdelegate pop(game, key), to: Map
@doc """
Returns a new Islands game.
## Examples
iex> alias Islands.Engine.Game
iex> Game.new("Mr. Smith").state.game
:initialized
"""
@spec new(String.t()) :: t
def new(player1_name) when is_binary(player1_name) do
%Game{player1: Player.new(player1_name), player2: Player.new("?")}
end
@spec update_board(t, player_id, Board.t()) :: t
def update_board(%Game{} = game, player_id, %{} = board)
when player_id in @player_ids do
put_in(game[player_id].board, board)
end
@spec update_guesses(t, player_id, Guesses.type(), Coord.t()) :: t
def update_guesses(%Game{} = game, player_id, hit_or_miss, %Coord{} = guess)
when player_id in @player_ids and hit_or_miss in [:hit, :miss] do
update_in(game[player_id].guesses, &Guesses.add(&1, hit_or_miss, guess))
end
@spec update_player2_name(t, String.t()) :: t
def update_player2_name(%Game{} = game, name) when is_binary(name) do
put_in(game.player2.name, name)
end
@spec update_player_pid(t, player_id, pid) :: t
def update_player_pid(%Game{} = game, player_id, pid)
when player_id in @player_ids and is_pid(pid) do
put_in(game[player_id].pid, pid)
end
@spec notify_player(t, player_id) :: t
def notify_player(%Game{} = game, player_id) when player_id in @player_ids do
send(game[player_id].pid, game.state.game)
game
end
@spec player_board(t, player_id) :: Board.t()
def player_board(%Game{} = game, player_id) when player_id in @player_ids do
game[player_id].board
end
@spec opponent(player_id) :: player_id
def opponent(:player1), do: :player2
def opponent(:player2), do: :player1
@spec update_state(t, State.t()) :: t
def update_state(%Game{} = game, %State{} = state) do
put_in(game.state, state)
end
@spec update_request(t, request) :: t
def update_request(%Game{} = game, request) when is_tuple(request) do
put_in(game.request, request)
end
@spec update_response(t, response) :: t
def update_response(%Game{} = game, response) when is_tuple(response) do
put_in(game.response, response)
end
end