Ver Mensaje Individual
  #8  
Antiguo 09-04-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Reputación: 17
jhonalone Va por buen camino
Gracias de nuevo. Agustín.
Tienes razón, llevo toda la tarde leyendo sobre los Threads y todavía no he aprendido a implementarlos, a parte de que he leído que son bastante delicados, es decir: que si te equivocas... ¡paf!.

Te pongo el procedimiento de generar tablero. Te comento que tengo declarado un TStringGrid de 3x3 para cada cuadro del tablero que presenta 9 números provisionales o los oculta, según...

Código Delphi [-]
procedure GenerarTablero(var Tablero: TTablero; Dificultad: Integer; Personal:Boolean);
var
  i,j,k,l, Tope, Tope2: integer;
begin
EsDinamico := False;
TableroYaResuelto := False;
// Eliminamosm las listas de Deshacer
Princi.UndoList.Clear;
Princi.RedoList.Clear;

    SeVenTodosProvis := False;
    SeVenParteProvis := False;
    PrimeraVezDosClick := True; //Para generar los Tableros Provis la primera vez
                                // Lo hace al pintar el tablero por primera vez
Princi.Timer1.Enabled := False; // Arrancamos con el contador de 2 clicks parado
Princi.Button13.Enabled := False; // Inhabilitamos Undo
Princi.Button16.Enabled := False; // Inhabilitamos Redo
//Eliminamos todos los cuadros provisionales, si hay
Princi.EliminaProvis;

  for i:=0 to 8 do
    for j:=0 to 8 do
    begin
    TableroProvis[i,j]:=0;  // Ponemos a ceros el tablero de Provisionales
    TableroAyudado[i,j]:=0;  // Ponemos a ceros el tablero de ayuda
    ProvisVisibles[i,j]:=0;
    ProvisPuestos[i,j]:=0;
    ProvisRecuperables[i,j]:=0;
    end;

// Actualizamos el estado de los botones y del tablero
    Princi.grdTablero.Enabled := True;
    Princi.Button1.Enabled := True;
    Princi.Button2.Enabled := True;
    Princi.Button3.Enabled := True;
    Princi.Button4.Enabled := True;
    Princi.Button5.Enabled := True;
    Princi.Button6.Enabled := True;
    Princi.Button7.Enabled := True;
    Princi.Button8.Enabled := True;
    Princi.Button9.Enabled := True;
    Princi.Button10.Enabled := True;
    Princi.Button11.Enabled := True;
    Princi.Button12.Enabled := True;

    Princi.Button13.Enabled := False;
             Princi.Image1.Enabled :=False;
    Princi.Button14.Enabled := True;
             Princi.Image2.Enabled := True;
    Princi.Button15.Enabled := True;
             Princi.Image3.Enabled :=True;
    Princi.Button16.Enabled := False;
             Princi.Image4.Enabled :=False;

// Actualizamos la etiqueta con el nivel
if not Personal
then begin Case Dificultad of
           0: Princi.Label3.Text := 'Nivel SENCILLO';
           15: Princi.Label3.Text := 'Nivel NORMAL';
           25: Princi.Label3.Text := 'Nivel DIFÍCIL';
           30: Princi.Label3.Text := 'Nivel MUY DIFÍCIL';
           end; //Case
     end else Princi.Label3.Text := 'Nivel PERSONALIZADO';

// Comenzamos a generar el nuevo tablero
  FillChar(Tablero,Sizeof(Tablero),0);
  Randomize;
  i:= 0;
  while i < NUM_COLUMNAS do
  begin
    j:= Random(9)+1; // No recuerdo por qué +1 pero en VCL lo tengo así ¿?  hace años (a lo mejor esto sobra)
    if Valido(Tablero, i, 0, j) then
    begin
      Tablero[i,0]:= j;
      inc(i)
    end;
  end;  // EXIT;  //Pruebas
  Resolver(Tablero);
  TableroResuelto := Tablero;


  k:= 0;
  if Personal then begin
                   if Dificultad > 30
                   then Tope:=30
                   else Tope:=Dificultad;
                   end
              else Tope:=30;

// Quitamos 30 obvios
  while k < Tope do
  begin
    i:= Random(NUM_COLUMNAS);
    j:= Random(NUM_FILAS);
    if Tablero[i,j] <> 0 then
    begin
      l:= Tablero[i,j];
      Tablero[i,j]:= 0;
      if Obvio(Tablero,i,j)>0 then
        inc(k)
      else
        Tablero[i,j]:= l;
    end;
  end;

  k:= 0;
if not Personal then tope2:=Dificultad
                else tope2:=Dificultad - Tope;

  // Quitamos algunos que no son obvios SEGUN NIVEL 0, 15, 25, 30, PERSONAL
  while k < Tope2 do
  begin
    i:= Random(NUM_COLUMNAS);
    j:= Random(NUM_FILAS);
    if Tablero[i,j] <> 0 then
    begin
      l:= Tablero[i,j];
      Tablero[i,j]:= 0;
      if Obvio(Tablero,i,j)=0 then
        inc(k)
      else
        Tablero[i,j]:= l;
    end;
  end;

EventoFlechaActivo := False;
end;

Las funciones, como verás casi me sirven las mismas con algunos retoques y unas pocas nuevas.

Al final con el tema de los Threads voy a tener que usar una pantalla de inicio, como la que ya tengo, con la que he conseguido dividir el tiempo de espera entre 2. Y te recuerdo que en los móviles nuevos, 5/7 segundos no es mucho. Con evitar que la pantalla quedara en negro... quizá sería suficiente. Quizá pueda optimizar el flujo recolocando algunos procesos...

Un saludo.
Responder Con Cita