Práctica de diseño D2: 'EL JUEGO DE LA VIDA' Grupo: G12P08 Componentes: Angulo Sánchez, Jesús García Martínez, Belén Para realizar el diseño del programa e intentar simplificarlo, se han definido en el apartado tipos del programa una serie de vectores y registros que, combinados entre sí, facilitando su desarrollo. Procedimiento lado. Este procedimiento ha sido creado para pedir por pantalla que el usuario introduzca el número de casillas por lado que desea que tenga el tablero. Lo que introduce el usuario por pantalla está sujeto a una serie de restricciones (no ser carácter y estar entre 4 y 20, iclusive). Se utiliza un bucle while-do con IOResult (junto a las expresiones {$I-} y {$I+}) que nos avisa con un mensaje de error si lo que introduce el usuario no es correcto. De esta manera se asegura la robustez del programa. Procedimiento probabilidad. Este procedimiento es análogo al anterior, con la diferencia de que en este caso se pedirá por pantalla que el usuario introduzca la probabilidad de que una célula esté viva en un principio. Al final del procedimiento, el número introducido por el usuario se divide entre 100 para poder compararlo con el aleatorio que nos dará la función random dentro de la funcion vida_aleatoria. Función aleatorio. Da como resultado un aleatorio de la función random (un real entre 0 y 1). Función vida_aleatoria. Función booleana que compara la probabilidad introducida por el usuario con la que ofrece la función aleatorio. Procedimiento generar_aleatorio. Procedimiento que inicialmente llama a los procedimientos definidos anteriormente lado y probabilidad. En el procedimiento se utilizan dos estructuras anidadas for-to-do con dos índices j e i con los que se van a recorrer las filas y las columnas respectivamente, de la matriz para ir comprobando si en cada posición va a haber una célula muerta (0) o viva (1). Dentro de estas estructuras van otras if-then-else también anidadas entre sí. Primero, hay que asegurarse de que todas las células del marco están siempre muertas, como se exige en las normas del juego, con una estructura if-then-else que da cabida a todas las posiciones del marco en las que se establecerán siempre 0. Para el resto de posiciones se utiliza otra estructura if-then-else anidada a la anterior, en la que se llama a la función vida_aleatoria que si resulta ser true establecerá en la posición correspondiente una célula viva (1), de lo contrario una muerta (0). Procedimiento numturnos. También sigue la misma estructura que los procedimientos lado y probabilidad en cuanto a robustez. En este caso, lo que se pide al usuario que introduzca por pantalla es el número de turnos con el que desea que se desarrolle la ejecución del juego. Procedimiento x. Procedimiento y. Procedimiento z. Son tres procedimientos análogos entre sí. El primero sirve para pedir por pantalla que el usuario introduzca el número de células vecinas vivas que desea que tenga cada célula muerta para nacer. En el segundo procedimiento, se pide por pantalla que se escriba el número mínimo de células vecinas vivas que debe tener una célula viva para seguir viva. En el procedimiento z, se pide al usuario el número máximo de células vecinas vivas que debe tener una célula viva para seguir viva. En los tres casos se utiliza una estructura while-do delimitada por las expresiones {$I-} y {$I+} con IOResult, que contribuye a dar robustez al programa y que dará por pantalla un mensaje de error si se introduce por parte del usuario un valor erroneo.Tambien se restrige el valor de Z a que sea mayor o igual que Y para, posteriormente no incurrir en un error en la comparacion de Y y Z con el numero de vecinas vivas. Función modo. Función booleana que sirve para elegir el modo en el que se va a llevar a cabo la ejecución del juego. Por pantalla se pedirá al usuario que introduzca[ Y ] si sólo desea ver el resultado final o[ N ] si lo desea ver paso a paso. Se ha introducido la función Upcase para evitar diferenciar entre mayúscula y minúscula en la respuesta del usuario. Procedimiento reglas. pide al usuario que introduzca[ y ] o [ N ] segun quiera introducir nuevos coeficientes para las reglas o jugar con los preestablecidos(por defecto). La primera opcion da paso la ejecucion de los procedimientos x, y y z. La segunda asigna los valores por defecto a los coeficientes X,Y,Z de las reglas. Función vecinas. Dada una casilla (célula), devuelve un entero que corresponde a la suma de los contenidos de las ocho casillas (células) de su alrededor. Como estos contenidos van a ser siempe ceros y unos, el número resultante será el número de células vecinas vivas que tenga dicha célula. Procedimiento juego. Se utilizan dos estructuras anidadas for-to-do con dos índices diferentes para recorrer la matriz por sus filas(j) y columnas(i). Se inicializan todas las posiciones de la matriz a cero. Se asigna a una variable interna( v ) el resultado de la función vecinas. Con una estructura Ifnot-then, se desechan los marcos y con otra anidada a esta, se contemplan las posibilidades de que una célula viva o no teniendo en cuenta si la celula esta viva o muerta y en cada caso la comparacion entre X o Z e Y con el numero de vecinas( v ). Procedure pintar. Pinta el tablero. Recorre la matriz con dos índices j e i para filas y columnas respectivamente, con dos estructuras anidadas for-to-do, y va pintando lo que corresponde a cada casilla.Si esta muerta 0 en color rojo o si esta viva 1 en color verde. Procedure ejecucion. Llama inicialmente a los procedimientos numturnos y reglas. Compara una variable interna booleana, que está inicializada a true, con el resultado de la función modo.pinta el tablero inicial. A continuacion, utilizando una estructura for-to-do con otra if-then-else, si modo es false, se llama al procedimiento pintar para pintar sólo el tablero final, en el caso de que modo sea true y el usuario, por consiguiente, haya decidido que desea ver el juego paso a paso se pinta el tablero en cada turno, anidado a esta estructura hay otra if-then-else, aue sirve para sacar por pantalla si es el tablero final o el numero de turno. Procedure introduccion. Simplemente saca por pantalla una pequeña explicación general del juego. Función menu. Escribe por pantalla las posibles opciones que se le dan al usuario para elegir a la hora de jugar. Se le pide que introduzca ese número por pantalla. Como siempre, que el usuario elige algo, hay restricciones, en este caso dos. La primera para elegir el número de la opción, la segunda para el caso en el que inicialmente se escoja la opción 2, que no se puede elegir si antes no se ha elegido la 1 o la 3. Para el primero se utiliza una estructura repeat-until,para el segundo while-do, y en ambas la presencia de IOResult y, por lo tanto, de las expresiones {$I-} {$I+} para dar robustez al programa. Declaración de variables del programa principal. El haber definido en el apartado tipos del programa los vectores y registros anteriores, ayuda a simplificarlo y esto queda reflejado, por ejemplo, en la declaración de variables en el programa principal(una por registro mas opcion). Cuerpo del programa principal. Se llama al procedimiento introduccion. Con una estructura repeat-until se desarrolla todo el juego (hasta que se elija en el menú la opción 4 que es la que invita a salir). Dentro de esta estructura, se llama a la función menu a la que se asigna una variable(opcion). Con dos estructuras if-then diferenciadas se distingue el caso de que esta variable sea 1 (caso en el que se llama a los procedimientos generar_aleatorio y ejecucion), que sea 2 (caso en el que sólo se llama a ejecucion) o que sea 3 (todavía sin desarrollar). ---------------------------- (añadido tras someter) ---------------------------- 21:11:03 11/12/09 -> Segun los datos introducidos los ficheros son: G12P08D2 -> Los autores del trabajo son: Angulo Sánchez, Jesús García Martínez, Belén Nombres originales de los archivos entregados -> VIDA.PAS, Juego_de_la_vida.txt