Packages
hangman_text_client
0.1.78
0.1.87
0.1.86
0.1.85
0.1.84
0.1.83
0.1.82
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
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
Text client for the Hangman Game.
Current section
Files
Jump to
Current section
Files
lib/hangman/text/client/prompter.ex
defmodule Hangman.Text.Client.Prompter do
@moduledoc """
Prompts a player for a move.
"""
alias IO.ANSI.Plus, as: ANSI
alias Hangman.Text.Client.{Player, State}
@doc """
Accepts a player's move.
"""
@spec accept_move(State.t()) :: State.t() | no_return
def accept_move(%State{} = state) do
IO.gets("Your guess (or stop): ") |> check_input(state)
end
## Private functions
# "Player's input"
@typep input :: String.t() | {:error, atom} | :eof
@spec check_input(input, State.t()) :: State.t() | no_return
defp check_input({:error, reason}, state) do
Player.end_game(state, [:light_yellow, "Game ended: #{inspect(reason)}."])
end
defp check_input(:eof, state) do
Player.end_game(state, [:light_yellow, "Looks like you gave up somehow."])
end
defp check_input(input, state) do
case String.trim(input) do
"stop" ->
Player.end_game(state, [:light_yellow, "Looks like you gave up."])
<<byte>> = guess when byte in ?a..?z ->
put_in(state.guess, guess)
_bad_input ->
ANSI.puts([:light_yellow, "Please enter a letter between a and z.\n"])
accept_move(state)
end
end
end