Islands Engine v0.1.9 Islands.Engine View Source

Models an Islands game.

Based on the book Functional Web Development by Lance Halvorsen.

Link to this section Summary

Functions

Adds the second player of a game

Allows a player to guess a coordinate

Positions an island on a player’s board

Declares all islands set for a player

Returns the tally of a game for a given player

Link to this section Functions

Link to this function add_player(player1_name, player2_name, player2_pid) View Source
add_player(String.t(), String.t(), pid()) :: Islands.Engine.Tally.t()

Adds the second player of a game.

Examples

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> her = self()
iex> {:ok, game_id} = Engine.new_game("Romeo", him)
iex> tally = Engine.add_player("Romeo", "Juliet", her)
iex> %Tally{
...>   game_state: :players_set,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_not_set,
...>   request: {:add_player, "Juliet", player2_pid},
...>   response: {:ok, :player2_added},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> board == Grid.new() and guesses == Grid.new() and
...> player2_pid == her and is_pid(game_id)
true
Link to this function end_game(player1_name) View Source
end_game(String.t()) :: :ok

Ends a game.

Examples

iex> alias Islands.Engine
iex> me = self()
iex> Engine.new_game("Ben", me)
iex> Engine.end_game("Ben")
:ok
Link to this function guess_coord(player1_name, player_id, row, col) View Source
guess_coord(
  String.t(),
  Islands.Engine.Game.player_id(),
  Islands.Engine.Coord.row(),
  Islands.Engine.Coord.col()
) :: Islands.Engine.Tally.t()

Allows a player to guess a coordinate.

## Examples

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> her = self()
iex> {:ok, game_id} = Engine.new_game("Caesar", him)
iex> Engine.add_player("Caesar", "Cleopatra", her)
iex> Engine.position_island("Caesar", :player2, :atoll, 1, 1)
iex> Engine.position_island("Caesar", :player2, :l_shape, 3, 7)
iex> Engine.position_island("Caesar", :player2, :s_shape, 6, 2)
iex> Engine.position_island("Caesar", :player2, :square, 9, 5)
iex> Engine.position_island("Caesar", :player2, :dot, 9, 9)
iex> Engine.set_islands("Caesar", :player2)
iex> tally = Engine.guess_coord("Caesar", :player1, 9, 9)
iex> %Tally{
...>   game_state: :players_set,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_set,
...>   request: {:guess_coord, :player1, 9, 9},
...>   response: {:error, :islands_not_set},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> board == Grid.new() and guesses == Grid.new() and is_pid(game_id)
true

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> her = self()
iex> {:ok, game_id} = Engine.new_game("Tristan", him)
iex> Engine.add_player("Tristan", "Isolde", her)
iex> Engine.position_island("Tristan", :player2, :atoll, 1, 1)
iex> Engine.position_island("Tristan", :player2, :l_shape, 3, 7)
iex> Engine.position_island("Tristan", :player2, :s_shape, 6, 2)
iex> Engine.position_island("Tristan", :player2, :square, 9, 5)
iex> Engine.position_island("Tristan", :player2, :dot, 9, 9)
iex> Engine.set_islands("Tristan", :player2)
iex> Engine.position_island("Tristan", :player1, :atoll, 1, 1)
iex> Engine.position_island("Tristan", :player1, :l_shape, 3, 7)
iex> Engine.position_island("Tristan", :player1, :s_shape, 6, 2)
iex> Engine.position_island("Tristan", :player1, :square, 9, 5)
iex> Engine.position_island("Tristan", :player1, :dot, 9, 9)
iex> Engine.set_islands("Tristan", :player1)
iex> tally = Engine.guess_coord("Tristan", :player1, 9, 9)
iex> %Tally{
...>   game_state: :player2_turn,
...>   player1_state: :islands_set,
...>   player2_state: :islands_set,
...>   request: {:guess_coord, :player1, 9, 9},
...>   response: {:hit, :dot, :no_win},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> is_map(board) and is_map(guesses) and is_pid(game_id)
true
Link to this function new_game(player1_name, player1_pid) View Source
new_game(String.t(), pid()) :: Supervisor.on_start_child()

Starts a new game.

Examples

iex> alias Islands.Engine
iex> me = self()
iex> {:ok, game_id} = Engine.new_game("Meg", me)
iex> {:error, {:already_started, ^game_id}} = Engine.new_game("Meg", me)
iex> is_pid(game_id)
true
Link to this function position_all_islands(player1_name, player_id) View Source
Link to this function position_island(player1_name, player_id, island_type, row, col) View Source
position_island(
  String.t(),
  Islands.Engine.Game.player_id(),
  Islands.Engine.Island.type(),
  Islands.Engine.Coord.row(),
  Islands.Engine.Coord.col()
) :: Islands.Engine.Tally.t()

Positions an island on a player’s board.

Examples

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> her = self()
iex> him = self()
iex> {:ok, game_id} = Engine.new_game("Bonnie", her)
iex> Engine.add_player("Bonnie", "Clyde", him)
iex> tally = Engine.position_island("Bonnie", :player2, :atoll, 1, 1)
iex> %Tally{
...>   game_state: :players_set,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_not_set,
...>   request: {:position_island, :player2, :atoll, 1, 1},
...>   response: {:ok, :island_positioned},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> is_map(board) and guesses == Grid.new() and is_pid(game_id)
true
Link to this function set_islands(player1_name, player_id) View Source
set_islands(String.t(), Islands.Engine.Game.player_id()) ::
  Islands.Engine.Tally.t()

Declares all islands set for a player.

Examples

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> her = self()
iex> {:ok, game_id} = Engine.new_game("Adam", him)
iex> Engine.add_player("Adam", "Eve", her)
iex> Engine.position_island("Adam", :player2, :atoll, 1, 1)
iex> tally = Engine.set_islands("Adam", :player2)
iex> %Tally{
...>   game_state: :players_set,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_not_set,
...>   request: {:set_islands, :player2},
...>   response: {:error, :not_all_islands_positioned},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> is_map(board) and guesses == Grid.new() and is_pid(game_id)
true

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> her = self()
iex> him = self()
iex> {:ok, game_id} = Engine.new_game("Mary", her)
iex> Engine.add_player("Mary", "Joseph", him)
iex> Engine.position_island("Mary", :player2, :atoll, 1, 1)
iex> Engine.position_island("Mary", :player2, :l_shape, 3, 7)
iex> Engine.position_island("Mary", :player2, :s_shape, 6, 2)
iex> Engine.position_island("Mary", :player2, :square, 9, 5)
iex> Engine.position_island("Mary", :player2, :dot, 9, 9)
iex> tally = Engine.set_islands("Mary", :player2)
iex> %Tally{
...>   game_state: :players_set,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_set,
...>   request: {:set_islands, :player2},
...>   response: {:ok, :islands_set},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> is_map(board) and guesses == Grid.new() and is_pid(game_id)
true
Link to this function stop_game(player1_name, player_id) View Source
stop_game(String.t(), Islands.Engine.Game.player_id()) ::
  Islands.Engine.Tally.t()

Stops a game.

Examples

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> her = self()
iex> {:ok, game_id} = Engine.new_game("Tarzan", him)
iex> Engine.add_player("Tarzan", "Jane", her)
iex> Engine.position_island("Tarzan", :player2, :atoll, 1, 1)
iex> Engine.position_island("Tarzan", :player2, :l_shape, 3, 7)
iex> Engine.position_island("Tarzan", :player2, :s_shape, 6, 2)
iex> Engine.position_island("Tarzan", :player2, :square, 9, 5)
iex> Engine.position_island("Tarzan", :player2, :dot, 9, 9)
iex> Engine.set_islands("Tarzan", :player2)
iex> tally = Engine.stop_game("Tarzan", :player2)
iex> %Tally{
...>   game_state: :players_set,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_set,
...>   request: {:stop, :player2},
...>   response: {:error, :not_both_players_islands_set},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> is_map(board) and guesses == Grid.new() and is_pid(game_id)
true

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> her = self()
iex> {:ok, game_id} = Engine.new_game("Napoleon", him)
iex> Engine.add_player("Napoleon", "Josephine", her)
iex> Engine.position_island("Napoleon", :player2, :atoll, 1, 1)
iex> Engine.position_island("Napoleon", :player2, :l_shape, 3, 7)
iex> Engine.position_island("Napoleon", :player2, :s_shape, 6, 2)
iex> Engine.position_island("Napoleon", :player2, :square, 9, 5)
iex> Engine.position_island("Napoleon", :player2, :dot, 9, 9)
iex> Engine.set_islands("Napoleon", :player2)
iex> Engine.position_island("Napoleon", :player1, :atoll, 1, 1)
iex> Engine.position_island("Napoleon", :player1, :l_shape, 3, 7)
iex> Engine.position_island("Napoleon", :player1, :s_shape, 6, 2)
iex> Engine.position_island("Napoleon", :player1, :square, 9, 5)
iex> Engine.position_island("Napoleon", :player1, :dot, 9, 9)
iex> Engine.set_islands("Napoleon", :player1)
iex> tally = Engine.stop_game("Napoleon", :player1)
iex> %Tally{
...>   game_state: :game_over,
...>   player1_state: :islands_set,
...>   player2_state: :islands_set,
...>   request: {:stop, :player1},
...>   response: {:ok, :stopping},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> is_map(board) and guesses == Grid.new() and is_pid(game_id)
true
Link to this function tally(player1_name, player_id) View Source
tally(String.t(), Islands.Engine.Game.player_id()) :: Islands.Engine.Tally.t()

Returns the tally of a game for a given player.

Examples

iex> alias Islands.Engine
iex> alias Islands.Engine.{Grid, Tally}
iex> him = self()
iex> {:ok, game_id} = Engine.new_game("Jim", him)
iex> tally = Engine.tally("Jim", :player1)
iex> %Tally{
...>   game_state: :initialized,
...>   player1_state: :islands_not_set,
...>   player2_state: :islands_not_set,
...>   request: {},
...>   response: {},
...>   board: board,
...>   guesses: guesses
...> } = tally
iex> board == Grid.new() and guesses == Grid.new() and is_pid(game_id)
true