RosettaCodeData/Task/Penneys-game/Elixir/penneys-game.elixir

58 lines
1.5 KiB
Plaintext

defmodule Penney do
@toss [:Heads, :Tails]
def game(score \\ {0,0})
def game({iwin, ywin}=score) do
IO.puts "Penney game score I : #{iwin}, You : #{ywin}"
[i, you] = @toss
coin = Enum.random(@toss)
IO.puts "#{i} I start, #{you} you start ..... #{coin}"
{myC, yC} = setup(coin)
seq = for _ <- 1..3, do: Enum.random(@toss)
IO.write Enum.join(seq, " ")
{winner, score} = loop(seq, myC, yC, score)
IO.puts "\n #{winner} win!\n"
game(score)
end
defp setup(:Heads) do
myC = Enum.shuffle(@toss) ++ [Enum.random(@toss)]
joined = Enum.join(myC, " ")
IO.puts "I chose : #{joined}"
{myC, yourChoice}
end
defp setup(:Tails) do
yC = yourChoice
myC = (@toss -- [Enum.at(yC,1)]) ++ Enum.take(yC,2)
joined = Enum.join(myC, " ")
IO.puts "I chose : #{joined}"
{myC, yC}
end
defp yourChoice do
IO.write "Enter your choice (H/T) "
choice = read([])
IO.puts "You chose: #{Enum.join(choice, " ")}"
choice
end
defp read([_,_,_]=choice), do: choice
defp read(choice) do
case IO.getn("") |> String.upcase do
"H" -> read(choice ++ [:Heads])
"T" -> read(choice ++ [:Tails])
_ -> read(choice)
end
end
defp loop(myC, myC, _, {iwin, ywin}), do: {"I", {iwin+1, ywin}}
defp loop(yC, _, yC, {iwin, ywin}), do: {"You", {iwin, ywin+1}}
defp loop(seq, myC, yC, score) do
append = Enum.random(@toss)
IO.write " #{append}"
loop(tl(seq)++[append], myC, yC, score)
end
end
Penney.game