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;
Princi.UndoList.Clear;
Princi.RedoList.Clear;
SeVenTodosProvis := False;
SeVenParteProvis := False;
PrimeraVezDosClick := True; Princi.Timer1.Enabled := False; Princi.Button13.Enabled := False; Princi.Button16.Enabled := False; Princi.EliminaProvis;
for i:=0 to 8 do
for j:=0 to 8 do
begin
TableroProvis[i,j]:=0; TableroAyudado[i,j]:=0; ProvisVisibles[i,j]:=0;
ProvisPuestos[i,j]:=0;
ProvisRecuperables[i,j]:=0;
end;
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;
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; end else Princi.Label3.Text := 'Nivel PERSONALIZADO';
FillChar(Tablero,Sizeof(Tablero),0);
Randomize;
i:= 0;
while i < NUM_COLUMNAS do
begin
j:= Random(9)+1; if Valido(Tablero, i, 0, j) then
begin
Tablero[i,0]:= j;
inc(i)
end;
end; Resolver(Tablero);
TableroResuelto := Tablero;
k:= 0;
if Personal then begin
if Dificultad > 30
then Tope:=30
else Tope:=Dificultad;
end
else Tope:=30;
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;
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.