49 lines
1.3 KiB
Elixir
49 lines
1.3 KiB
Elixir
defmodule Rock_paper_scissors do
|
|
def play, do: loop([1,1,1])
|
|
|
|
defp loop([r,p,s]=odds) do
|
|
IO.gets("What is your move? (R,P,S,Q) ") |> String.upcase |> String.first
|
|
|> case do
|
|
"Q" -> IO.puts "Good bye!"
|
|
human when human in ["R","P","S"] ->
|
|
IO.puts "Your move is #{play_to_string(human)}."
|
|
computer = select_play(odds)
|
|
IO.puts "My move is #{play_to_string(computer)}"
|
|
case beats(human,computer) do
|
|
true -> IO.puts "You win!"
|
|
false -> IO.puts "I win!"
|
|
_ -> IO.puts "Draw"
|
|
end
|
|
case human do
|
|
"R" -> loop([r+1,p,s])
|
|
"P" -> loop([r,p+1,s])
|
|
"S" -> loop([r,p,s+1])
|
|
end
|
|
_ ->
|
|
IO.puts "Invalid play"
|
|
loop(odds)
|
|
end
|
|
end
|
|
|
|
defp beats("R","S"), do: true
|
|
defp beats("P","R"), do: true
|
|
defp beats("S","P"), do: true
|
|
defp beats(x,x), do: :draw
|
|
defp beats(_,_), do: false
|
|
|
|
defp play_to_string("R"), do: "Rock"
|
|
defp play_to_string("P"), do: "Paper"
|
|
defp play_to_string("S"), do: "Scissors"
|
|
|
|
defp select_play([r,p,s]) do
|
|
n = :rand.uniform(r+p+s)
|
|
cond do
|
|
n <= r -> "P"
|
|
n <= r+p -> "S"
|
|
true -> "R"
|
|
end
|
|
end
|
|
end
|
|
|
|
Rock_paper_scissors.play
|