Packages
islands_engine
0.2.13
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/board/score.ex
defmodule Islands.Engine.Board.Score do
@moduledoc "Convenience module for client applications."
use PersistConfig
alias __MODULE__
alias Islands.Engine.Game.Tally
alias Islands.Engine.{Board, Game, Island}
alias Islands.Engine
@enforce_keys [:type, :hits, :misses, :forested]
defstruct [:type, :hits, :misses, :forested]
@type t :: %Score{
type: :board_side | :guesses_side,
hits: non_neg_integer,
misses: non_neg_integer,
forested: [Island.type()]
}
@player_ids Application.get_env(@app, :player_ids)
@spec board_side(String.t(), Game.player_id()) :: t
def board_side(game_name, player_id)
when is_binary(game_name) and player_id in @player_ids do
new(game_name, player_id, :board_side)
end
@spec guesses_side(String.t(), Game.player_id()) :: t
def guesses_side(game_name, player_id)
when is_binary(game_name) and player_id in @player_ids do
new(game_name, Game.opponent(player_id), :guesses_side)
end
## Private functions
@spec new(String.t(), Game.player_id(), atom) :: t
defp new(game_name, player_id, type) do
%Tally{board: board} = Engine.tally(game_name, player_id)
%Board{islands: islands, misses: misses} = board
%Score{
type: type,
hits:
islands
|> Map.values()
|> Enum.map(&MapSet.size(&1.hits))
|> Enum.sum(),
misses: MapSet.size(misses),
forested:
islands
|> Map.values()
|> Enum.filter(&Island.forested?/1)
|> Enum.map(& &1.type)
}
end
end