Programación I Práctica final: el juego de los barquitos II (ENTREGA

Anuncio
Programación I
Práctica final: el juego de los barquitos II
(ENTREGA OBLIGATORIA)
En esta práctica tendréis que implementar una variante del juego de los barquitos o
“hundir la flota” para dos jugadores. Para ello vamos a introducir varias modificaciones
al juego que se implementó en la práctica parcial. Las principales están referidas a la
lectura del panel y disparos de cada jugador, que ahora se harán desde ficheros de texto
(y no en la declaración de las variables). Además se introducen nuevas funcionalidades
que supondrán también cambios en vuestros programas. No obstante, la función de
comprobación del resultado de un disparo (agua, tocado, hundido y destruido) no sufre
cambios.
Ficheros de barcos y disparos
Cada jugador tendrá un panel de 10x10 casillas donde se situarán sus barcos. La
disposición de los barcos de cada jugador deberá leerse respectivamente de los ficheros
barcos1.txt y barcos2.txt, según el formato que se describirá más abajo. En este caso hay
un número fijo de barcos, de diferentes tipos según su tamaño:
-
2 submarinos (barcos de 1 casilla)
3 fragatas (barcos de 2 casillas)
3 destructores (barcos de 3 casillas)
2 acorazados (barcos de 4 casillas)
1 portaviones (barco de 5 casillas)
Para identificar el tipo utilizaremos la inicial en mayúsculas (por ejemplo ‘F’ para
fragatas). Además, cada barco concreto tiene un nombre para poder identificarlo. Dicho
nombre consta de la inicial del tipo y un número del 1 al 3 (por ejemplo “F2”).
Los disparos de cada jugador también están pre-generados y deberán leerse
respectivamente de los ficheros disparos1.txt y disparos2.txt. El formato también se
describirá más abajo.
Formato del fichero de barcos
Cada barco se representa mediante una línea del fichero de la siguiente manera:
t x y d
Donde:
- t es un carácter que indica el tipo de barco
- x e y determinan la casilla en la que se sitúa una esquina del barco. x es una letra
que indica la fila (de ‘A’ a ‘J’) e y un número que indica la columna (de 1 a 10)
- d es un carácter que indica la dirección en que situamos el barco a partir de la
casilla anterior: ‘a’ hacia arriba, ‘b’ hacia abajo, ‘i’ hacia la izquierda, ‘d’ hacia
la derecha
-
cada uno de los elementos están separados por un único espacio en blanco
al final del barco hay un único carácter de salto de línea (‘\n’)
no hay ningún espacio en blanco ni antes del tipo ni después de la dirección
El nombre de cada barco se determina por orden. Así, el primer destructor que aparece
en el fichero será el “D1”, el segundo el “D2” y el tercero el “D3”.
Podéis suponer que el fichero está bien construido, siguiendo el formato adecuado, que
contiene todos los barcos del juego y que las posiciones y direcciones están introducidas
sin errores. No es necesario, por tanto, introducir un control de errores.
Formato del fichero de disparos
Cada disparo se representa mediante una línea del fichero de la siguiente manera:
x y
Donde:
- x es una letra que indica la fila (de ‘A’ a ‘J’)
- y es un número que indica la columna (de 1 a 10)
- hay un único espacio en blanco entre ambos y un salto de línea al final
- no hay ningún espacio en blanco ni antes de la x ni después de la y
El orden de aparición en el fichero determina el orden en que se realizan los disparos.
El fichero contendrá 100 disparos (100 líneas). Como en el caso de los barcos, podéis
suponer que el fichero está bien construido, siguiendo el formato adecuado y que
contiene los 100 disparos. No es necesario, por tanto, introducir un control de errores.
Dinámica del juego
Comenzando por el jugador 1, los jugadores irán haciendo alternativamente los disparos
en el orden que figura en los ficheros disparos1.txt y disparos2.txt. En el momento en
que uno de los jugadores consiga destruir la flota del adversario, el juego acaba.
Presentación de los resultados
Los resultados del programa se escribirán en dos ficheros de texto, uno que contendrá la
secuencia de disparos de cada jugador y su resultado (resultados.txt), y otro con una
serie de estadísticas que después se describen (estadisticas.txt). Estos dos ficheros se
ajustarán al formato que se indica más abajo.
Fichero de resultados
El programa debe generar la secuencia de resultados, siguiendo el siguiente formato
para cada disparo (cada disparo en una línea diferente):
j n x y r b
Donde:
-
-
j es el número de jugador (1 ó 2)
n es el número de disparo del jugador (comenzando por 1 y como máximo 100)
x es una letra que indica la fila (de ‘A’ a ‘J’)
y es un número que indica la columna (de 1 a 10)
r es un carácter que indica el resultado del disparo:
o ‘A’ para agua
o ‘T’ para tocado
o ‘H’ para tocado y hundido
o ‘D’ para tocado, hundido y flota destruida
b es una cadena de dos caracteres que contiene el nombre del barco que se ha
tocado. Este datos sólo se rellena en el caso de acierto y no el caso de “agua”.
El resultado de cada disparo aparecerá en una línea diferente (entre dos disparos hay un
único carácter de salto de línea). Los diferentes elementos de una línea estarán
separados por un único carácter en blanco. No debe haber ningún carácter ni antes del
número de jugador, ni después del nombre del barco tocado (o después del resultado si
el disparo no tocó ningún barco).
Repetimos que una vez que un disparo produzca el fin del juego (flota destruida), ya no
se deben procesar el resto de disparos.
Fichero de estadísticas
Una vez se haya acabado el juego (se haya destruido una de las dos flotas), se guardarán
en este fichero una serie de datos y estadísticas relacionadas con el desarrollo de la
partida que se enumeran a continuación. El formato en que deben escribirse se explica
más abajo.
1)
2)
3)
4)
5)
6)
7)
8)
9)
Porcentaje de aciertos del jugador 1
Porcentaje de aciertos del jugador 2
Porcentaje de fallos del jugador 1
Porcentaje de fallos del jugador 2
Longitud de la secuencia de aciertos más larga del jugador 1
Longitud de la secuencia de aciertos más larga del jugador 2
Longitud de la secuencia de fallos más larga del jugador 1
Longitud de la secuencia de fallos más larga del jugador 2
Nombre del barco más “resistente” del jugador 1 y número de disparos
necesarios para hundirlo (ver explicación después). Entre el nombre y el número
de disparos habrá un único espacio en blanco
10) Nombre del barco más “resistente” del jugador 2 y número de disparos
necesarios para hundirlo (ver explicación después). Entre el nombre y el número
de disparos habrá un único espacio en blanco
Nótese que aciertos se consideran los disparos que tocan un barco, independientemente
de si lo hunden o no, y fallos los disparos que caen al agua. Tened también en cuenta
que los disparos después de que se destruya la flota no deben tenerse en cuenta para las
estadísticas.
El barco más resistente es aquel que ha costado más disparos en ser hundido. Es decir,
el barco que ha pasado más número de disparos desde el primero que lo tocó hasta el
que lo hundió. Por ejemplo, si el primer disparo que lo toca es el 10 y el barco se hunde
en el 15, decimos que el barco ha resistido 6 disparos (del 10 al 15, ambos inclusive).
Nótese que en entre medias pueden haberse tocado otros barcos también.
En cuanto al formato del fichero, cada una de las 10 estadísticas aparecerá en una línea
diferente (separadas por un único carácter de fin de línea, ‘\n’). En las estadísticas 1 a 8,
se seguirá el siguiente formato:
n v
Donde:
- n es el número de estadística (del 1 al 8)
- v es el valor (real o entero dependiendo del caso) de dicha estadística
- entre el número y el valor hay un único espacio en blanco
En las estadística 9 y 10 el formato es ligeramente diferente, ya que además hay que
escribir el nombre del barco:
n b v
Donde:
- n es el número de estadística (9 ó 10)
- b es una cadena de dos caracteres que contiene el nombre del barco
- v es el valor entero correspondiente al número de disparos necesarios para
hundirlo
- entre el número y el valor hay un único espacio en blanco
Documentación
Además del correcto funcionamiento del programa, se valorará:
-
Estructuración en funciones (y facilidad para la reutilización)
Documentación del código (y legibilidad)
Así mismo, hay que entregar una memoria (documento en Word o RTF) en la que se
incluya una explicación del funcionamiento general del código, y se justifiquen los tipos
de datos y funciones utilizadas. Además, cada función debe ser descrita brevemente,
especificando sus parámetros y valor retornado.
Normas adicionales
El uso de variables globales está prohibido. Sí pueden definirse constantes y tipos
globales.
Revisión de la práctica
En la sesión de ejercicios E8 los profesores revisarán el estado de la práctica con cada
pareja. Deberán explicarse las decisiones tomadas hasta la fecha, en concreto los tipos
de datos y diseño descendente (estructuración del código en funciones). Los alumnos
que no asistan a esta sesión serán convocados después de la entrega a una defensa de su
práctica. En dicha defensa los alumnos deberán responder una serie de preguntas acerca
de su práctica, tanto de la estructura como del código. Así mismo, aquellos alumnos que
en la sesión E8 no hayan progresado lo suficiente o no hayan justificado correctamente
su práctica también deberán realizar la defensa después de la entrega. La nota de la
práctica quedará completamente condicionada al resultado de la defensa.
Indicaciones para la entrega
Esta práctica se realizará en parejas. Alternativamente puede realizarse individualmente,
aunque eso no supondrá una mayor nota. Bajo ninguna circunstanciase permitirán
grupos de más de dos alumnos.
La entrega de esta práctica es obligatoria. La fecha límite de entrega es el martes 5 de
diciembre a las 12:00 del mediodía.
Depositad la carpeta con vuestra memoria y código fuente, sin el ejecutable, (el nombre
de la carpeta será vuestros nias, separados por un guión bajo, por ejemplo
“12345_12346”) en la carpeta de vuestro grupo de práctica correspondiente (P11, P12,
P13, P21 o P22), dentro de
\\recursos\public\FOLDERS\3371-3372\12406\alumnes\practica_final
Si una vez copiada tenéis algún problema o tenéis que hacer algún cambio, volvedlo a
copiar desde una carpeta nueva añadiendo "_b" al nombre, por ejemplo
"12345_12346_b"
Recordad que el compilador a utilizar es gcc, en Linux o en Cygwin. Los ficheros
que no puedan compilarse con gcc no se corregirán y tendrán una nota de 0.
Reiteramos que, para la evaluación, tan importante como el que el programa
funcione es que esté bien estructurado en funciones y que sea legible y esté bien
documentado. La nota de la práctica consta de dos partes: 50% ejecución y 50%
de estructura y legibilidad (donde también se incluye la memoria).
Es fundamental que los ficheros con los que trabajéis sigan los formatos y nombres
que se detallan en este enunciado. La corrección de la parte de ejecución se
realizará mediante un script automático. Si los formatos y nombres de ficheros no
son correctos la parte de ejecución tendrá una nota de 0.
El hecho de no cumplir cualquiera de los demás requerimientos (máximo de dos
alumnos por grupo, poder compilar la práctica con gcc, prohibición del uso de
variables globales y entrega de la memoria) supondrá un cero como nota de la
práctica.
Como es lógico, la copia está terminantemente prohibida, ya sea de todo o de parte
del código o de la memoria. Además, os recordamos que la detección de una copia
de trabajos ajenos conlleva el suspenso automático de la asignatura para todos los
alumnos involucrados en la copia, además de la iniciación del consiguiente
procedimiento disciplinario.
Descargar