![]() |
AW: Sudoku Logik
Zitat:
greetz Mike |
AW: Sudoku Logik
Oh...:oops: das hab ich dann wohl etwas missverstanden... :oops:
Naja, dann muss ich also retunr doch selber "ausschreiben"... :D Danke! |
AW: Sudoku Logik
Also, ich hab jetzt gerade mal den Pseudocode umgesetzt in meinem Programm. Ob er funktioniert, kann ich noch nicht sagen, da er mir (unverständlicherweise) an einer Stelle sagt, dass " '' ist kein gültiger Integerwert".
Hier mal der Code, mit dem alle Zellen gefüllter werden (sollen):
Delphi-Quellcode:
Und dann noch die Überprüfung der Zahl:
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 //hier kommt der Fehler! begin X:=i mod Size; Y:=i div Size; Form1.Map.Cells[X,Y]:=dig; if SetCell(i + 1) then begin Result:=True; Exit; end else begin ValidDecision.Delete(ValidDecision.IndexOf(dig)); dig:=ValidDecision[random(ValidDecision.Count)]; end; end else ValidDecision.Delete(ValidDecision.IndexOf(dig)); end; ValidDecision.Free; Result:=False; end;
Delphi-Quellcode:
Der Fehler kommt so zwischen der 4. und 5. Zelle. Ich kann mir das nicht so richitg erklären, weil hier die Sprache davon ist, dass i='' ist. Aber wieso? Hoffentlich könnt ihr mir nochmal aus der Patsche helfen.
function DigitIsOK(i,Digit: integer):boolean;
var j: Integer; X,Y: integer; begin X:=i mod Size; Y:=i div Size; Result:=True; if not(Digit = 0) then begin for j := 0 to Size do begin if (Digit = StrToInt(Form1.Map.Cells[X,i])) OR (Digit = StrToInt(Form1.Map.Cells[i,Y])) then begin Result:=False; Break; end; end; end else Result:=false; end; LG, hans ditter |
AW: Sudoku Logik
Scheint so als hättest du statt "j" ein "i" (oder umgekehrt).
|
AW: Sudoku Logik
hm, ich hab's grade mal geändert (hattest übrigens recht, das i sollte ein j sein), hat aber nichts geändert.
Ich glaube eher, dass dig irgendwie '' ist. Aber ich weiß nicht warum. Könntet ihr dahingehend nochmal durchschauen? Such auch schon seit ein paar Stunden nach dem Fehler... :( |
AW: Sudoku Logik
Ich glaub da fehlt ein " -1 ", also
Delphi-Quellcode:
.
dig:=ValidDecision[random(ValidDecision.Count -1 )];
|
AW: Sudoku Logik
Hast du absolut Recht... das fehlte!
Aber leider behebt es immer noch nicht mein Problem. Ich glaube fast, dass es irgendwie einen falschen Zugriff auf eine falsche TStringList gibt. Oh man, ich komm einfach nicht weiter...:roll: |
AW: Sudoku Logik
Da fehlt noch (mindestens) ein "-1" (glaub ich jedenfalls), und zwar in der
Delphi-Quellcode:
bei
DigitIsOk
Delphi-Quellcode:
for j := 0 to Size -1 do
|
AW: Sudoku Logik
Wie lösche ich den Post wenn ich gerade Müll geschrieben habe????
Egal, versuch ich was evtl. sinnvolles: Aus der Hilfe: Random gibt eine Zufallszahl im Bereich 0 <= X < Range zurück. Also ist die -1 in
Delphi-Quellcode:
dig:=ValidDecision[random(ValidDecision.Count -1 )];
doch eher falsch, da random so Zahlen kleiner ValidDecision.Count-1 zurückliefert und nicht kleiner ValidDecision.Count, wie es eigentlich sein soll. Somit eher wieder:
Delphi-Quellcode:
dig:=ValidDecision[random(ValidDecision.Count)];
|
AW: Sudoku Logik
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! :D 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:
[Edit2]
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; 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"? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz