JUEGO DE LA VIDA PROGRAMA REALIZADO POR: EDUARDO RUIZ DEL RINCON NIA->620713 RADU AZARE JORZA NIA -> 574733 Program juegovida; uses crt; type {Creamos los vectores que contendran los datos, Tres es el vector sobre el que se modificaran los valores de las casillas y que despues se copiaran en Tmalla} Tmalla=array[1..20,1..20] of integer; Tres=array[1..20,1..20] of integer; {Modulo que te da como valor un numero aleatorio entre 1 y 10} procedure vida (var porc:integer); begin porc:=random(10)+1; end; {Modulo que le asigna un valor inicial a todas las casillas del vector Tmalla, en este caso el valor 0} procedure inicmalla(var mall:Tmalla); var i,j:integer; begin for i:=1 to 20 do for j:=1 to 20 do begin mall[i,j]:=0; end; end; {Procedimiento que nos muestra por pantalla el valor de las casilla del vector Tmalla} procedure tablero(cas:integer; mall:Tmalla); var i,j:integer; begin writeln; writeln('1.- celdas vivas'); writeln('0.- Celdas muertas'); writeln; for i:=1 to cas do for j:=1 to cas do begin if mall[i,j]=1 then textcolor(10); if j=cas then writeln(mall[i,j]) else write(mall[i,j]); textcolor(7); end; end; {Modulo que iguala los valores de las casillas del vector Tmalla, con los valores del vector Tres} procedure igualarmall(cas:integer; var mall:Tmalla;var res:Tres); var i,j:integer; begin for i:=1 to cas do for j :=1 to cas do mall[i,j]:=res[i,j] end; {Modulo que iguala los valores del vector Tres, con los del vector Tmall} procedure igualarres(cas:integer; var mall:Tmalla;var res:Tres); var i,j:integer; begin for i:=1 to cas do for j :=1 to cas do res[i,j]:=mall[i,j] end; {Funcion que calcula la suma del valor de las casillas vecinas} function suma(i,j:integer;var mall:Tmalla):integer; var cruz,esquinas:integer; begin cruz:=(mall[i-1,j]+mall[i+1,j]+mall[i,j-1]+mall[i,j+1]); esquinas:= (mall[i-1,j+1]+mall[i+1,j+1]+mall[i-1,j-1]+mall[i+1,j-1]); suma:=cruz+esquinas end; {Procedimiento que te iguala los valores de Tres con los de Tmalla y en función del valor de la celda de Tmalla y de las reglas establecidas en el juego, modifica el valor de la celda del vector Tres. Finalmente se igualan los valores de Tmalla con los del vector Tres} procedure reglas(cas,x,y,z:integer; var mall:Tmalla; var res:Tres); var i,j:integer; begin igualarres(cas,mall,res); for i:=2 to cas-1 do for j:=2 to cas-1 do begin if (mall[i,j]=0) and (suma(i,j,mall)=x) then res[i,j]:=1 else if (mall[i,j]=1) and (suma(i,j,mall)z) then res[i,j]:=0 else res[i,j]:=mall[i,j]; end; igualarmall(cas,mall,res); end; {Procedimiento en el que se piden el numero de celdas por lado que tendrá el vector Tmalla, y la probabilidad para que cambie el valor de las casillas al iniciar el juego. Dependiendo del valor aleatorio que asigne el procedimiento vida se modificaran los valores de las celdas excepto de aquellas que estén en los bordes del vector Tmalla} procedure aleatorio(var cas, prob:integer ;var mall:Tmalla); var porc,i,j:integer; begin inicmalla(mall); repeat write('Escribe el numero de casillas por lado del tablero (entre 4 y 20): '); {$I-} readln(cas); {$I+} until((IOResult=0) and (cas>3) and (cas<21)); repeat write('Probabilidad de casillas vivas (del 1 al 9): '); {$I-} readln(prob); {$I+} until((IOResult=0) and(prob>0) and(prob<10)); for i:=2 to cas-1 do for j:=2 to cas-1 do begin vida(porc); if porc<=prob then mall[i,j]:=1; end; end; {Modulo que pide los valores de las reglas del juego} procedure reglasjuego(var x,y,z:integer); var op:integer; begin ClrScr; repeat writeln; writeln('Introduzca los valores de las reglas:'); writeln('1.-Valores por defecto (x=3, y=2, z=3)'); writeln('2.-Dar nuevos valores'); {$I-} readln(op); {$I+} until ((IOResult=0)and (op=1) or(op=2)); if op = 1 then begin x:=3; y:=2; z:=3 end else begin repeat write('Escribe los valores de x, y, z. (Entre 1 y 8, y menor o igual que z): '); {$I-} readln(x,y,z); {$I+} until ((IOResult=0) and(y<=z) and (x>0)and(x<9)and(y>0)and(z>0)and(z<9)) end; end; {Modulo en el que se elige el modo de ejecucion del juego} procedure modo(turno,cas,x,y,z:integer; var mall:Tmalla; var res:Tres); var op,i:integer; begin i:=1; repeat writeln; writeln('Elige el modo de ejecucion: '); writeln('1.- Paso a paso'); writeln('2.- Solo resultados'); {$I-} readln(op); {$I+} until ((IOResult=0) and (op=1) or (op=2)); if op =1 then begin while i<= turno do begin reglas(cas,x,y,z,mall,res); tablero(cas,mall); readln; i:=i+1; end; end else begin while i<= turno do begin reglas(cas,x,y,z,mall,res); i:=i+1 end; tablero(cas,mall); readln end; end; {Procedimiento que pide los datos para ejecutar el juego (turnos, reglas, modo ejecución)} procedure ejecucion(cas:integer; var mall:Tmalla; var res:Tres); var turno,x,y,z:integer; begin writeln(' Ejecucion'); writeln; repeat write('Escribe el numero de turnos: '); {$I-} readln(turno); {$I+} until ((IOResult=0) and (turno>0)); reglasjuego(x,y,z); modo(turno,cas,x,y,z,mall,res); end; {Función que pasa caracteres a numeros de tipo integer} function CharToInt(caracter:char):integer; begin CharToInt:=Ord(caracter)-48; end; {Procedimiento que carga un esta inicial guardado en un fichero; primero lee los numeros del fichero y los guarda en un string que al principio es inicializado para que contenga 1 solo caracter (si volvemos a cargar otro estado inicial de esta manera borra el esta inicial anterior), luego se asigna cada caracter a su lugar dentro del vector Tmalla utilizando la función CharToInt, 'i' y 'j' para recorrer el vector y 'n' para recorrer el string('n' se inicializa a 2 para omitir el caracter inicial)} procedure cargar_mundo(nombreFich:string;var l:Tmalla;var cas:integer); var fichero:text; linea:string; mundo:string[200]; i,j,n: integer; begin mundo:='a'; assign(fichero,nombreFich); {$I-} Reset(fichero); {$I+} if IOResult<>0 then begin writeln('Fichero no encontrado'); writeln('Pulse enter para volver al men£'); end else begin while not eof(fichero) do begin Readln(fichero,linea); mundo:=mundo+linea; end; cas:=length(linea); n:=2; for i:=1 to cas do for j:=1 to cas do begin l[i,j]:=(CharToInt(mundo[n])); n:=n+1 end end end; {Modulo que te muestra en pantalla un menu para elegir las opciones convenientes} procedure menu(var op:integer); begin repeat writeln(' JUEGO DE LA VIDA'); writeln; writeln('Elija una opcion:'); writeln('1. Generar mundo aleatorio'); writeln('2. Ejecucion'); writeln('3. Cargar estado inicial'); writeln('4. Salir'); {$I-} readln(op); {SI+} until((IOResult=0) and (op>0) and (op<5)); end; {Programa principal que repite la ejecucion de los procedimientos anteriores hasta que el jugador elige la opcion de salir} var prob, casilla, opcion, turno:integer; mall:Tmalla; res:Tres; nombreFich:string; begin Randomize; inicmalla(mall); repeat menu(opcion); case opcion of 1: begin aleatorio(casilla, prob, mall); tablero(casilla, mall); readln end; 2: ejecucion(casilla, mall,res); 3: begin write('Introduce el nombre del fichero (escribe la terminacion, ej:.txt): '); readln(nombreFich); cargar_mundo(nombreFich,mall,casilla); tablero(casilla,mall); readln end; end; ClrScr; until opcion=4 end. ---------------------------- (añadido tras someter) ---------------------------- 20:37:32 11/12/09 -> Segun los datos introducidos los ficheros son: G05P03D2 -> Los autores del trabajo son: Ruiz del Rincon, Eduardo Azare Jorza, Radu Nombres originales de los archivos entregados -> JUEGOvida.PAS, juegovida.txt