Tarea Nº3
Programación de Sistemas


Profesor:  Agustín González V.
Ayudante: Christian Lalanne

Paola Rojas Contreras
9804034-k

Nombre:
bnv2: Batalla Naval versión 2.

Sintaxis:
bnv2 <archivo_porta-avion> <archivo_fragata> <archivo_submarino>  <puerto_local>  <destino> <puerto_remoto>

Descripción:

bnv2 es una aplicación del tipo peer-to-peer que permite jugar a la "Batalla Naval"
bnv2 es un programa que maneja dos tableros de "tableros" de 10x10 sectores. Cada tablero tiene subdivisiones que muestras los 10x10 sectores. En uno de los tableros se ubican figuras cuyo diseño está estipulado en los tres archivos pasados como parámetros. Un porta-aviones ocupa tres sectores horizontales, un crucero dos sectores y un submarino uno.
En el otro tablero se anotarán los disparos que usted haga.

Iniciación del juego

bnv2 muestra los dos tableros tan pronto se inicia el juego. Luego por consola se solicita que el usuario ingrese tres posiciones (0..9,0..9). La primera posición definirá la ubicación del porta-avión, la segunda la posición del crucero, y la última la del submarino.

Desarrollo del juego
Luego bnv2 solicita el ingreso del primer disparo hacia el oponente. En respuesta al disparo, bnv2 dibuja en el tablero de disparos un círculo azul en la posición si el disparo cayo en el agua. Se dibujará un círculo rojo si da en un el blanco. Además en caso de hacer blanco se muestra por pantalla el tipo de embarcación impactada (porta-avión, crucero, o submarino). bnv2 no acepta otro disparo hasta que el contrario haya enviado el suyo y la respuesta haya sido enviada. Ante la llegada de un disparo del contrario, bnv2 muestra en el tablero de embarcaciones un círculo verde si el disparo cayó en agua y uno rojo si dio en un barco.

Término del juego
El juego termina cuando uno de los jugadores logra hundir todos los barcos del oponente. El juego no requiere llevar la cuenta, cada jugador lo notará.

Implementación:

La estructura implementada se muestra en la figura 1. Existen 4 procesos por jugador: 1 proceso denominado servidor, que es el proceso padre, 1 proceso hijo denominado cliente y 2 procesos que controlan los respectivos tableros. La comunicación entre procesos se hace a través de pipas y de sockets.

Estructura de la implementación


Diagrama de Flujo:

El siguiente diagrama de flujo resume el funcionamiento de los procesos en un jugador, que implementan el programa bnv2. Se deben considerar algunos puntos:

  • La selección de turnos se hace en forma aleatoria: Cada jugador (proceso servidor) genera un turno aleatorio. En cada cliente se realiza la comparación y de esta forma el que genera el valor más alto parte.
  • El turno se va pasando a través de un token: Esto permite detectar cuando un tablero de naves se ha quedado sin embarcaciones y poder cerrar los procesos y conexiones en forma ordenada, para ambos jugadores.


Diagrama de Flujo


Problemas enfrentados:

La mayor parte de los problemas enfrentados surgen de la sincronización de ciertos eventos entre procesos que teóricamente debieran estar en distintas máquinas y con la comunicación entre los procesos servidor y cliente de una misma máquina. El problema más crítico surgió para comunicar servidor y cliente locales en forma sincronizada. En vez de utilizar un pipa, se utiliza la comunicación a través de socket, que cumple con la sincronización necesaria para poder coordinar los disparos del cliente local con la sección en la cual el servidor debe esperar los disparos del cliente remoto. Otro problema importante que se solucionó con este esquema fue la finalización de los procesos y conexiones.