Skip to content

Instantly share code, notes, and snippets.

@acabreragnz
Last active October 25, 2017 01:33
Show Gist options
  • Save acabreragnz/99fc788e36f78ace00241fee04f681c2 to your computer and use it in GitHub Desktop.
Save acabreragnz/99fc788e36f78ace00241fee04f681c2 to your computer and use it in GitHub Desktop.
Rock Scissors Paper game in Elixir! (remember to wrap this inside a module)
@weapons ~w(rock scissors paper)a
def rps(user_choice) when is_binary(user_choice), do: is_valid_choice(String.to_atom(user_choice))
def rps(user_choice) when is_atom(user_choice), do: is_valid_choice(user_choice)
def rps(user_choice), do: {:lost, "Invalid type!"}
defp is_valid_choice(user_choice) when user_choice in @weapons, do: time_to_play(user_choice)
defp is_valid_choice(user_choice), do: {:lost, "Invalid choice!"}
defp time_to_play(user_choice) do
weapons = @weapons
computer_choice = Enum.random(weapons)
computer_choice_index = find_weapon_index(weapons, computer_choice)
user_choice_index = find_weapon_index(weapons, user_choice)
game_result = cond do
user_choice_index == computer_choice_index -> :draft
rem(user_choice_index + 1, 3) == computer_choice_index -> :win
true -> :lost
end
format_result_with_message(%{game_result: game_result, user_choice: user_choice, computer_choice: computer_choice})
end
defp find_weapon_index(weapons, choice) do
Enum.find_index(weapons, & &1 == choice)
end
defp format_result_with_message(%{game_result: game_result, user_choice: user_choice, computer_choice: computer_choice}) do
{game_result, result_message(user_choice, computer_choice)}
end
defp result_message(user_choice, computer_choice) do
"You: #{user_choice}, Computer: #{computer_choice}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment