Exercício 6

OC 1999/2000 (Exercícios Práticos)


Enunciado

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.


Solução

-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

OC 1999/2000 (Exercícios Práticos)