O jodo Detetive-Assassino-Vítima
É um jogo comum na infância da maioria das crianças. A brincadeira consiste em formar um grupo de crianças para jogar, dispondo-as em círculo. Pequenos pedaços de papel dobrado são distribuídos, tendo-se o cuidado de haver o mesmo número de papéis e de integrantes. Todavia, em apenas um pedaço de papel deve estar escrito ASSASSINO, e em apenas um outro deve estar DETETIVE. Nos restantes deve-se escrever VÍTIMA. O ASSASSINO tem a função de matar todos os integrantes do círculo, mas deve tomar cuidado para que o DETETIVE não o descubra, pois, se isso acontecer, o DETETIVE deve acusar o ASSASSINO. O ASSASSINO mata as suas vítimas ao olhar para elas e piscar um dos olhos. O papel das VÍTIMAS é só esperar a hora de serem mortas, e quando isso acontece, elas devem dizer a todos os demais: “Morri”. Se o ASSASSINO matar todos ou se o DETETIVE descobrir quem é o ASSASSINO a brincadeira acaba.
O projeto
A ideia é fazer a brincadeira de detetive-assassino-vítima usando um sistema distribuído. Basicamente haverão 4 processos distintos, que deverão funcionar em máquinas distintas, mas trocando mensagens entre si. A figura abaixo ilustra a arquitetura do sistema. Note que alguns métodos já estão especificados na figura e descritos logo abaixo. Você está OBRIGADO a implementá-los, sem fugir da arquitetura proposta. Podem haver mais métodos, mas nenhum dos métodos especificados abaixo pode deixar de ser implementado.
Há um servidor do jogo, a quem cabe a maior parte dos papéis. Quando o jogo se inicia, ele deve executar o método distributeRoles().
distributeRoles(): ler as informações dos jogadores de um arquivo (contendo o host da máquina de cada um dos jogadores), sortear o papel de cada um dos jogadores (apenas um assassino e apenas um detetive) e enviar, para cada uma das máquinas, o seu respectivo papel.
threaten(player): apenas o assassino pode executar, remotamente, este método. Registra quem é o jogador que está sendo, atualmente, ameaçado pelo assassino.
suspect(player): apenas o detetive pode executar, remotamente, este método. Identifica que jogador está atualmente sob suspeita do detetive.
accuse(): apenas o detetive pode executar, remotamente, este método. Verifica quem está sendo o suspeito (se não houver nenhum suspeito identificado ainda, o o detetive não pode executar este método) e, se o suspeito é efetivamente o assassino. Em caso positivo, encerra-se o jogo indicando a todos que o vencedor é o detetive. Caso contrário o assassino.
blink(): apenas o assassino pode executar, remotamente, este método. Verifica quem está sendo ameaçado atualmente (se não houver, ainda, ninguém sob ameaça, o assassino não pode executar este método) e o mata, exceto se tratar-se do detetive. Neste caso o jogo é encerrado, com vitória do detetive. Caso o assassino esteja sob suspeita do detetive (veja método suspect acima), o detetive deve receber uma mensagem "denunciando" o assassino, e quem ele acabou de matar. Caso o detetive não vença, então a vítima deve ser excluída do jogo, e caso o número de jogadores restantes seja menor ou igual a 3, o jogo é encerrado com vitória do assassino. No caso de um assassinato bem sucedido, se este assassinato não significar a vitória do assassino, então é todos os jogadores devem ser informados da vítima que acabou de morrer.
Os métodos, em pseudo-código, estão relatados abaixo.
distributeRoles()
playersList = readPlayers()
randomRules(playersList)
for each player P in playersList
r = playersList.role()
setRole(role) //sends for each player its role
suspect(player)
suspected = player
threaten(player)
threatened = player
accuse()
if suspected.role = "killer"
endGame(detective)
else
endGame(killer)
blink()
if threatened.role = "detective"
endGame(detective)
else
if this.isSuspected() //this player is currently suspected by the detective
blinked(detective) //tell to detective the killer blinked someone
else
playersList.remove(threatened)
if playersList.size <= 3
endGame(killer)
else
for each player P in playersList
isDead(player)//inform the player is dead
Equipes de no mínimo 1 e no máximo 2 pessoas.
Devem ser formadas espontaneamente até a meia-noite do dia 31/05/2017, por e-mail para degas at uesc dot br. Os que eventualmente não estejam em nenhuma equipe espontaneamente formada até esta data serão colocados em equipes formadas compulsoriamente.
Equipes formadas espontaneamente
José Carlos da Silva Adão / Thales Santos Souza
João Victor Dias Costa - 201410874 / José Augusto Santos Rodrigues - 201310051
André Rodrigo - Matrícula 201410883 / Laís Santana - Matrícula 201120048
Eva Maia / Philiphe Kramer
Samuel Santos Alves - 201210075 / Bruna O. Hermenegildo - 201320038
Adonias Alcântara - Rafael Ribeiro Oliveira
Alberto Segundo / Jonathan Queiroz
Equipes formadas compulsoriamente
DANIEL QUEIROZ DOS SANTOS / KAIQUE SILVA PEDROSO
MAGNO MACIEL DAS NEVES