Anton Shestakov <engored@ya.ru>, Sun, 02 Mar 2014 17:39:33 +0900
Use state record for room.
src/rps_room.erl
Permissions: -rw-r--r--
-import(rps3, [get_rules/0, winning_hand/1]). -record(state, {players=[], choices=[]}). % winner for 3 players is: % rock, rock, rock -> undefined % rock, paper, scissors -> undefined % rock, paper, paper -> undefined % rock, rock, paper -> {paper, Who} winner(Choices) when length(Choices) > 1 -> PlayersByHand = lists:foldl( dict:append(Hand, Who, Acc) end, dict:new(), Choices), WHand = winning_hand([Hand || {Hand, _} <- Choices]), WHand =:= undefined -> []; WHand =/= undefined -> dict:fetch(WHand, PlayersByHand) 1 -> {WHand, hd(Players)}; room(Players) when is_list(Players) -> lists:foreach(fun(Player) -> Player ! start end, Players), room(#state{players=Players}); room(#state{players=Players, choices=Choices}) when length(Players) =:= length(Choices) -> Winner = winner(Choices), lists:foreach(fun(Player) -> Player ! Msg end, Players), room(State=#state{choices=Choices}) -> ObjectIsOk = lists:any(fun(X) -> X =:= Hand end, get_rules()), ChoiceMade = lists:keymember(Who, 2, Choices), case ObjectIsOk andalso not ChoiceMade of room(State#state{choices=[{Hand, Who}|Choices]}); io:format("~w picks ~w, not allowed.~n", [Who, Hand]),