ELO-330: Programación de Sistemas
Tarea 3: Batalla Naval

Objetivos: En esta tarea usted aplicará: creación de procesos, comunicación entre procesos usando pipes, integración de servicios provistos por otras aplicaciones, semáforos y uso de memoria compartida. En este caso se solicitará servicios de gnuplot o GNU octave.

Introducción

Este programa es una versión computacional del juego batalla naval. A través de éste su grupo experimentará con semáforos, compartición de memoria entre otros.

Nombre:  bn : Batalla Naval

Sintaxis: bn [a]
  a: es un parámetro opcional. Es omitido para la versión del programa que primero se ejecuta. Al omitir el parámetro el programa crear la zona de memoria compartida y todos los recursos compartidos requeridos para la operación de la aplicación. Cuando el parámetro es incluido, la aplicación accede a la zona de memoria compartida y otros recursos creados previamente.
 
Descripción
  
Este programa debe ejecutarse dos veces en la misma máquina. Cada versión corresponde a un jugador de la batalla naval. La zona naval de cada jugador se representará por un cuadrado de 10x10 celdas (ver figura 1). La coordenada horizontal de la celda está numerada de la A a la J y las verticales del 1 al 10.  Todos los barcos son de tamaño 3. La vista de cada celda del cuadrado corresponde a "agua", "barco" (parte no dañada del barco), "toque" (parte dañada del barco). El juego se juega en forma alternada, partiendo el segundo jugador con el primer disparo, un disparo por vez.
 
a)                                                                        b)
   Figura 1: Vista propia del juego al comenzar a) y luego de algunas movidas b). En esta tarea todos los barcos son de tamaño3 y su representación es simple como el caso b) o incluso más simple.

  Al iniciar el programa, éste pide ingresar por consola el número de barcos. Luego para cada uno pide ingresar las coordenadas de uno de sus extremos y luego N o E para indicar si se ubica hacia el norte o este. La sintáxis es el tipo:
Ingrese ubicación de barco : D5N   /* representa barco que parte en ubicación (D,5) y se ubica además en las dos celdas superiores; es decir, (D,6) y (D,7).*/
  En la medida que se ingresan los barcos, el programa muestra un cuadrado similar a la figura 1a. En éste se muestran los barcos propios (sin tanto detalle) y, más adelante, sus puntos de impacto. Al término de ingreso de las naves, el programa muestra además un segundo cuadrado donde sólo se muestra los disparos propios indicadno aquellos que han dado en el blanco (toques) o han sido "agua".  Su grupo debe elegir cómo mostrar cada cosa (no se complique).
  El programa termina cuando, después que ambos jugadores han hecho el mismo número de disparos, uno ha destruido las naves del otro. El programa detecta esta situación y escribe en consola:
"Ganaste!!!!" , "Empate" o bien "Perdiste" según sea el caso.
  El programa también termina al ingresa por consola un fin de archivo (Control-D). No importando cómo termine el programa, la zona de memoria compartida y otros recursos deben ser removidos por el proceso que los creó.

Evaluación de la Tarea y qué entregar: revisar las instrucciones para entregar y evaluar su tarea.

Recomendaciones

* Para el maneno de memoria compartida revisar este ejemplo.
* Revise también el uso de atexit().
* Para dibujar con gnuplot, ver este ejemplo; o si prefiere hacerlo con octave, ver éste.
* Si un jugador no sigue las instrucciones; por ejemplo, trata de poner barcos fuera del cuadrado, usted es libre de reaccionar como quiera. Es una condición a la que no será sometido su programa.
* Si más aclaraciones son requeridas, con todo gusto lo atenderé.