#rps.erl -module(rps). -export([play_game/1, get_random_symbol/0]).
rps.erl
-module(rps).
-export([play_game/1, get_random_symbol/0]).
get_symbol(1) -> rock;
get_symbol(2) -> paper;
get_symbol(3) -> scissors.
get_random_symbol() ->
get_symbol(rand:uniform(3)).
play_game(InputFunctions) ->
Score = [{win, 0}, {loss, 0}, {tie, 0}],
play_game(Score, InputFunctions).
play_game(ok, _) ->
ok;
play_game(Score, {Player1Input, Player2Input}) ->
display_score(Score),
Input1 = Player1Input(),
Continue = Input1 =/= quit,
Input2 = Player2Input(Continue),
NewScore = compare_results(Input1, Input2, Score),
play_game(NewScore, {Player1Input, Player2Input}).
compare_results(quit, _, _) ->
ok;
compare_results(_, quit, _) ->
ok;
compare_results(Same, Same, [Wins, Losses, {tie, Ties}]) ->
[Wins, Losses, {tie, Ties+1}];
compare_results(rock, paper, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(paper, scissors, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(scissors, rock, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(rock, scissors, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(scissors, paper, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(paper, rock, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties].
display_score([{win, Wins}, {loss, Losses}, {tie, Ties}]) ->
io:format("Player1 Wins: ~B~nPlayer2 Wins: ~B~nTies: ~B~n", [Wins, Losses, Ties]).
#rpsgame.erl #!/usr/bin/env escript %% -- erlang -- %%! -pa 'ebin/' -import(rps, [play_game/1, get_random_symbol/0]).
rpsgame.erl
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -pa 'ebin/'
-import(rps, [play_game/1, get_random_symbol/0]).
main(_) ->
GetPlayerInput = fun() ->
io:format("Enter rock, paper, scissors, or quit~n"),
case io:get_line("> ") of
"rock\n" -> rock;
"paper\n" -> paper;
"scissors\n" -> scissors;
_ -> quit
end
end,
GetCompInput = fun(Continue) when Continue =:= false ->
ok;
(_) ->
Input = rps:get_random_symbol(),
io:format("Computer threw ~p~n", [Input]),
Input
end,
play_game({GetPlayerInput, GetCompInput}).
#rps.erl -module(rps). -export([play_game/1, get_random_symbol/0]).
get_symbol(1) -> rock;
get_symbol(2) -> paper;
get_symbol(3) -> scissors.
get_random_symbol() ->
get_symbol(rand:uniform(3)).
play_game(InputFunctions) ->
Score = [{win, 0}, {loss, 0}, {tie, 0}],
play_game(Score, InputFunctions).
play_game(ok, _) ->
ok;
play_game(Score, {Player1Input, Player2Input}) ->
display_score(Score),
Input1 = Player1Input(),
Continue = Input1 =/= quit,
Input2 = Player2Input(Continue),
NewScore = compare_results(Input1, Input2, Score),
play_game(NewScore, {Player1Input, Player2Input}).
compare_results(quit, _, _) ->
ok;
compare_results(_, quit, _) ->
ok;
compare_results(Same, Same, [Wins, Losses, {tie, Ties}]) ->
[Wins, Losses, {tie, Ties+1}];
compare_results(rock, paper, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(paper, scissors, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(scissors, rock, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(rock, scissors, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(scissors, paper, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(paper, rock, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties].
display_score([{win, Wins}, {loss, Losses}, {tie, Ties}]) ->
io:format("Player1 Wins: ~B~nPlayer2 Wins: ~B~nTies: ~B~n", [Wins, Losses, Ties]).
#rpsgame.erl #!/usr/bin/env escript %% -- erlang -- %%! -pa 'ebin/' -import(rps, [play_game/1, get_random_symbol/0]).
main(_) ->
GetPlayerInput = fun() ->
io:format("Enter rock, paper, scissors, or quit~n"),
case io:get_line("> ") of
"rock\n" -> rock;
"paper\n" -> paper;
"scissors\n" -> scissors;
_ -> quit
end
end,
GetCompInput = fun(Continue) when Continue =:= false ->
ok;
(_) ->
Input = rps:get_random_symbol(),
io:format("Computer threw ~p~n", [Input]),
Input
end,
play_game({GetPlayerInput, GetCompInput}).
rps.erl
-module(rps).
-export([play_game/1, get_random_symbol/0]).
get_symbol(1) -> rock;
get_symbol(2) -> paper;
get_symbol(3) -> scissors.
get_random_symbol() ->
get_symbol(rand:uniform(3)).
play_game(InputFunctions) ->
Score = [{win, 0}, {loss, 0}, {tie, 0}],
play_game(Score, InputFunctions).
play_game(ok, _) ->
ok;
play_game(Score, {Player1Input, Player2Input}) ->
display_score(Score),
Input1 = Player1Input(),
Continue = Input1 =/= quit,
Input2 = Player2Input(Continue),
NewScore = compare_results(Input1, Input2, Score),
play_game(NewScore, {Player1Input, Player2Input}).
compare_results(quit, _, _) ->
ok;
compare_results(_, quit, _) ->
ok;
compare_results(Same, Same, [Wins, Losses, {tie, Ties}]) ->
[Wins, Losses, {tie, Ties+1}];
compare_results(rock, paper, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(paper, scissors, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(scissors, rock, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(rock, scissors, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(scissors, paper, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(paper, rock, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties].
display_score([{win, Wins}, {loss, Losses}, {tie, Ties}]) ->
io:format("Player1 Wins: ~B~nPlayer2 Wins: ~B~nTies: ~B~n", [Wins, Losses, Ties]).
rpsgame.erl
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -pa 'ebin/'
-import(rps, [play_game/1, get_random_symbol/0]).
main(_) ->
GetPlayerInput = fun() ->
io:format("Enter rock, paper, scissors, or quit~n"),
case io:get_line("> ") of
"rock\n" -> rock;
"paper\n" -> paper;
"scissors\n" -> scissors;
_ -> quit
end
end,
GetCompInput = fun(Continue) when Continue =:= false ->
ok;
(_) ->
Input = rps:get_random_symbol(),
io:format("Computer threw ~p~n", [Input]),
Input
end,
play_game({GetPlayerInput, GetCompInput}).
Simple Rock Paper Scissors in Erlang
I'm very new to Erlang and I'm specifically interested in making my Erlang idiomatic (in other words, can you tell I don't know Erlang from this code?) and removing code duplication. I am not as interested in performance or the UI of the "game."
This is a simple interactive Rock, Paper, Scissors game and I've been using erlc rps.erl && ./rps-main.erl
to run it.
#rps.erl -module(rps). -export([play_game/1, get_random_symbol/0]).
get_symbol(1) -> rock;
get_symbol(2) -> paper;
get_symbol(3) -> scissors.
get_random_symbol() ->
get_symbol(rand:uniform(3)).
play_game(InputFunctions) ->
Score = [{win, 0}, {loss, 0}, {tie, 0}],
play_game(Score, InputFunctions).
play_game(ok, _) ->
ok;
play_game(Score, {Player1Input, Player2Input}) ->
display_score(Score),
Input1 = Player1Input(),
Continue = Input1 =/= quit,
Input2 = Player2Input(Continue),
NewScore = compare_results(Input1, Input2, Score),
play_game(NewScore, {Player1Input, Player2Input}).
compare_results(quit, _, _) ->
ok;
compare_results(_, quit, _) ->
ok;
compare_results(Same, Same, [Wins, Losses, {tie, Ties}]) ->
[Wins, Losses, {tie, Ties+1}];
compare_results(rock, paper, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(paper, scissors, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(scissors, rock, [Wins, {loss, Losses}, Ties]) ->
[Wins, {loss, Losses+1}, Ties];
compare_results(rock, scissors, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(scissors, paper, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties];
compare_results(paper, rock, [{win, Wins}, Losses, Ties]) ->
[{win, Wins+1}, Losses, Ties].
display_score([{win, Wins}, {loss, Losses}, {tie, Ties}]) ->
io:format("Player1 Wins: ~B~nPlayer2 Wins: ~B~nTies: ~B~n", [Wins, Losses, Ties]).
#rpsgame.erl #!/usr/bin/env escript %% -- erlang -- %%! -pa 'ebin/' -import(rps, [play_game/1, get_random_symbol/0]).
main(_) ->
GetPlayerInput = fun() ->
io:format("Enter rock, paper, scissors, or quit~n"),
case io:get_line("> ") of
"rock\n" -> rock;
"paper\n" -> paper;
"scissors\n" -> scissors;
_ -> quit
end
end,
GetCompInput = fun(Continue) when Continue =:= false ->
ok;
(_) ->
Input = rps:get_random_symbol(),
io:format("Computer threw ~p~n", [Input]),
Input
end,
play_game({GetPlayerInput, GetCompInput}).