ich musste vor kurzer Zeit zu Lazarus wechseln, da meine Schule nicht mehr mit Delphi 5 unterrichtet. Ich bin also ziemlich unerfahren im Umgang mit Lazarus, habe aber schon etwas Pascal-Erfahrung. Zur Zeit programmiere ich einen Sudoku-Löser. Nachdem die vorgegebenen Ziffern in ein Array geschrieben wurden, soll das Programm jedes Feld durchgehen und prüfen, ob dort eine Zahl steht. Ist dem so, wird diese Zahl aus den Möglichkeiten für die Felder mit der gleichen X-Koordinate, Y-Koordinate und demselben 3×3-Kasten gelöscht. Das ganze steht in einer Repeat-Schleife, die nach jedem Durchgang prüft, ob ein neues Feld gelöst wurde und abbricht, wenn dem nicht so ist.
Das Problem ist nun, dass die zweite For-Schleife (For Y := 1 to 9 do) mit unsinnigen Werten zählt. Es scheint, als würde sie die Schleifenvariable nicht initialisieren. Lasse ich sie nämlich auslesen, indem ich den Coursor drüberhalte, stehen da z.B. Werte von 777, 769 oder 771, was theoretisch nicht einmal möglich sein sollte, da Y als Integer-Teilbereich von 0 bis 9 deklariert ist. Es kommt auch keine Zugriffsverletzung, wenn das Programm dann auf Matrix[X, 777] zugreifen soll. Kann mir jemand sagen, was ich damit anfangen soll? Das Programm funktioniert zwar nicht richtig, aber ich würde meine Hand nicht dafür ins Feuer legen, dass es daran liegt.
Danke im Voraus.
Code: Alles auswählen
Zahlen9 = 0..9;
Menge9 = Set of Zahlen9;
Zelle9 = Record Eintrag: Zahlen9;
Moeglichkeiten: Menge9;
End;
Matrix9 = Array[1..9] of Array [1..9] of Zelle9;
Code: Alles auswählen
Procedure Eliminieren(Var Matrix: Matrix9); Overload; //Löst das Sudoku durch Ausschließen von Lösungsmöglichkeiten
Var X, Y, I: Zahlen9;
Geloest: Byte;
Begin
Repeat
Schnellausgabe(Matrix, 'vor Loesen'); //Gibt die Matrix in einer Messagebox aus
Geloest := Loesungenzaehlen(Matrix);//Zum Zählen der vor dem Ausschließen gelösten Felder
For X := 1 to 9 do
For Y := 1 to 9 do
If Matrix[X, Y].Eintrag <> 0 Then Begin //steht eine Zahl im aktuellen Feld? (0 = kein Eintrag)
For I := 1 to 9 do Begin
Matrix[I, Y].Moeglichkeiten := Matrix[I, Y].Moeglichkeiten - [Matrix[X, Y].Eintrag]; //Eliminieren der Möglichkeiten in derselben Zeile
Matrix[I, Y] := EintragDeterminiert(Matrix[I, Y]); //Gibt es nur noch eine Möglichkeit, wird sie in das Feld eingetragen
Matrix[X, I].Moeglichkeiten := Matrix[X, I].Moeglichkeiten - [Matrix[X, Y].Eintrag]; //Eliminieren der Möglichkeiten in derselben Spalte
Matrix[X, I] := EintragDeterminiert(Matrix[X, I]);
End;
Matrix := Kasteneliminierung(Matrix, X, Y);//Entfernt Möglichkeiten aus den Feldern des 3×3-Kastens
End;
Schnellausgabe(Matrix, 'nach Loesen');
until Loesungenzaehlen(Matrix) = Geloest; //Abbruch der Schleife, wenn keine neue Lösung dazugekommen ist.
end;