Skip to main content
Code Review

Return to Question

Commonmark migration
Source Link

#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}).
Tweeted twitter.com/StackCodeReview/status/750692254029901824
Source Link

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}).
default

AltStyle によって変換されたページ (->オリジナル) /