Skip to content

Instantly share code, notes, and snippets.

@ericridgeway
Last active June 28, 2019 12:56
Show Gist options
  • Save ericridgeway/1bfa2a3d10eba07075753507b5c3ab41 to your computer and use it in GitHub Desktop.
Save ericridgeway/1bfa2a3d10eba07075753507b5c3ab41 to your computer and use it in GitHub Desktop.
defmodule IslandsEngine.Game do
use GenServer
alias IslandsEngine.{Token, StateData}
#
# initialized
# new_game_player1
#
# waiting_p2
# add_player2
#
# placing_islands
# place_island
# set_islands
#
# player1_turn
# guess
# win_check
#
# player2_turn
# guess
# win_check
#
# winner
#
#
# Client
#
def start_link(name) do
GenServer.start_link(__MODULE__, name)
end
def player1_name(game) do
GenServer.call(game, {:main, :player1_name})
end
def add_player2(game, name) do
GenServer.call(game, {:main, {:add_player2, name}})
end
def player2_name(game) do
GenServer.call(game, {:main, :player2_name})
end
def place_island(game, player, shape, row, col) do
GenServer.call(game, {:main, {:place_island, player, shape, row, col}})
end
def has_island?(game, player, shape, row, col) do
GenServer.call(game, {:main, {:has_island?, player, shape, row, col}})
end
#
# Server
#
def init(p1_name) do
state_data =
StateData.new()
|> StateData.add_player1(p1_name)
{:ok, state_data}
end
def handle_call({:main, task}, _from, state_data) do
token = %Token{state_data: state_data}
case task do
:player1_name ->
%{token | msg: StateData.player1_name(state_data)}
|> reply_with_msg()
{:add_player2, name} ->
%{token | p2_name: name}
|> update_player2()
|> reply_with_msg()
:player2_name ->
%{token | msg: StateData.player2_name(state_data)}
|> reply_with_msg()
{:place_island, player, shape, row, col} ->
%{token | place_island: {player, shape, row, col}}
|> do_place_island()
|> reply_with_msg()
{:has_island?, player, shape, row, col} ->
%{token | msg: StateData.has_island?(token.state_data, player, shape, row, col)}
|> reply_with_msg
end
end
defp update_player2(%{state_data: state_data, p2_name: p2_name} = token) do
%{token |
state_data: StateData.add_player2(state_data, p2_name),
msg: :ok,
}
end
defp do_place_island(%{state_data: state_data, place_island: {player, shape, row, col}} = token) do
# Board.placeisland...
%{token |
# state_data: StateData.placeisland....
msg: :ok,
}
end
defp reply_with_msg(%{msg: msg, state_data: state_data}) do
{:reply, msg, state_data}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment