Packages
islands_score
0.1.21
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.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.3
0.1.2
0.1.1
A score struct and functions for the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/score.ex
# ┌───────────────────────────────────────────────────────────────────────┐
# │ Inspired by the book "Functional Web Development" by Lance Halvorsen. │
# └───────────────────────────────────────────────────────────────────────┘
defmodule Islands.Score do
@moduledoc """
Creates a `score` struct for the _Game of Islands_.
##### Inspired by the book [Functional Web Development](https://pragprog.com/book/lhelph/functional-web-development-with-elixir-otp-and-phoenix) by Lance Halvorsen.
"""
alias __MODULE__
alias Islands.{Board, Game, Island, Player, PlayerID}
@player_ids [:player1, :player2]
@derive [Poison.Encoder]
@derive Jason.Encoder
@enforce_keys [:name, :gender, :hits, :misses, :forested_types]
defstruct [:name, :gender, :hits, :misses, :forested_types]
@type t :: %Score{
name: String.t(),
gender: Player.gender(),
hits: non_neg_integer,
misses: non_neg_integer,
forested_types: [Island.type()]
}
@spec board_score(Game.t(), PlayerID.t()) :: t
def board_score(%Game{} = game, player_id) when player_id in @player_ids do
player = game[player_id]
board = player.board
new(player, board)
end
@spec guesses_score(Game.t(), PlayerID.t()) :: t
def guesses_score(%Game{} = game, player_id) when player_id in @player_ids do
opponent = game[Game.opponent_id(player_id)]
board = opponent.board
new(opponent, board)
end
## Private functions
@spec new(Player.t(), Board.t() | nil) :: t
defp new(player, nil) do
%Score{
name: player.name,
gender: player.gender,
hits: 0,
misses: 0,
forested_types: []
}
end
defp new(player, board) do
%Score{
name: player.name,
gender: player.gender,
hits: Board.hits(board),
misses: Board.misses(board),
forested_types: Board.forested_types(board)
}
end
end