Práctica 2 de Diseño de programas: Vectores, Registros y Ficheros. “Juego de la Vida” A) Autores: - ELENA GARCÍA PARACUELLOS - AINHOA SANCHO CUBERO B) Estructura del programa: Este programa simula el juego de la vida. PRIMERA PARTE: {CABECERA DEL PROGRAMA} Se identifica el nombre del programa, JuegoDeLaVida. {COMIENZO DE LAS DECLARACIONES} Aquí se incluyen las declaraciones de variables y unidades de programa. USES Se utiliza ya que se desea hacer uso de módulos compilados de forma independiente. CRT: Unidad estándar que contiene las rutinas que se van a utilizar en la ejecución del programa, tales como ClrScr y TextColor. - ClrScr, este procedimiento limpia la ventana de texto actual. - TextColor, este procedimiento selecciona el color de primer plano para el texto. CONST Se utilizan 9 constantes, de las cuales 8 corresponden a colores; la otra (parpadeo) se utiliza junto con el tetxcolor para que parpadee el mensaje en el color establecido. TYPE Se usa un vector multidimensional de tipo integer y delimitado por un límite inferior y otro superior, que son los lados límite del tablero, el máximo es de 20 x 20. Se utiliza un fichero de string. {BLOQUES DE PROGRAMA} PROCEDIMIENTOS Y FUNCIONES - Rotulos, procedimiento que muestra por pantalla las posibles opciones del usuario para jugar. Contiene un parámetro de entrada, numero, de tipo integer. Mediante un esquema de selección por casos, CASE OF, se da la posibilidad de que el usuario elija entre las cuatro posibles opciones. - Pregunta, procedimiento que da la posibilidad de elegir entre mundo plano o mundo toroidal y devuelve en el parámetro de salida respuesta la elección. El cuerpo de instrucciones ejecutables del procedimiento comienza con la función IOResult, que está dentro de la UNIDAD SYSTEM, pero no es necesario declararla ya que se utiliza de forma automática. Devuelve el estado de la ejecución de la última operación de entrada o salida. El chequeo de entrada/salida está inhabilitado mediante la directiva {$I-} y para habilitarla {$I+}, así se puede percibir cualquier error producido y que el programa no se bloquee durante su ejecución. A través de este procedimiento lo que se consigue es sacar por pantalla la pregunta con su correspondientes respuesta. Esto se hace con un esquema iterativo condicional: REPEAT-UNTIL: realiza por lo menos una vez la acción que encierra el bucle y se hará hasta que se cumpla la condición de introducir correctamente el parámetro. - DibujaMatriz, procedimiento que en su lista de parámetros contiene un parámetro de entrada-salida y otro de entrada. El primero, llamado m, es un array que representa la matriz y el segundo un integer que representa el tablero. Mediante dos bucles FOR-DO y dos índices i y j, se va dibujando la matriz. - PedirLado, procedimiento que pregunta al usuario el tamaño del tablero. Contiene un parámetro de salida de tipo integer en el que se guardará el tamaño del tablero. También contiene la función IOResult con sus directivas comentadas anteriormente; y un esquema iterativo condicional:REPEAT-UNTIL. - Aleatoriedad, procedimiento que representa la probabilidad de que una casilla esté viva al inicio del juego, válida tanto si se elige mundo plano como toroidal. Contiene dos parámetros, dos de entrada de tipo integer y otro de entrada- salida de tipo array. Aquí se emplea la función Random para devolver un valor aleatorio entre 0 y 1 que se lo asigna a la variable prob, de tipo integer. Se emplean dos bucles FOR-DO para ir recorriendo la matriz, tanto plana como toroidal y en función de la respuesta obtenida en el procedimiento Pregunta, se entra a un esquema de composición condicional. IF-THEN-ELSE u otro. - Mensaje, procedimiento que indica al usuario que presione la tecla intro para volver al menú principal y con ello que vea poco a poco la ejecución del programa. Se pone como procedimiento porque a lo largo de la práctica se repite varias veces y así se consigue mayor claridad. - Generar_mundo_aleatorio, procedimiento al que se le pasan como parámetros de entrada - salida, el tamaño del tablero y la matriz y como parámetro de entrada la respuesta del procedimiento Pregunta. Se hacen llamadas a PedirLado, Aleatoriedad, DibujaMatriz y Mensaje, con ello se conseguirá dibujar la matriz aleatoriamente con el tamaño del lado que haya elegido el usuario. - EstaViva, procedimiento que contiene una lista de seis parámetros, los índices iv, jv son índices de entrada - salida al igual que el array mtv porque se usa la información de la matriz a la entrada y se necesita saber si después en la ejecucion sigue viva, muerta o por el contrario vive la célula. Después de varios esquemas de composición condicional, IF-THEN-ELSE, se compara el contador, cont, con los parámetros de entrada "y" y "z" para cambiar o no el estado de la célula. - EstaMuerta, procedimiento que contiene una lista de cinco parámetros, aquí se indica que si el vector que está en la posición im, jm es un cero o un uno (muerta o viva respectivamente) para que después en la ejecución se sepa si sigue viva, muerta o nace. Después de varios esquemas de composición condicional, IF-THEN-ELSE, se compara el contador, contm, con el parámetro de entrada "x" para cambiar o no el estado de la célula. - Caso0, procedimiento que representan los bordes del tablero del mundo plano para dibujarlos con ceros. - Caso1, procedimiento que estudia los casos que están en el centro del tablero mirando sus células vecinas. Para ello se utilizan varios esquemas de composición condicional. IF-THEN-ELSE: que permite elegir entre dos acciones distintas, si el vector de la matriz es 1 ó 0. - Caso2a, procedimiento que estudia el caso de la célula situada en la esquina superior izquierda del tablero. - Caso2b, procedimiento que estudia el caso de la célula situada en la esquina superior derecha del tablero. - Caso2c, procedimiento que estudia el caso de la célula situada en la esquina inferior izquierda del tablero. - Caso2d, procedimiento que estudia el caso de la célula situada en la esquina inferior derecha del tablero. - Caso2e, procedimiento que estudia los casos de las células situadas en las casillas de enmedio de la primera fila del tablero. - Caso2f, procedimiento que estudia los casos de las células situadas en las casillas de enmedio de la última fila del tablero. - Caso2g, procedimiento que estudia los casos de las células situadas en las casillas de enmedio de la última columna del tablero. - Caso2h, procedimiento que estudia los casos de las células situadas en las casillas de enmedio de la primera columna del tablero. - Caso2, procedimiento que hace llamadas a los casos anteriormente citados para representar la matriz toroidal. - Cargar_mundo, función que tiene un parámetro de entrada de tipo string, que es el nombre del fichero y devuelve otro string que representa una cadena de texto con cada fila separada por el caracter '|'. Comienza asociando el nombre del fichero al fichero de texto y a continuación lo inicia en lectura, para leerlo linea a linea. - cargar_estado_inicial, procedimiento que contiene el parámetro de entrada- salida mundo, de tipo string. Con el contador c se indica el número de espacios que hay antes de que empiece la cadena de texto, tres epacios. Pide el fichero a cargar, que por defecto se llama inicial.txt, y lo usa como el nuevo estado inicial del juego. también indica el número que hay en las posiciones 8 y 25. - GuardaEstadoInicial, procedimiento en el que se pasa de una cadena de texto a una matriz 10 x 11. Se ponen 11 columnas porque también se representa el carácter '|'. Después de cargar el estado inicial, mediante su correspondiente llamada, se emplean 2 bucles FOR-DO para guardar la nueva matriz. - NombreFichero, procedimiento que tiene como lista de parámetros, 2 de entrada-salida y uno de salida de tipo integer. La primera opción que se da al usuario es si quiere guardar los datos en un fichero. Si la respuesta es que sí, se pregunta si quiere guardarlos en el fichero por defecto, log.bin, lo asigna y lo abre en modo lectura. Si es que no, pide el nombre del fichero, lo asigna y lo abre en modo lectura y escritura. - SonIguales, procedimiento que indica si dos estados son iguales,para ello va comparando los valores de la matriz con los valores del string. - GuardaFichero, procedimiento que convierte una matriz dada en un string para guardarla en el fichero de strings. - AbreFichero, procedimiento en el que se le pasa como parámetro de entrada salida el fichero de strings,se lo asigna al nombre del fichero y se inicia en lectura. Mientras no sea final de fichero se va leyendo del fichero la cadena de string. El objetivo de este procedimiento es estudiar si el sistema es estable o por el contrario existe una extinción. - PedirTurnos, procedimiento que pregunta al usuario el número de turnos que desea jugar y lo devuelve mediante un parámetro de salida de tipo integer. - PedirDatos, procedimiento en el que el usuario tiene la posibilidad de cambiar o no las reglas por defecto. - PedirModo, procedimiento que pregunta al usuario si quiere que se muestre por pantalla el estado final o solo el último estado generado, y devolverá la respuesta en un parámetro de salida de tipo integer. En estos tres últimos procedimientos, el chequeo de entrada/salida está inhabilitado mediante la directiva {$I-} y para habilitarla {$I+}, así se puede percibir cualquier error producido y que el programa no se bloquee durante su ejecución. A través de estos procedimientos lo que se consigue es sacar por pantalla las preguntas con sus correspondientes respuesta. Esto se hace con un esquema iterativo condicional: REPEAT-UNTIL. - Calculos_Ejecucion, procedimiento que realiza las llamadas a los procedimientos caso0 y caso1 si el mundo es plano. Por el contrario, si el mundo es toroidal hace la llamada al caso2. - Bucle_Calculos, procedimiento que en función de si una célula está viva o muerta realiza los cálculos paa realizar la ejecución, haciendo las llamadas correspondientes a los procedimientos EstaViva o Estamuerta según sea el caso. - Ejecucion, procedimiento que hace las llamadas a los tres procedimientos anteriores y dependiendo del modo que se haya elegido para ejecutar, se entrará en una opción u otra del esquema de selección por casos: CASE OF. - Para elegir la opción del menú de salir del programa, es decir, terminar el juego, se ha construido el procedimiento Ssali, sin ningún parámetro. - Con el procedimiento DibujaMenu, se da las diferentes opciones presionando el número de la deseada y guardándola en un parámetro entrada-salida de tipo integer. - Comprueba, función booleana que indica si el usuario ha entrado previamente en la opción 1 ó 3 del menu; y sino ha entrado sale el menú. - El último procedimiento es Menu. Hace una llamada a DibujaMenu y según la opción seleccionada entra en una opción u otra del esquema de seleccion por casos CASE OF. {PROGRAMA PRINCIPAL} Las variables que se usan en el programa principal son siete simples escalares de tipo integer y tres de tipo estructurado (un string y dos arrays). La llamada al procedimiento Randomize se utiliza para inicializar el generador de números aleatorios. Dentro de un esquema de composición iterativo condicional: REPEAT-UNTIL se llama al procedimiento menu hasta que se cumple la condicion de que el numero sea igual a cuatro, es decir, que el usuario elija la opción de terminar el juego. ---------------------------- (añadido tras someter) ---------------------------- 22:41:51 11/12/09 -> Segun los datos introducidos los ficheros son: G10P02D2 -> Los autores del trabajo son: GARCIA PARACUELLOS, ELENA SANCHO CUBERO, AINHOA Nombres originales de los archivos entregados -> G10P02D2.PAS, G10P02D2.txt