Thema: Delphi Sudoku Logik

Einzelnen Beitrag anzeigen

hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#40

AW: Sudoku Logik

  Alt 12. Jan 2011, 14:28
Also, ich hab jetzt beides nochmal überprüft.
@Notxor
Ich hab's geändert. Hat auch schonmal was gebracht. Da hat's dann jedesmal funktioniert. Jedes andere 2te Mal kam aber die Fehlermeldung, dass der Litenindex überschritten wurde.

@Jumpy
Ich glaube löschen geht nicht!
Ich hab das auch bei dir geändert. Hat dann dazu geführt, dass ich ca. 10-15 Mal ein Sudoku erzeugen konnte. Aber auch dann kam die Fehlermeldung mit dem überschrittenem Listenindex.

EDIT!!!!

Hier die Fehlerstelle:
Delphi-Quellcode:
function SetCell(i: integer) : boolean;
var ValidDecision: TStringList;
  j,X,Y: Integer;
  dig: string;
begin
  if i > (Size * Size - 1) then
  begin
    Result:=true;
    Exit;
  end;
{.....................................................................}
  ValidDecision:=TStringList.Create;
  for j := 1 to Size do
    ValidDecision.Add(IntToStr(j));
{.....................................................................}
  while ValidDecision.Count > 0 do
  begin
    dig:=ValidDecision[random(ValidDecision.Count)];
    if DigitIsOk(i,StrToInt(dig)) then
    begin
      X:=i mod Size;
      Y:=i div Size;
      Form1.Map.Cells[X,Y]:=dig;
      if SetCell(i + 1) then //hier kommt der Fehler!!!
      begin
        Result:=True;
        Exit;
     (* end
      else
      begin
        ValidDecision.Delete(ValidDecision.IndexOf(dig));
        dig:=ValidDecision[random(ValidDecision.Count)]; *)

//hier ist der Fehler. Der else-Zweig ist total überflüssig!!
      end;
    end
    else
      ValidDecision.Delete(ValidDecision.IndexOf(dig));
  end;

  ValidDecision.Free;

  Result:=False;
end;
[Edit2]
Jetzt bräuchte ich nur nochmal Hilfe mit den Quadraten. Wie kann ich die möglichst dynamisch abfragen?
Hab grad schonmal ein bisschen mit Formeln rumjonliert.. ist aber nicht wirklich was bei rausgekommen.
Man müsste ja auf jeden Fall wissen, wie groß das Spielfeld ist. Das ist wohl auch nicht das Problem.
Vielmehr ist dann die Frage, wie man die einzelnen (von der Anzahl her ja auch noch variierenden) Quadrate überprüft.
Gibt es da irgendeinen mathematischen Weg oder muss man das mit lauter if-Schleifen abfragen? Wenn 2teres: Wie macht man das "dynamisch"?
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!

Geändert von hans ditter (12. Jan 2011 um 14:49 Uhr)
  Mit Zitat antworten Zitat