Desenvolva um conjunto de funções em Erlang que permita a dois utilizadores jogarem o jogo da "pedra, tesoura e papel".
O jogo desenrola-se da seguinte forma: cada um dos jogadores escolhe um objecto (pedra, tesoura ou papel) e informa o árbitro da sua escolha. O objecto escolhido por cada jogador não é conhecido do outro. Por sua vez o árbitro é responsável pelo resultado, que é calculado em função da combinação dos objectos escolhidos:
O jogador que escolher o objecto vencedor, recebe uma mensagem de vitória, o outro de derrota. Em caso de empate, ambos recebem uma mensagem de empate.
-module(exercicio6).
-export([start/1, jogada/1, arbitro/0]).
start(Where) ->
spawn( Where, ?MODULE, arbitro, [] ).
arbitro() ->
register( arbitro, self() ),
arbitro_process().
arbitro_process() ->
receive
{ jogada, Jogador_1, Object_1} -> ok
end,
receive
{ jogada, Jogador_2, Object_2} -> ok
end,
case { Object_1, Object_2 } of
{ A, A } ->
empate( Jogador_1, Jogador_2 );
{ tesoura, papel } ->
ganha( Jogador_1, Jogador_2 );
{ pedra, tesoura } ->
ganha( Jogador_1, Jogador_2 );
{ papel, pedra } ->
ganha( Jogador_1, Jogador_2 );
_ ->
ganha( Jogador_2, Jogador_1 )
end,
arbitro_process().
empate( Jogador_1, Jogador_2 ) ->
Jogador_1 ! { resultado, empate },
Jogador_2 ! { resultado, empate }.
ganha( Jogador_Vitorioso, Jogador_Derrotado ) ->
Jogador_Vitorioso ! { resultado, vitoria },
Jogador_Derrotado ! { resultado, derrota }.
% interface do utilizador
jogada( Object ) ->
{arbitro, ?ARBITRO_NO } ! { jogada, self(), Object },
receive
{ resultado, Resultado } -> Resultado;
_ -> error
end.
Última actualização: 04-04-2000