Você está na página 1de 9

Instituto Superior Técnico, 2010/11 1

Batalha Naval
Projecto de Programação de Sistemas – MEEC / MEAer

Conteúdo
1 Introdução 2

2 Componentes do Jogo 2
2.1 Matriz de Quadrı́culas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 Navios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3 Servidor 4

4 Cliente 4

5 Mensagens trocadas entre cliente e servidor 5


5.1 Inscrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5.2 Disparar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5.3 Terminar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5.4 Recomeçar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5.5 Hall of Fame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.6 Estado do Jogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.7 Informação dos Clientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

6 Entrega e Visualização do Trabalho 8

Versões:

• V 1.2 [15 Nov].

O texto é escrito de acordo com a ortografia antiga.


2 Programação de Sistemas – MEEC / MEAer

1 Introdução
O bem conhecido jogo da Batalha Naval é um jogo para 2 jogadores, jogado com papel
e lápis na sua forma original. A história deste jogo antes da sua comercialização não é
fácil de coligir, dadas as múltiplas versões existentes na Web. Ao que parece foi inventado
por Clifford Von Wickler nos primeiros anos do século XX (ainda antes da 1a Guerra
Mundial), o qual nunca o patenteou. No entanto, outras versões apresentam o jogo já
em uso por militares franceses no mesmo perı́odo. O jogo foi comercializado em 1931
pela empresa Starex Novelty Co. sob o nome Salvo. Em 1943 a empresa Milton Bradley
Company voltou a comercializá-lo ainda como jogo de papel e lápis, e em 1967 como jogo
de tabuleiro.
No jogo Batalha Naval, cada jogador dispõe no inı́cio a sua frota numa matriz de
quadrı́culas com dimensão 10x10, tendo em atenção que entre os navios deve existir pelo
menos uma quadrı́cula de intervalo. As quadrı́culas livres representam água.
Os jogadores jogam alternadamente, sendo o objectivo de cada jogador adivinhar onde
se encontram os navios do adversário, i.e., onde se encontram todas as quadrı́culas ocu-
padas do adversário. No contexto do jogo, isto é referido como afundar os navios do
adversário. Na versão mais simples, quando chega a sua vez de jogar, o jogador identifica
a quadrı́cula para onde quer disparar fornecendo as respectivas coordenadas (e.g. B7 ).
O adversário, por sua vez, diz-lhe qual foi o resultado do disparo: tiro ou água (caso
a quadrı́cula pedida se encontre ocupada ou desocupada, respectivamente). No caso de
tiro, o adversário também indica o tipo de navio atingido. Quando a última quadrı́cula

de um navio é atingida, o respectivo jogador avisa tiro, navio ao fundo. O jogador


que consegue atingir todas as posições ocupadas do adversário em primeiro lugar, ganha
o jogo.
No projecto pretende-se implementar um servidor do jogo Batalha Naval, mas numa
variante solitária do jogo. O jogador utiliza o programa cliente para conectar-se ao servidor
e jogar, sendo que ao servidor se podem conectar vários clientes em simultâneo. No
entanto, cada cliente joga um jogo independente contra o servidor. Através do seu cliente,
o jogador apenas dispara, tentando adivinhar onde o servidor colocou a frota do seu
jogo. Neste caso, o objectivo do jogador é minimizar o número de jogadas com que adivinha
as posições dos navios. As 10 melhores pontuações (número mı́nimos de disparos) são
disponibilizadas num Hall of Fame mantido no servidor.

2 Componentes do Jogo
Os componentes do jogo consistem numa matriz de quadrı́culas e num conjunto de gráficos
que representam navios a ser dispostos na matriz.

2.1 Matriz de Quadrı́culas


A matriz tem dimensão 10x10, em que as linhas são identificadas por letras (A..J ) e as
colunas por números no intervalo 0..9 (ver Figura 1).
No jogo tradicional, cada jogador utiliza um par de matrizes, uma para dispôr a sua
frota e outra em que marca os resultados dos disparos que efectua, assinalando também
a posição dos navios adversários já afundados e quadrı́culas necessariamente desocu-
padas em seu redor - torna-se inútil efectuar disparos para estas posições que se sabem
desocupadas à partida.
Programação de Sistemas – MEEC / MEAer 3

Figura 1: Matriz de quadrı́culas.

Na implementação a realizar, são feitas algumas alterações ao modelo tradicional.


Assim, como em cada jogo só há uma frota mantida pelo servidor, este detém uma matriz
em que assinala as posições dos navios da sua frota. É também o servidor que mantém
a informação sobre os resultados dos disparos efectuados pelo cliente. Esta informação
pode ser consultada pelo cliente, também sob a forma de matriz.

2.2 Navios
Embora existam diversas variantes da Batalha Naval, será utilizada como referência uma
das versões mais populares, a qual define os navios apresentados na Tabela 1.

Tabela 1: Descrição dos navios.


Designação Quadrı́culas Ocupadas Gráfico Número de Navios
Submarino 1 4

Navio de 2 Canos 2 3

Navio de 3 Canos 3 2

Navio de 4 Canos 4 1

Porta-aviões 5 1

Ao serem colocados na matriz, os gráficos que representam os navios podem sofrer


rotações apenas em múltiplos de 90o . Assim, todos os navios podem ter 2 orientações
possı́veis, excepto os Submarinos (1 orientação) e Porta-aviões (4 orientações).
Os navios podem ser colocados em qualquer local dentro da matriz (linhas A a J,
colunas 0 a 9, inclusivé), mas deve ter-se em conta que os navios devem ser posicionados
por forma a que haja sempre pelo menos uma quadrı́cula de intervalo, incluindo nas
diagonais. O corpo docente fornecerá uma função para colocação dos navios na
matriz, que deverá ser utilizada para criar as posições iniciais de jogo.
4 Programação de Sistemas – MEEC / MEAer

3 Servidor
Para executar o servidor a partir da linha de comandos, para além do nome do executável,
o utilizador deve introduzir os seguintes argumentos:

• Porto de comunicação em que o servidor está à escuta.

• Raiz do gerador de números aleatórios, que deverá ser passada como parâmetro. A
função de cálculo é fornecida pelo corpo docente.

Exemplifica-se a linha de comandos em seguida:

BNavalS 40000 34

No projecto, o servidor aceita ligações dos clientes, jogando cada cliente um jogo in-
dependente dos demais. No inı́cio da sessão com um cliente, o servidor gera o posiciona-
mento da frota aleatoriamente.1 Após a fase de inicialização, o servidor recebe comandos
do cliente, sendo os comandos possı́veis os seguintes (ver abaixo a Secção 5).

• Inscrição: O cliente inscreve-se fornecendo um identificador na forma de uma cadeia


de caracteres.

• Disparar: O cliente pede para efectuar um disparo, fornecendo as coordenadas da


respectiva quadrı́cula.

• Terminar: O cliente pede para terminar a sua sessão.

• Recomeçar: O cliente pede para desistir do jogo corrente e começar novo jogo.

• Hall of Fame: O cliente pede ao servidor a informação do Hall of Fame. A tabela


de Hall of Fame contém as 10 melhores pontuações realizadas até ao momento (i.e.
os jogadores que conseguiram ganhar o jogo com o menor número de disparos),
indexadas pelo identificador fornecido pelo cliente através do comando de inscrição.

• Estado: O cliente pede ao servidor o estado do jogo actual.

• Informação dos Clientes: O cliente pede ao servidor a informação sobre todos os


clientes conectados nesse instante.

No final de cada jogo, o servidor avisa o cliente e começa automaticamente um novo


jogo.

4 Cliente
O programa cliente interage directamente com o jogador, redireccionando os comandos
introduzidos para o servidor e enviando para o terminal as respectivas respostas.
O cliente para o jogo será fornecido pelo corpo docente sob a forma de um
executável para as máquinas do laboratório da disciplina.
Para executar o programa cliente a partir da linha de comandos, para além do nome
do executável, o utilizador deve introduzir os seguintes argumentos:
1
Tal como já referido, as posições dos navios são inicializadas aleatoriamente, sendo a função de posi-
cionamento fornecida pelo corpo docente.
Programação de Sistemas – MEEC / MEAer 5

• Identificador do jogador: cadeia de caracteres de comprimento máximo igual a 8,


que podem ser letras ou dı́gitos no intervalo 0..9.

• Endereço IP do servidor.

• Porto de comunicação em que o servidor está à escuta.

Exemplifica-se a linha de comandos em seguida:

BNavalC Grilo01 192.168.4.2 40000

Nota: Um endereço IP é composto por 4 números entre 0 e 255, sem zeros à esquerda
e separados pelo ponto (”dot-notation”). Se o servidor residir na mesma máquina onde
reside o cliente, pode-se usar como endereço IP o 127.0.0.1.

No inı́cio da execução, o cliente conecta-se e inscreve-se automaticamente junto do


servidor. Após esta operação, apresenta uma linha de comandos ao jogador, podendo
receber os seguintes comandos a partir do teclado:

• dXY : Disparo em que XY representa o par de coordenadas na quadrı́cula alvo (e.g.,


dA3).

• t: Terminar sessão.

• r: Desistir do jogo corrente e começar novo jogo, sem desligar a sessão.

• h: Mostrar a informação do Hall of Fame.

• e: Mostrar o estado actual da matriz do jogo, indicando os resultados dos disparos


efectuados.

• c: Mostrar a informação de todos os clientes conectados.

5 Mensagens trocadas entre cliente e servidor


Neste projecto, o cliente e o servidor podem residir em máquinas distintas, comunicando
pela API sockets, seguindo o protocolo TCP/IP.
O comprimento das mensagens é fixo para cada tipo de mensagem (sempre indicado
no primeiro carácter), excepto para a resposta ao comando de pedido de Informação dos
Clientes.
O cliente envia ao servidor os comandos descritos nas secções seguintes. Todos os
comandos carecem de resposta por parte do servidor. O formato da resposta é também
indicado.
Nota: A avaliação do projecto é função, entre outros dados, dos comandos implemen-
tados. O grupo deve consultar a grelha na Secção 6.

5.1 Inscrição
O comando de Inscrição tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’i’.


6 Programação de Sistemas – MEEC / MEAer

• 8 Bytes: Cadeia de caracteres que identifica o jogador. Os caracteres válidos são


letras e dı́gitos no intervalo 0..9. Se a cadeia de tiver menos de 8 caracteres, o
remanescente é preenchido com espaços (carácter ASCII 32).

A resposta do servidor tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’i’.

5.2 Disparar
O comando de Disparar tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’d’.


• 1 Byte: Letra maiúscula no intervalo A..J, identificando a linha.
• 1 Byte: Dı́gito no intervalo 0..9, identificando a coluna.

A resposta do servidor tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’d’.


• 1 Byte: Resultado do disparo: ’t’ para tiro, ’/’ para água, ’n’ para tiro, navio
ao fundo e ’f’ para tiro, último navio foi ao fundo, terminou o jogo, começa novo
jogo.
• 1 Byte: Tipo de navio atingido. O valor deste campo deve respeitar a seguinte
convenção: valor 1 para submarino, 2 para navio de 2 canos, 3 para navio de 3
canos, 4 para navio de 4 canos e 5 para porta-aviões. O valor 0 é utilizado no caso
de o resultado do disparo ter sido ’/’.
• 1 Byte: Número de disparos efectuados até ao momento no presente jogo.

5.3 Terminar
O comando para Terminar a sessão tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’t’.

A resposta do servidor tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’t’.


• 1 Byte: Número mı́nimo de disparos para afundar a frota, conseguido em jogos
efectuados durante a sessão (o valor deve ser 0xFF no caso de nenhum jogo ter sido
ainda finalizado).

5.4 Recomeçar
O comando para Recomeçar tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’r’.

A resposta do servidor tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’r’.


Programação de Sistemas – MEEC / MEAer 7

5.5 Hall of Fame


O comando para pedir a informação do Hall of Fame tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’h’.

A resposta do servidor tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’h’.

• 1 Byte: Número n de entradas no Hall of Fame, com 1 ≤ n ≤ 10.

• nx9 Bytes: informação do Hall of Fame, que consiste em n entradas de 9 Bytes: 8


Bytes para o identificador do jogador e 1 Byte para a respectiva pontuação (número
mı́nimo de disparos).

Nota: As entradas do Hall of Fame são enviadas por ordem crescente do número mı́nimo
de disparos.

5.6 Estado do Jogo


O comando para pedir o estado actual do jogo tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’e’.

A resposta do servidor tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’e’.

• 1 Byte: Número de disparos efectuados até ao momento no presente jogo.

• 1 Byte: Número mı́nimo de disparos para afundar a frota, conseguido em jogos


efectuados durante a sessão (o valor deve ser 0xFF no caso de nenhum jogo ter sido
ainda finalizado).

• 100 Bytes: Estado de cada quadrı́cula: ’t’ para tiro, ’/’ para água, ’-’ para
desconhecido. A informação encontra-se estruturada linha-a-linha, por ordem al-
fabética da identificação da linha. As quadrı́culas de cada linha encontra-se orde-
nadas por número de coluna.

5.7 Informação dos Clientes


O comando para pedir a informação dos clientes conectados tem o formato seguinte:

• 1 Byte: Preenchido com a letra ’c’.

A resposta do servidor consiste num conjunto de mensagens, uma por cada cliente,
com o formato seguinte:

• 1 Byte: Preenchido com a letra ’c’.

• 1 Byte: Número de clientes conectados.

• nx15 Bytes: Informação dos n clientes conectados. Para cada cliente, a informação
consiste no seguinte:
8 Programação de Sistemas – MEEC / MEAer

– 8 Bytes: Cadeia de caracteres que identifica o jogador.


– 4 Bytes: Endereço IP do cliente.
– 2 Bytes: Porto TCP do cliente.
– 1 Byte: Melhor pontuação conseguida pelo cliente nos jogos efectuados durante
a sessão.

Nota: Assume-se que o número máximo de clientes conectados em simultâneo é 255.

6 Entrega e Visualização do Trabalho


Na avaliação do projecto aplicam-se as directivas listada nas páginas da disciplina sobre
a honestidade académica e sobre as regras de avaliação.

Grupos: O número de alunos num grupo é de 2. Esta é a dimensão aconselhada, dada


a dimensão e grau de dificuldade do trabalho. Grupos individuais só serão aceites em
circunstâncias muito excepcionais, não podendo reinvidicar avaliação favorável.

Entrega: Na elaboração do relatório devem ser usadas as regras (incluindo o formato da


capa) descritas em http://fenix.ist.utl.pt/disciplinas/psis-3/materia/Normas.pdf.
O trabalho final deve ser entregue no dia 7 de Dezembro (3a -feira da semana 13) até
às 17:00 em local a indicar pelo corpo docente. O material a entregar consiste em:

• Uma cópia em suporte electrónico dos programas desenvolvidos. Os ficheiros devem


estar distribuı́dos na seguinte forma:

– Topo: ficheiro makefile.


– Directório src: todos os ficheiros fonte.
– Directório bin: para onde é gerado o programa BNavalS.
– Directório doc: manual de utilizador do sistema, em PDF (e.g., Manual.pdf),
assim como o relatório (Relatorio.pdf) em formato PDF.

• Relatório, que deve conter os seguinte itens:

– Identificação dos processos (número, objectivos).


– Identificação dos fios de execução dentro de cada processo (número e objec-
tivos).
– Identificação (i.e., nome, processos de leitura e de escrita) e caracterização (i.e.,
tipo de canal) das estruturas de comunicação utilizadas.
– Listagem das variáveis de sincronização e descrição de cada uma das regiões
crı́ticas.
– Especificação das estruturas de dados e variáveis globais de cada programa
(definição em C e objectivos).
– Listagem sumária das acções efectuadas para implementar cada uma das fun-
cionalidades do projecto (inscrição, disparar, etc.).

• Ficha de auto-avaliação preenchida pelos elementos do grupo, a disponibilizar na


página da disciplina.
Programação de Sistemas – MEEC / MEAer 9

Os atrasos na entrega do trabalho resultarão nas seguintes penalizações:

• 17:00-24:00 do dia 7 Dez, menos 0.5 valor (escala 0-5).

• 00:00-24:00 do dia 8 Dez, menos 1 valores (escala 0-5).

• 00:00-24:00 do dia 9 Dez, menos 3 valores (escala 0-5).

Visualização e Discussão: A visualização e discussão dos trabalhos terá inı́cio no final


da semana 13, prolongando-se pela semana 14 e inı́cio da semana 17 se necessário, em
data e hora a definir.

Execução: O programa BNavalS tem de ser gerado, pelo makefile, nos PCs do labo-
ratório da disciplina e será testado também no laboratório por um programa cliente criado
pelos docentes.

Avaliação: A avaliação terá como base a seguinte escala acumulativa de funcionalidades,


em que cada nı́vel corresponde a uma nota máxima. Na escala 0-5:

• 3 valores: Servidor suporta correctamente um único cliente. Implementação dos


comandos d, t e e.

• 4 valores: Suporta correctamente vários clientes em simultâneo. Implementação dos


comandos d, t, e, h e r.

• 5 valores: Para além das funcionalidades anteriores, implementação do comando c.

A arquitectura e implementação das funcionalidades acima descritas constituem também


critérios importantes de avaliação, ficando definidos à partida os seguintes descontos, na
escala 0-5:

• -1 valores: Fios de execução não são utilizados para dividir as tarefas de processos
complexos.

• -1.5 valores: Não são utilizadas primitivas de sincronização para evitar possı́veis
situações de corrida.

• -2 valores: Não são usados sockets.

Você também pode gostar