buscaminas en pascal

Iniciado por bmaleke, 22 Junio 2015, 08:06 AM

0 Miembros y 1 Visitante están viendo este tema.

bmaleke

[MOD]: Usa las etiquetas para insertar código, lee las normas del subforo.




Estoy creando un buscaminas en pascal para una clase y solo se pueden usar variables locales, dejare mi codigo aqui el problema que tengo es que no puedo mantener las casillas ya descubiertas de la matriz y no se me ocurre como arreglarlo, en el juego el 9 representa las casillas no descubiertas. El error esta en la parte en negrita a mi parecer.


Código (pascal) [Seleccionar]
Program proyecto;
uses crt;

procedure opcion;
 type
  matriz=array[1..9,1..9] of integer;
  vector=array[1..9] of integer;
 var
  mat:matriz; y,i,j,x:integer; va,vb:vector;
  resp:char;
 
FUNCTION menu:integer;
 var opcion:integer;

begin
 repeat
  begin
   clrscr;
   Writeln('Solo nros enteros.');  
   Writeln('1-. Comenzar el juego.');  
   Writeln('2-. Salir.');  
   
      read(opcion);
  end;
 until((opcion>0)and(opcion<3));
  menu:=opcion;

 end;

PROCEDURE creartablero(var mat:matriz; var va,vb:vector; var x,y:integer);
 
  var
   i,j:integer; resp:char;
 
function contador(mat:matriz; var x,y:integer):integer;
var cont:integer;
begin
 
 if ((x=1)and(y=1)) then
     begin
      cont:=0;
      cont:=mat[x,y+1]+mat[x+1,y]+mat[x+1,y+1];
       contador:=cont;
     end;

 if ((x=1)and(y=9)) then
     begin
      cont:=0;
      cont:=mat[x,y-1]+mat[x+1,y-1]+mat[x+1,y];
       contador:=cont;
     end;

 if ((x=1)and(y<9)and(y>1)) then
     begin
       cont:=0;
      cont:=mat[x,y+1]+mat[x,y-1]+mat[x+1,y+1]+mat[x+1,y]+mat[x+1,y-1];
       contador:=cont;      
     end;  

 if ((x=9)and(y=1)) then
     begin
      cont:=0;
      cont:=mat[x,y+1]+mat[x-1,y]+mat[x-1,y+1];
       contador:=cont;
     end;
 
 if ((x=9)and(y=9)) then
     begin
       cont:=0;
      cont:=mat[x,y-1]+mat[x-1,y]+mat[x-1,y-1];
       contador:=cont;
     end;
   
 if ((x=9)and(y<9)and(y>1)) then
     begin
       cont:=0;
      cont:=mat[x,y-1]+mat[x,y+1]+mat[x-1,y+1]+mat[x-1,y]+mat[x-1,y-1];
       contador:=cont;      
     end;

 if ((x>1)and(x<9)and(y=1)) then
     begin
       cont:=0;
      cont:=mat[x+1,y]+mat[x-1,y]+mat[x-1,y+1]+mat[x,y+1]+mat[x+1,y+1];
       contador:=cont;
     end;

 if ((x>1)and(x<9)and(y=9))then
     begin
       cont:=0;
      cont:=mat[x+1,y]+mat[x-1,y]+mat[x-1,y-1]+mat[x,y-1]+mat[x+1,y-1];
       contador:=cont;
     end;

 if ((x>1)and(x<9)and(y>1)and(y<9)) then
  begin
       cont:=0;
      cont:=mat[x,y+1]+mat[x,y-1]+mat[x+1,y-1]+mat[x+1,y]+mat[x+1,y+1]+mat[x-1,y+1]+mat[x-1,y]+mat[x-1,y-1];
       contador:=cont;
   
  end;
 
end;
 
 
BEGIN

 repeat
  begin
   clrscr;
    gotoxy(12,1);
    writeln('BUSCAMINA');
 
     i:=1;
    while i<=9 do
     begin
      gotoxy(4,2+i);
       for j:= 1 to 9 do
       [b] begin
         if ((i=x)and(j=y)) then
          begin
            mat[i,j]:=(contador(mat,x,y)div 10);
            write ('[',mat[i,j],']')
           
          end
          else

          write ('[',9,']');[/b]

        end;
         i:=i+1;

        writeln;
     end;

  gotoxy(1,3);
   begin
   for i:=1 to 9 do
   writeln('(',va[i],')');
   end;

  gotoxy(4,2);
  for i:=1 to 9 do
   write('(',vb[i],')');  

  gotoxy (3,13);
     
   writeln('Seleccione la coordenada que desea abrir');
     
     write(' Nro de fila: ');
        readln(x);
     write(' Nro de columna: ');
        readln(y);
     write(' Descubrir o Salir (D/S): ');
        readln(resp);
  end;
 until (((j>0)and(j<=9)and(i>0)and(i<=9))and((upcase(resp)='S')or(upcase(resp)='D')));
 
       if (upcase(resp)='D') then
         begin
           if mat[x,y]=1 then
            writeln('    Mina encontrada.')
           else
            creartablero(mat,va,vb,x,y);
         end;
       if (upcase(resp)='S') then
         begin
          clrscr;
          write('Presione [ENTER] para salir.' );
         end;      
END;


BEGIN
 if menu=1 then
  begin
   for i:=1 to 9 do
    for j:=1 to 9 do
      mat[i,j]:=0;
   for j:=1 to 9 do
      va[j]:=j;
   for j:=1 to 9 do
      vb[j]:=j;
 
   randomize;
   x:=1;
    while x<=10 do
     begin
     i:=random (10);  
     j:=random (10);
      if ((i>0)and(j>0)and(mat[i,j]<>1)) then
       begin
        mat[i,j]:=10;
        x:=x+1;
       end;
     end;
   
  creartablero(mat,va,vb,x,y);
   
  end
 
else
 write('Presione [ENTER] para salir.' );
   

END;



BEGIN
clrscr;

 opcion;

readkey;

END.

tincopasan

me parece que el principal error que tenés es que después de limpiar o verificar la casilla, volvés a creartablero y no le importa si está o no marcada alguna casilla, supongo que deberías implementar algo como una bandera, o sea si la casilla tiene un valor = 0 poner 9 si la casilla tiene valor= 1 dejar como está.