Trabalho de Sistemas Operacionais Distribuídos e de Redes - 1998/2

Versão de 05/nov/1998

- O mundo é formado por uma matriz de células, com N linhas e N colunas.
- Cada célula pode conter zero ou um obstáculo (árvore, água, rocha, etc).
- Cada célula que não contém obstáculo pode conter:
           - Um jogador carregando entre zero e dez ovos;
           - Zero ou mais ovos no chão.
- A cada momento, cada jogador está localizado em exatamente uma célula.
- A cada momento, cada jogador está voltado para exatamente uma direção.
- O campo de visão do jogador corresponde às seguintes células:

      . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . .
      . . . . . o o o o o . . . . .
      . . . . . o o o o o . . . . .
      . . . . . o o ^ o o . . . . .
      . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . .

- As células visíveis ao jogador são rotuladas com relação ao jogador:

      2E2   2E1  2C0  2D1   2D2
      1E2   1E1  1C0  1D1   1D2
      0E2   0E1  0C0  0D1   0D2

- O "Tempo no Mundo" avança em ticks indivisíveis, correspondendo a T milisegundos cada.
- A cada tick cada jogador pode fazer somente uma das ações abaixo:
        - Pegar um ovo que está na célula que ele habita;
        - Virar para a esquerda;
        - Virar para a direita;
        - Avançar uma casa;
        - Recuar uma casa;
        - Jogar o ovo na célula indicada por yZx, onde:
             - Z pode ser "E" , "C" ou "D";
             - x e y podem variar entre 0 e 4.
- Quando um ovo é jogado na célula X, existem três possibilidades:
             - A célula X contém um obstáculo, o ovo é destruído;
             - A célula X contém um jogador, o ovo é destruído;
             - A célula X não contém obstáculo nem jogador, o ovo passa a fazer parte da célula X.
- Para cada jogador J são mantidas duas estatísticas:
             - Número de ovos jogados por J que acertaram outros jogadores;
             - Número de ovos jogados por outros jogadores que acertaram J.
- Dentro do mesmo tick, as ações são processadas na ordem em que foram descritas acima.
- Conflitos de movimento são resolvidos de maneira aleatória. Por exemplo, dois jogadores querem
avançar para a mesma célula, no mesmo tick.

 
Protocolo Cliente-Servidor

- Mensagem do Cliente para o Servidor:
 <número do jogador><comando>

Comandos a disposição do cliente:
 "C"- cria um novo jogador;
 "P" - pega um ovo que está na célula;
 "E" - vira para a esquerda;
 "D"- vira para a direita;
 "A"- avança uma casa;
 "R" - recua uma casa;
 "JyZx"- joga um ovo na célula indicada por yZx.

- Mensagem do Servidor para o Cliente:
 <número do jogador><número do tick><comando realizado><visão><estatística>

Onde <número do jogador> são dois dígitos decimais.
Onde <número do tick> são dez dígitos decimais.
Onde <comando realizado> é a letra do comando, maiúscula para sucesso e minúscula para erro.
Onde <visão> é:
M[0E2] M[0E1] M[0C0] M[0D1] M[0D2]
M[1E2] M[1E1] M[1C0] M[1D1] M[1D2]
M[2E2] M[2E1] M[2C0] M[2D1] M[2D2]

Onde M[xxx] é "##" para vazio, "XX" para obstáculo, "OO" para ovo e "JN" ou "JE" ou "JW" ou
"JS" para jogador, conforme a direção para a qual ele está voltado, com relação ao jogador que
recebe a mensagem. No caso da célula [0C0], é usado "OO" para célula com ovos ou "JN" para
célula sem ovos.

Onde <estatística> é
    "+" <número de ovos a favor> "-" < número de ovos contra>"@"<quantidade de ovos>

Questões a serem abordadas no Trabalho 1

Grupo 1:
Representação do mundo:Quais estruturas de dados utilizar para representar o "Estado do Mundo"
Escalabilidade: Como projetar o servidor para que passe de 10 jogadores iniciais para 100.000
jogadores, através da adição de mais recursos de hardware, porém sem modificar sua estrutura e os
seus protocolos.

Grupo 2:
Confiabilidade: Como projetar o servidor para que o "Estado do Mundo" não seja perdido no caso
de falha  de uma máquina servidora.
Disponibilidade: Como projetar o servidor para que o jogo continue mesmo que ocorra falha de uma
máquina servidora.

Grupo 3:
Desempenho: Como projetar o servidor para que o seu desempenho possa melhorar (ticks mais
rápidos) através da adição de mais recursos de hardware.
Segurança: Como projetar o servidor para que um cliente não possa enviar comandos em nome de
outro cliente.