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.