El juego de la vida Autor: José Luis Sevillano Royo nº:615583 La estrucura la he basado en 3 procedimientos principales, que hacen uso de otros, para poder resolver el juego de la manera mas sencilla. >>1º,Este es a groso modo el programa principal, una vez aqui hacemos llamamiento a todos los procedimientos que necesitamos: -Determinamos las mallas (tablero) -Inicializamos el tablero. -Ponermos en marcha Randomize -Comenzamos el juego Program El_juego_de_la_vida; type Tmalla1=array[1..20,1..20] of integer; Tmalla2=array[1..20,1..20] of integer; var nop,casilla,probabilidad:integer; malla:Tmalla1; resultado:Tmalla2; archivo:string; begin Randomize; iniciar_malla(malla); Writeln('Bienvenido al juego de la vida'); writeln(''); repeat repeat Writeln('Elija una opcion:'); Writeln('1-Generar mundo aleatorio.'); Writeln('2-Ejecucion.'); Writeln('3-Cargar estado inicial.'); Writeln(''); Writeln('4-salir'); {$I-} readln(nop); {$I+} until((IOresult=0) and (nop<5) and (nop>0)); Case nop of 1: generar_mundo_aleatorio(casilla,probabilidad,malla); 2: ejecucion(casilla,malla,resultado); 3: cargar_estado_inicial(archivo); end; Until nop=4; end. >>Procedimiento de inicializar malla procedure iniciar_malla(var malla:Tmalla1); var x,y:integer; begin for x:=1 to 20 do for y:=1 to 20 do begin malla[x,y]:=0; end; end; >>2º, Primer procedimiento importante, este hace llamamiento a otro procedimientos, procedure generar_mundo_aleatorio(var casilla,probabilidad:integer; var malla:Tmalla1); begin mundo_aleatorio(casilla, probabilidad,malla); tablero(casilla,malla) end; >>Este procedimiento nos genera la forma fisica del tablero y la probabilidad de casillas ''vivas o muertas'' procedure mundo_aleatorio(var fyc,pro:integer;var mal:Tmalla1); var porcentaje,x,y:integer; begin iniciar_malla(mal); repeat writeln('Cuantas filas y columnas quieres que tenga tu tablero?'); writeln('desde 4 hasta 20'); {$I-} readln(fyc); {$I+} until((Ioresult=0) and (fyc<21) and (fyc>3)); repeat writeln('Que probabilidad de casillas vivas quieres?'); writeln('entre 1 y 9'); {$I-} readln(pro); {$I+} until((Ioresult=0) and (pro<10) and (pro>0)); for x:=2 to fyc-1 do for y:=2 to fyc-1 do begin crear_vida(porcentaje); if porcentaje<=pro then mal [x,y]:=1; end; end; >>Este procedimiento nos genera las casillas 1 o 0, aleatoriamente. procedure crear_vida(var porcentaje:integer); begin porcentaje:=random(10)+1; end; >> Este procedimiento nos muestra en la pantalla la forma que tiene el tablero, con sus celdas ''vivas y muertas'' procedure tablero(fyc:integer;malla:Tmalla1); var x,y:integer; begin for x:=1 to fyc do for y:=1 to fyc do begin if y=fyc then writeln(malla[x,y]) else write(malla[x,y]) end; end; >>3º, Segundo procedimiento importante, este hace llamamiento a otros: -En esta parte se piden los turnos. -Se pueden modificar las reglas del juego, procedure ejecucion(casilla:integer;var malla:Tmalla1;var resultado:Tmalla2); var turnos,x,y,z,regla:integer; begin writeln('Ejecucion:'); writeln(''); repeat writeln('Cuantos turnos quieres?'); {$I-} readln(turnos); {$I+} until((Ioresult=0) and (turnos>0)); writeln('Reglas del juego: '); repeat writeln('1-Por defecto (X=3)(Y=2)(Z=3)'); writeln('2-Valores nuevos'); {$I-} readln(regla); {$I+} until((IOresult=0) and (regla=1) or (regla=2)); Case regla of 1:begin x:=3;y:=2;z:=3; end; 2:begin writeln('Escribe los nuevos valores para X,Y,Z'); repeat writeln('X:entre 1 y 8'); {$I-} readln(x); {$I+} until((IOresult=0)) and (x<9) and (x>0); repeat writeln('Y:entre 1 y 8'); {$I-} readln(Y); {$I+} until((IOresult=0)) and (y<9) and (y>0); repeat writeln('Z:menor o igual que Y'); {$I-} readln(Z); {$I+} until((IOresult=0)) and (z<=y) and (z>0); end; end; modo(turnos,casilla,x,y,z,malla,resultado) end; >> Con este procedimiento utilizamos la 2ª malla para almacenar el resultado, podermos hacer la alternandcia de los turnos y determinar el estado de cada casilla. procedure juego(casilla,x,y,z:integer;var malla:Tmalla1;var resultado:Tmalla2); var i,j,a,b,f,g:integer; begin begin for a:=1 to casilla do for b:=1 to casilla do resultado[a,b]:=malla[a,b] end; begin for i:=2 to casilla-1 do for j:=2 to casilla-1 do begin if (malla[i,j]=0)and (suma(i,j,malla)=x) then resultado[i,j]:=1 else if (malla[i,j]=1) and (suma(i,j,malla)z) then resultado[i,j]:=0 else resultado[i,j]:=malla[i,j]; end; end; begin for f:=1 to casilla do for g:=1 to casilla do malla[f,g]:= resultado[f,g] end; end; function suma(i,j:integer;var malla:Tmalla1):integer; var esquinas, diagonal:integer; begin esquinas:=(malla[i-1,j+1]+malla[i+1,j+1]+malla[i-1,j-1]+malla[i+1,j-1]); diagonal:=(malla[i-1,j]+malla[i+1,j]+malla[i,j-1]+malla[i,j+1]); suma:=esquinas+diagonal; end; >>En este procedimieno, se determina si el resultado del juego lo quieres ver paso a paso o simplemente el resultado final, para ello se hace llamamiento a las funciones juego y tablero. procedure modo (turnos,casilla,x,y,z:integer;var malla:Tmalla1;var resultado:Tmalla2); var cont, modo: integer; begin cont:=1; writeln('Como quieres ejecutar el programa?'); repeat writeln('1-Paso a Paso'); writeln('2-Resulatado Final'); {$I-} readln(modo); {$I+} until((IOresult=0) and (modo=1) or (modo=2)); Case modo of 1:begin while cont<=turnos do begin juego(casilla,x,y,z,malla,resultado); tablero(casilla,malla); readln; cont:=cont+1; end; end; 2:begin while cont<=turnos do begin juego(casilla,x,y,z,malla,resultado); cont:=cont+1 end; tablero(casilla,malla); readln; end; end; end; >>4º, Tercer procedimiento importante, deberia cargar un estado incial desde un fichero (no esta hecho) procedure cargar_estado_inicial(var archivo:string); begin writeln('Escribe el directorio del archivo a cargar:'); readln(archivo); end; ---------------------------- (añadido tras someter) ---------------------------- 21:50:47 11/12/09 -> Segun los datos introducidos los ficheros son: G05P05D2 -> Los autores del trabajo son: Sevillano Royo, Jose Luis Nombres originales de los archivos entregados -> JoseLuis.PAS, joseluis.txt