Práctica 3: Juego Batalla naval
UNIDAD DE APRENDIZAJE : Aplicaciones para comunicaciones en red
UNIDAD TEMÁTICA I: Sockets de flujo
No. Y Título de la práctica: Tiempo de realización: 4.5 horas
Práctica no. 3 Juego Batalla naval
Objetivo de la práctica: El estudiante implementará
el juego Batalla naval utilizando sockets de flujo no
bloqueantes.
Situación problemática: Se desea implementar el juego clásico Batalla naval en su modalidad para dos jugadores, cada jugador
tendrá un tablero de tamaño 15 x 15 celdas en el cual deben acomodar su flota de barcos, de modo que sean difíciles de encontrar por
el enemigo. Cada jugador realizará disparos sobre el tablero de su oponente, de modo que ambos tableros deberán ser validados en la
aplicación servidor.
¿Qué aspectos es necesario considerar de modo que los cambios generados en el tablero por el primer jugador se vean reflejados en
el tablero del segundo jugador?
Competencia específica: Desarrolla aplicaciones en red, con base en el modelo cliente-servidor y utilizando de sockets de
datagrama, así como hilos para el envío de datos a cada uno de los clientes.
Competencias genéricas: Elementos de competencia:
Aplica los conocimientos en la práctica Programa aplicaciones en red con base en el modelo
Demuestra habilidad para trabajar en equipo Cliente-Servidor y la interfaz de aplicaciones de
Demuestra capacidad de investigación sockets de datagrama
Desarrolla aplicaciones en red con base en la Analiza los servicios definidos en la capa de transporte
tecnología más adecuada Emplea el modelo Cliente-Servidor para construir
aplicaciones en red
Programa aplicaciones Cliente-Servidor utilizando
sockets de datagrama
Programa aplicaciones utilizando hilos de ejecución
para distribuir tareas a distintos servidores
Criterios de evaluación: La práctica 4 aportará el 25% de la unidad temática IV
Introducción
El juego Batalla naval consiste en eliminar todos los barcos y submarinos del rival a través del
lanzamiento de torpedos a las posiciones p(x,y) donde se piense que se encuentren éstos. El
juego se desarrollará en dos escenarios (una matriz de 15 x 15 casillas donde el jugador colocará
en total 3 barcos y un submarino y otro escenario del mismo tamaño en donde el jugador
realizará los disparos tratando de hundir las embarcaciones de su rival)
Los barcos pueden tener una extensión de 1 o 2 casillas. Los submarinos tienen una extensión de
3 casillas.
Dependiendo de la extensión de la embarcación será el número de disparos que aguante sin ser
destruido, es decir, los barcos de longitud igual a 1 casilla serán hundidos al primer disparo, los de
2 casillas se hundirán con 2 disparos y los de 3 con 3 disparos.
Cada jugador solo será capaz de ver sus propios barcos/submarinos y será capaz de ver las
embarcaciones hundidas de su rival
El juego se llevará a cabo mediante turnos, con las siguiente restricción:
Si al disparar un torpedo, éste acierta en una embarcación enemiga el jugador que hizo el
disparo podrá seguir realizando disparos, en caso de fallar el turno pasará al otro jugador.
Recursos y/o materiales Internet
Manual de prácticas de laboratorio de Computadora
Aplicaciones para Comunicaciones en Red IDE de desarrollo
Plumones Apuntes
Bibliografía
Instrucciones
En esta práctica debes implementar el juego Batalla Naval en su modalidad jugador vs jugador en un modelo cliente-
servidor, haciendo uso de sockets de flujo no bloqueantes.
Desarrollo de la práctica
Deberá implementarse un cliente con las siguientes características:
La aplicación cliente deberá visualizar un botón para comenzar la partida del juego, al ser oprimido dicho
botón creará un socket de flujo no bloqueante y se comunicará con el servidor de juego (puerto a ser elegido
por el usuario).
Si al momento de comunicarse con el servidor falta un contrincante contra el cual se jugará la partida, la
aplicación deberá notificarle al usuario que deberá esperar a que llegue un nuevo jugador.
En cuanto se tengan ambos contrincantes ya comunicados con el servidor se iniciará la partida de juego. El
cliente deberá mostrar al usuario una interfaz de usuario con su escenario de juego y le solicitará que
acomode sobre el escenario sus embarcaciones.
Una vez colocadas las embarcaciones el jugador deberá avisar al servidor que se encuentra listo para jugar.
Una vez que ambos jugadores estén listos para jugar, el servidor designará de manera aleatoria cual jugador
iniciará turno, el jugador que no tenga el turno no podrá realizar ningún tiro (deshabilitar capacidad de
disparo).
La lógica del juego puede ser implementada ya sea del leado del servidor o del lado del cliente.
Una vez hundidas todas las embarcaciones de uno de los jugadores deberá mostrarse en la interfaz del
usuario un mensaje anunciando al ganador de la partida
Deberá implementarse un servidor con las siguientes características:
El servidor solicitará al usuario especificar el puerto de servicio en el que aceptará a los jugadores.
Una vez iniciado el servidor, este recibirá las conexiones de los clientes a través de sockets de flujo no
bloqueantes. Por cada dos clientes que se conecten el servidor iniciará una nueva partida. En caso de que la
lógica del juego sea implementada del lado del servidor, éste deberá recibir al iniciar el juego los escenarios
de ambos jugadores (matrices que ya contienen las embarcaciones ubicadas), de modo que se pueda validar
en cada disparo si se acierta o no en el blanco y informarlo al cliente en turno.
En caso de que el cliente acierte en su disparo el servidor le concederá más disparos, en caso de fallar
cambará el turno al siguiente jugador.
Al finalizar la partida, (es decir, cuando todas las embarcaciones de un jugador han sido hundidas), el servidor
deberá designar al ganador de ésta y enviarle un mensaje indicando si ganó o perdió la partida, así como
guardar un registro del ganador en un archivo de records.
Cierre de la práctica
Preguntas:
1. Mencione al menos 3 ventajas/desventajas de utilizar sockets de flujo no bloqueantes en esta
aplicación.
2. Se tiene un uso más eficiente de la memoria por el solo hecho de utilizar sockets no bloqueantes?