PRÁCTICA OBLIGATORIA 1 Convocatoria de Septiembre CONDICIONES: Individual ENUNCIADO En esta práctica hay que diseñar y construir una aplicación para jugar al juego de los barquitos. El juego de los barquitos consiste, básicamente, en encontrar donde se encuentran los distintos barcos en un tablero con el menor número de tiradas o disparos. Dichos barcos son de distintos tamaños (ocupando desde 1 a 4 casillas contiguas del tablero), pueden estar situados en cualquier lugar y con distintas orientaciones (vertical u horizontal pero no diagonal), con la única restricción de que los barcos no pueden estar pegados al borde del tablero, pero dos barcos sí pueden ser adyacentes (es decir entre dos barcos no tiene que existir una casilla vacía y también se pueden tocar por las esquinas). El número de barcos es fijo, teniendo un portaaviones (que ocupa 4 casillas), dos destructores (de 3 casillas), tres fragatas (de 2 casillas) y cuatro submarinos (de 1 casilla). Se parte del tradicional juego de los barquitos pero la interacción se realiza a través de una interfaz, que será especificado más adelante. (Véanse, como ejemplo del funcionamiento de un juego de los barquitos, la página: http://www.peterpaulxxx.com/noticias/animados140304.php , obsérvese que el número de barcos es diferente y en este juego se pueden tocar los barcos. En la aplicación a desarrollar se deben seguir las normas anteriormente establecidas para nuestro juego.) La aplicación debe “esconder” los barcos en un tablero de 10x10 casillas y pedir al jugador que dispare, informándole a continuación del resultado en forma textual y de la situación del tablero utilizando los símbolos indicados: RESULTADO No disparado Agua Tocado Hundido SÍMBOLO . o x X DESCRIPCIÓN Casilla que aún no ha sido disparada. No se ha acertado a ningún barco. El disparo ha alcanzado a uno de los barcos sin hundirlo. El disparo ha terminado de bombardear el barco y lo ha hundido. En el momento en que el barco ya está hundido todas las posiciones que ocupa deben cambiar el símbolo x (tocado) por el símbolo X (hundido). Observaciones: Inicialmente se muestra el tablero con las letras de la A a la J identificando las columnas y los números del 1 al 10 identificando las filas. En cada casilla del interior del tablero se mostrará el símbolo ‘.’ (punto), que indica que aún no ha sido disparada dicha casilla (ver figura). También se pedirá al jugador que introduzca las coordenadas de su disparo número uno. Si el jugador introduce el carácter ‘M’ se le mostrará el menú. En caso de que introduzca unas coordenadas el programa comprobará si son correctas, en ese caso se borrará la pantalla y se escribirá de nuevo el tablero actualizado, el resultado textualmente (Agua, Tocado,…) y se le pedirá una nueva jugada, la número n. Si las coordenadas estuvieran fuera de rango se emitirá un mensaje de error solicitando al jugador de nuevo las coordenadas. Si la posición ya ha sido jugada se penalizará al jugador con un disparo fallado, pasando a disparo n+1. También se incrementará dicho contador cada vez que el jugador dispare y haga agua. Cuando un jugador acierte en el disparo (Tocado o Hundido) no se incrementa el contador de disparos fallados (o resultados de ‘agua’), para premiar su acierto. Cuando el jugador haya realizado más de 25 disparos fallados sin hundir la flota se considerará la partida PERDIDA, informando al jugador e invitándole a una nueva partida o a finalizar la aplicación. Cuando el jugador haya hundido la flota se considerará la partida GANADA, informando al jugador e invitándole a una nueva partida o a finalizar la aplicación. La información relativa al juego debe estar siempre presente en la pantalla y actualizada. Por tanto, se debe mostrar el número de barcos hundidos, el número de barcos restantes y el número de disparos acertados y fallados. En cada uno de los disparos además de la representación gráfica correspondiente (p.e. cambio del icono) se proporcionará información al usuario sobre el resultado de su disparo. En el menú, que aparecerá cuando el usuario introduzca una ‘M’ en lugar de las coordenadas del disparo, se incluirán las siguientes opciones: 1. Comenzar nuevo juego. Supone abandonar la partida actual y empezar otra. 2. Ver solución. Se muestran las posiciones de todos los barcos de la flota y se dan estadísticas acerca del número de disparos, el número de disparos acertados, el número de barcos hundidos,…). A continuación se pregunta al jugador si quiere abandonar la aplicación e iniciar una nueva partida. 3. Instrucciones. Se muestra una pantalla con las normas de juego. 4. Terminar. Se pide confirmación al usuario para saber si realmente quiere abandonar la aplicación. Veamos un ejemplo de comienzo de juego: Inicialmente se muestra el tablero con todas las posiciones con ‘.’. En el primer disparo se ha hecho agua. Después de varios disparos se obtiene un resultado de “tocado”. Finalmente se consigue hundir, se trata de un destructor. Si en cualquier momento se introduce una ‘M’ se obtiene el menú: Se quiere construir una biblioteca que sirva como base para la construcción de la aplicación para el juego de los barquitos. Para construir esta biblioteca se utilizará como base la unidad TiposBarquitos, en la página web de la asignatura que define los tipos básicos para el resto de los módulos. Escriba, utilizando Borland Delphi o Kylix, los siguientes módulos: A) Una unidad UBarquitos que: • • Declare las siguientes variables globales: - Solucion: TTablero; Esta variable contendrá una solución de un juego, generada por el procedimiento GenerarTablero y modificada por sucesivas llamadas a la función Disparo. - Se deja a decisión del alumno si esta variable debe ser exportada por la unidad o no. Exporte los siguientes subprogramas: procedure GenerarTablero; Genera una solución con la posición de los barcos de la flota que debe ser aleatoria y coherente con las condiciones del juego, es decir, que los barcos no toquen en borde del tablero y que puedan tomar posiciones horizontales o verticales de forma azarosa. El resultado, que se almacena en la variable Solucion, será un tablero con la solución que contendrá el símbolo ‘.‘ en todas las posiciones excepto en las casillas ocupadas por algún barco, en las que se utilizará el símbolo ‘B’. function Disparo (Objetivo: TCasilla): TTablero; - Modifica la variable Solucion como se ha indicado anteriormente, sustituyendo el contenido de la casilla Objetivo por 'o', 'x' ó 'X', según corresponda. - Devuelve como resultado el contenido de la variable Solucion con los barcos ocultos, es decir, sustituyendo las 'B' por puntos '.'. - Precondición: Antes de llamar a Disparo debe haberse llamado al menos una vez a GenerarTablero. B) Un proyecto de biblioteca LibBarquitos que: . • Sirva para construir una biblioteca dinámica LibBarquitos.dll con la unidad UBarquitos. . • Exporte los subprogramas GenerarTablero y Disparo. C) Una unidad de importación ImpBarquitos para LibBarquitos que empaquete las declaraciones external de los subprogramas exportados por LibBarquitos. D) Un proyecto JuegoBarquitos para una aplicación no gráfica que, utilizando la biblioteca LibBarquitos, permita jugar al juego de los barquitos Inicialmente, o si se comienza un nuevo juego, la aplicación llamará a GenerarTablero y escribirá en pantalla el tablero inicial, como se ha visto en el ejemplo, para pedir el primer disparo al jugador. Cuando el usuario introduce las coordenadas de una casilla para un disparo: - Comprueba que las coordenadas son correctas y que corresponden a una casilla dentro del tablero. En caso contrario, escribe un mensaje de error. Si el usuario ha introducido una letra minúscula, la convierte a mayúscula. - Si la casilla está dentro del tablero, comprueba si corresponde a una casilla ya jugada, en cuyo caso escribe un mensaje de error e incrementa el contador de disparos fallados. - En otro caso, realiza el disparo y escribe el resultado, tal y como se ha indicado en el ejemplo. Después solicitará las coordenadas del siguiente disparo. En el caso de que el jugador introduzca una M se mostrarán las opciones del menú. La aplicación deberá llevar la cuenta de los disparos acertados y fallados, número de barcos tocados y hundidos, etc. DOCUMENTACIÓN DE LA PRÁCTICA El código fuente deberá comentarse de forma completa, tal y como se ha indicado en la teoría: cabeceras de módulo, descripción de los elementos exportados, etc. En la calificación de la práctica se valorará la calidad de la documentación. OBSERVACIONES: 1. 2. No debe modificarse en ninguna forma la unidad TiposBarquitos. No debe modificarse en ningún caso el nombre de los módulos ni la especificación de cada módulo ni de la interfaz de cada uno de los subprogramas (nombre, parámetros, etc). Si considera que es necesario hacer alguna modificación, consulte con la profesora. Sí puede, en cambio, añadir otros tipos, variables, subprogramas etc., tanto exportados como no exportados, donde lo considere oportuno, excepto en la unidad TiposBarquitos. También pueden añadirse otros módulos. 3. En la calificación de la práctica se valorará, por orden de mayor a menor importancia: - La corrección de los distintos módulos y de sus respectivas interfaces, así como su uso por otros módulos. - La documentación del código. - La corrección de los distintos subprogramas. - El grado de aleatoriedad de las soluciones generadas. - La eficiencia de los algoritmos utilizados. - La facilidad y comodidad de uso de la interfaz para el jugador. ENTREGA DE LA PRÁCTICA Cada alumno deberá entregar un disquete: - Con una etiqueta en la que se indiquen: . • Nombre y primer apellido del alumno. . • Septiembre 2005 . • La versión de Delphi/Kylix utilizada. - Conteniendo los siguientes ficheros: . • AUTOR.TXT Fichero de texto con los apellidos, nombre y DNI. . • Los proyectos Delphi/Kylix LibBarquitos y JuegoBarquitos con todos sus ficheros fuente Recuerde que los proyectos Delphi/Kylix deben guardarse en el disquete desde dentro del entorno gráfico y unidad a unidad. No es necesario entregar los ficheros objeto (.DCU y .DLL) ni ejecutables (.EXE) Todos los ficheros deben estar en la raíz del disquete. Se recomienda a los alumnos que conserven una copia de la práctica entregada. La fecha límite para entregar la práctica es el día 7 de septiembre de 2005, a las 18 horas.