PRÁCTICA DISEÑO2 FUNDAMENTOS INFORMÁTICOS. ALUMNOS: MERCEDES EMBID ROMEO;PABLO HIGUERAS SAN ROMÁN. RESUMEN PRÁCTICA JUEGO DE LA VIDA. EL juego de la vida recrea los patrones que tiene la naturaleza bajo ciertas restriscciones dadas. Para implementar este juego en Pascal se han de utilizar tanto los conceptos de vectores y registros como de ficheros;sin embargo, no hemos comprendido del todo el uso que se le daba al fichero dado, y hemos decidido dejarlo para más adelante, y hacer uso del mismo en la práctica de mejora. Hemos resuelto el problema del siguiente modo: -> En primer lugar, tanto a "vivo" como a "muerto" les asignamos 1 y 0 respectivamente, con el objeto de que en el programa aumente la legibilidad de los tableros generados, así como poder recurrir a ellos siempre que nos sea neceario. Por otro lado, declarar los lados mínimo y maximo del tablero como constantes, nos permitirá cambiar aquí estos valores sin necesidad de hacerlo en el resto del código. -> En lo que se refiere al uso de vectores y registros, dos han sido los elegidos para implementar el juego. En primer lugar, se define el vector "matriz", siendo éste un vector bidimensional, es decir, que almacenará un tablero para dibujar el juego. El registro utilizado , "menu", va a tener los campos(los apartados que aparecen definidos dentro del registro) que son necesarios al comenzar la partida. -> Los modulos utilizados son 4: ->PROCEDIMIENTO INICIO. Se trata de la introducción propiamente dicha del juego. Los parámetros de entrada/salida (E/S) que requiere son aquellos que el usuario va a poder modificar en la interfaz del juego (por ejemplo, el lado del tablero, el número de turnos, etc...).Obigatoriamente han de ser parámetros E/S ya que lo que se pretende es que estos valores puedan ser modificados por el usuario una vez entre a este módulo. Este procedimiento repite una y otra vez el menú de inicio hasta que el usuario está conforme a todas las opciones del juego, momento en el que el juego comienza a ejecutarse. Si desea cambiar alguna de estas opciones, pulsa el número correspondiente a dicha opción, la cambiará, y vuelve al menu inicial, eso sí, con la opcion ya cambiada(en cada opción se piden valores que se recogen con entradas robustas para evitar posibles fallos). También se incluye la opcion de que el usuario, pulsando una tecla en concreto, decida salir del juego, momento en el que aparece un mensaje de despedida y se sale de la ejecución.El bucle REPEAT, con el que se hace el menú de este módulo, sólo cesará en el momento en el que una de las opciones elegidas sea bien ejecutar el resto del programa, bien salir del juego.Las mejoras para introducir en la siguiente práctica se encuentran señaladas tanto en el menú, como si se accede a alguna opción y ésta se mejorará en la siguiente entrega. -> PROCEDIMIENTO TABLERO INICIAL. Este módulo unicamente se encarga de pintar el tablero en el estado inicial, a partir de las condiciones que el usuario haya dejado establecidas en el anterior módulo INICIO. Las variables de interés aquí serán tanto el lado del tablero, como la probabilidad aleatoria de aparición de célula viva al inicio. Para ello los parámetros introducidos son los que el usuario ha pasado en el anterior menu del procedimiento INICIO. El módulo, por último, se encarga de pintar un tablero, asignando, como pide en los requisitos de la práctica, los bordes como casillas siempre "muertas", y el interior, comparando la probabilidad aleatoria con el porcentaje introducido por el usuario (o el establecido por defecto si no lo modificó) y asignándole "vida" o "muerte"( 1 ó 0) según indica en las condiciones de la práctica. Además, estos valores de vida o muerte, son almacenados en una parámetro de tipo matriz en su correspondiente posición (para ello se utiliza la estructura de un bucle FOR anidado en otro bucle FOR, con lo que se recorren y asignan todas y cada una de las posiciones de dicha matriz). -> PROCEDIMIENTO ASIGNAR VIDA. Aquí se emplea la estructura del bucle FOR anidado en otro bucle FOR para evaluar si una célula pasa de un estado en un turno, a otro en el siguiente. Para ello, es necesario comparar dos matrices, la "vieja" será la del turno anterior, la "nueva" , la del actual. Para conocer si una posición (es decir cada célula) pasa a vida o muerta, para cada celda del interior del tablero (en los bordes nunca hay vida) se asigna a una variable, "suma_vida", la suma de todas las casillas de alrededor del TABLERO ANTERIOR (no del actual); y entonces, este valor es comparado con: si se trata de una célula muerta, con el valor con el que el usuario introdujo para "x"(numero de células vivas con el que una célula muerta pasa a la vida) y la convierte a un estado u otro; o bien lo compara con "y" y "z"(valores de células vivas entre los cuales una célula viva pasa a sigue estando viva, sino morirá) si la célula estaba viva. Según estas condiciones, las células pasarana un estado u otro. Este módulo SOLO ASIGNA VALORES A CADA CELDA DE LA MATRIZ, NO LOS PINTA EN PANTALLA( más adelante se explica la utilidad de ésto). -> PROCEDIMIENTO TABLERO_TURNO_ARBITRARIO. Este procedimiento es el en realidad nos dibuja por pantalla un tablero, y además, es de gran utilidad, ya que nos "vuelca" todos los valores del tablero nuevo, en el antiguo, con lo cual al repetir las comparaciones entre matrices, siempre podremos hacerlo entre un turno y el inmediatamente consecutivo. -> EJECUCION DEL PROGRAMA. En primer lugar, se inicializan las campos del registro con valores por defecto (que vienen dadas en el guión), y se almacenan en la variable "juego"( estas asignaciones se realiza dentro del bucle descrito a continuación). Este programa se compone de un bucle REPEAT, que en esencia se compone de 2 partes claramente diferenciadas. La primera sólo la ejecuta si el usuario elige la opción del menú de continuar jugando, la otra será que desea abandonar el juego (por lo que es lógico pensar que el bucle REPEAT realizará iteraciones hasta que la opción elegida sea abandonar el juego, así en particular es como se ha elaborado el bucle). Si el usuario "juega", entonces las opciones son, bien que juegue mostrando todos los turnos(por lo que se repetirán los módulos ASIGNAR_VIDA y TABLERO_TURNO_ARBITRARIO para CADA TURNO, hasta que se llegue al máximo indicado por el usuario); o bien que únicamente quiere ver el tablero INICIAL y el FINAL (por lo que únicamente se ejecutará el procedimiento "ASIGNAR_VIDA" para todos los turnos; sin embargo, el módulo "TABLERO_TURNO_ARBITRARIO" tan sólo lo pintará para el último turno requerido). Aquí es donde se explica lo útil que ha sido separar la elaboración en módulos diferentes la asignación a cada celda el estado de vida o muerte; y en otro módulo, el dibujo, de modo que se podía utlizar para ambas opciones(ver solo estados inicial y final, o bien ver todos los turnos). MEJORAS PARA LA SIGUIENTE PRÁCTICA: -> PLANO TOROIDAL. -> CARGAR FICHERO DE ESTADO INICIAL. -> ANALIZAR SI UN TABLERO ESTÁ "EXTINGUIDO"(TODAS LAS CÉLULAS MUERTAS) Y PARAR LA EJECUCIÓN EN ESE MISMO MOMENTO INDICANDO EL TURNO DE EXTINCIÓN. -> SALVAR CADA TABLERO GENERADO PASO A PASO. ---------------------------- (añadido tras someter) ---------------------------- 22:47:59 11/12/09 -> Segun los datos introducidos los ficheros son: G14P13D2 -> Los autores del trabajo son: Higueras San Román, Pablo Embid Romeo , Mercedes Nombres originales de los archivos entregados -> game_of_life.pas, DISEÑO2.TXT