(* ANALISIS DEL RISK ----------------- EL programa demuestra que en un combate de risk donde el atacante tiene 3 dados y el defensor 2. El atacante tiene mas casos favorables para ganar que el defensor. Ademas tiene un pequeño simulador de combate donde puedes poner el numero de ejercitos que quieras. ¿Que porque hacer esto? Bueno, en vez hacer la aburrida hoja de ejercicios de la clase de programacion, hago esto que es mas divertido y me permite aprender igual. Este codigo es libre. ¿Dudas, sugerencias, criticas?-> learnez666@hotmail.com Code by: Videador *) program AnalisisRisk; type enlace=^nodo; nodo= Record num:integer; sig: enlace; End; type matriz = array[1..5] of integer; var inicio:^nodo; resultado,numejerca,numejercd:integer; empates,ganadef,ganatac:integer; opcion:char; verj:char; (*Para indicar a Simulacion que se quiere ver jugada a jugada.*) (* Delvuelve: 1. Gana atacante. 2. Gana defensor. 3. Empate. *) function AnalisisJugada(nums:matriz):integer; var i,iaux,a1,a2,d1,d2:integer; begin (*Coger dos mayores atacante.*) a1:=0; i:=1; while i<=3 do begin if a1i) then begin a2:=nums[i]; end; i:=i+1; end; if nums[4]>nums[5] then begin d1:=nums[4]; d2:=nums[5]; end else begin d1:=nums[5]; d2:=nums[4]; end; if (a1>d1) and (a2>d2) then (*Gana atacante.*) AnalisisJugada:=1 else if (a1<=d1) and (a2<=d2) then (*Gana defensor.*) AnalisisJugada:=2 else (*Empate.*) AnalisisJugada:=3; end; (*Creamos dinamicamente, las jugadas*) procedure MostrarVar(inicio,puntero:enlace;n:integer;var empates,ganadef,ganatac:integer); var jugada:matriz; lector:^nodo; i,f,res:integer; (*f, indice para array jugadam, res para el resutlado del analisis de la jugada.*) begin (*Si nos han pasado el ultimo escribimos.*) if puntero^.sig=Nil then begin for i:=1 to n do begin write('('); lector:=inicio; f:=1; (*while lector^.sig<>Nil do*) (*Almacenamos la jugada en el array jugada para analizarla.*) while lector<>puntero do begin write(lector^.num,','); (*f es el indice para el array de la jugada.*) jugada[f]:=lector^.num; f:=f+1; lector:=lector^.sig; end; write(lector^.num,')'); jugada[5]:=lector^.num; lector^.num:=lector^.num+1; res:=AnalisisJugada(jugada); if res=1 then begin ganatac:=ganatac+1; writeln('Gana Atacante ',ganatac); end else if res=2 then begin ganadef:=ganadef+1; writeln('Gana Defensor ',ganadef); end else begin empates:=empates+1; writeln('EMPATE ',empates); end; end; lector^.num:=1; end else begin (*Pasamos al siguiente elemento.*) (*puntero:=puntero^.sig;*) for i:=1 to n do begin MostrarVar(inicio,puntero^.sig,n,empates,ganadef,ganatac); (*Sumamos*) puntero^.num:=puntero^.num+1; end; (*Volvemos a uno, ya que hay que volver a escribirlo*) puntero^.num:=1; end; end; procedure CrearVariaciones(n,m:integer;inicio:enlace;var empates,ganadef,ganatac:integer); var lector,aux:^nodo; (*Variable para crear y leer elemetos.*) iL:integer; begin new(inicio); inicio^.num:=1; inicio^.sig:=Nil; iL:=1; lector:=inicio; while m>iL do begin new(lector^.sig); lector:=lector^.sig; lector^.num:=1; lector^.sig:=Nil; iL:=iL+1; end; (*Una vez que hemos creado los m elementos. Queremos mostrarlos.*) MostrarVar(inicio,inicio,n,empates,ganadef,ganatac); (*Liberamos memoria*) if inicio^.sig=Nil then (*Si solo hay uno, lo borramos.*) dispose(inicio) else begin (*lector^.sig sera distinto a la primera.*) lector:=inicio; while lector^.sig<>Nil do begin (*aux va borrando una por detras.*) aux:=lector; lector:=lector^.sig; dispose(aux); end; (*borramos la ultima.*) dispose(lector); end; end; (******) procedure Simulacion(ejercito_a,ejercito_b:integer;verjugada:boolean); var dado:integer; jugada:matriz; res:integer; begin Randomize; while (ejercito_a>3) And (ejercito_b>3) do begin jugada[1]:=random(5)+1; jugada[2]:=random(5)+1; jugada[3]:=random(5)+1; jugada[4]:=random(5)+1; jugada[5]:=random(5)+1; res:=AnalisisJugada(jugada); write('ATAC: ',jugada[1],',',jugada[2],',',jugada[3],'DEF:',jugada[4],',',jugada[5],' '); if res=1 then begin ejercito_b:=ejercito_b-2; write('GANA ATACANTE. '); end else if res=2 then begin ejercito_a:=ejercito_a-2; write('GANA DEFENSOR. '); end else begin ejercito_b:=ejercito_b-1; ejercito_a:=ejercito_a-1; write('HAY EMPATE. '); end; writeln('Tanteo-> Atacante:',ejercito_a,' Defensor:',ejercito_b); if verjugada then readln(); end; if ejercito_a<=3 then writeln(' PIERDE ATACANTE ') else if ejercito_b<=3 then writeln(' PIERDE DEFENSOR ') end; begin while opcion<>'3' do begin writeln(''); writeln('*****************************'); writeln('* ANALISIS DE RISK BETA 0.1 *'); writeln('*****************************'); writeln('Para peticion del codigo fuente: correobasura666@hotmail.com '); writeln(''); writeln('ELIJA OPCION:'); writeln('1. De todas las posibles jugadas, quien tiene mas posibilidades de ganar.'); writeln('2. Simulacion de combate.'); writeln('3. Salir.'); writeln(''); readln(opcion); if opcion='1' then begin inicio:=nil; empates:=0; ganadef:=0; ganatac:=0; CrearVariaciones(6,5,inicio,empates,ganadef,ganatac); writeln('Gana Atacante: ',ganatac); writeln('Gana Defensor: ',ganadef); writeln('Gana Empate: ',empates); writeln('Posibilidades totales:',6*6*6*6*6); writeln(' '); end else if opcion='2' then begin writeln('SIMULACION: '); writeln('Nota: El formato de las jugadas es el siguiente:'); writeln('(DadoAtacante,DadoAtacante,DadoAtacante,DadoDefensor,DadoDefensor'); writeln('Otra cosa importante, el combate termina cuando un de los dos llega a 3'); writeln('ejercitos. Ya que si a alguno de los ejercitos les queda menos de 3 tropas '); writeln('tiran menos dados, la variacion de dados no esta implementada.'); writeln('Sacad vuestras propias conclusiones de los analisis.'); writeln(' '); writeln('Introduzca grueso del ejercito atacante:'); readln(numejerca); writeln('Introduzca grueso del ejercito defensor:'); readln(numejercd); writeln('¿Desea ver jugada a jugada? (y/n)'); readln(verj); while (verj<>'y') and (verj<>'n') do readln(verj); if verj='y' then Simulacion(numejerca,numejercd,TRUE) else Simulacion(numejerca,numejercd,FALSE); end; readln(); end; writeln('Fin de Programa'); readln(); end.