C# Sudoku-Generator stürzt ab...

derFarmer

Grünschnabel
Hallo zusammen!
Ich hoffe, Ihr könnt mir hier helfen.
Ich habe vor, einen SUDOKU-Generator zu schreiben. Dafür möchte ich vorerst die "banale"-Variante machen. Einfach alles ausprobieren, bis es passt. Dass das nicht sonderlich effektiv ist, weiß ich selbst, modifikationen kommen später hinzu.

Für den Generator habe ich erst einmal 3 voneinander unabhängige Felder generieren lassen. Nämlich die Felder oben rechts, mitte mitte und unten links


[][][x]
[][x][]
[x][][]


da diese Felder nicht voneinander abhängig sind, brauche ich nur den Block selbst auf Zahlen von 1-9 überprüfen. Dafür habe ich die Funktion "pruefeBlock" geschrieben. Um die Spalten zu überprüfen gibt es die Funktion "pruefeSpalte" und für die Zeilen habe ich die Funktion "pruefeZeile" geschrieben.

Erst wenn alle Funktionen ein "false" zurückgeben, wird die zufällig generierte Zahl geschrieben. Leider macht die Funktion "pruefeZeile" Ärger...

Problem:
Sobald ich eine Zahl manuell in das erste Kästchen lege (hier ist es die Zahl 7), um die Richtigkeit der Funktion zu prüfen stürzt die Funktion regelmäßig ab und das Programm friert ein. Das passiert nur manchmal. Ab und zu. Oft werden die Zahlen auch richtig generiert. Das Problem tritt erst seit der neuen Funktion "pruefeZeile" auf...

Dazu folgender Quelltext der Funktion "pruefeZeile":
Code:
        private bool pruefeZeile(Int32 Feldwert, Int32 Block, Int32 Feld)
        {
            //Wenn das Feld mit der Zahl belegt werden darf, gibt die Funktion false zurück ;)
            //Wenn das Feld nicht belegt werden darf, gibt die Funktion true zurück

            Int32 X = Block, Y = Feld, StopY, StopX;

            //Y wird auf das erste Feld der Zeile gesetzt

            if (Y == 2)
                Y--;
            if (Y == 3)
                Y-=2;
            if (Y == 5)
                Y--;
            if (Y == 6)
                Y -= 2;
            if (Y == 8)
                Y--;
            if (Y==9)
                Y-=2;

            //X wird auf den ersten Block der Zeile gesetzt
            if (X == 2)
                X--;
            if (X == 5)
                X--;
            if (X == 7)
                X--;
            if (X % 3 == 0)
                X -= 2;

            StopX = X;
            StopY = Y;

            //Es wird Feld für Feld geprüft, ob die Zahl in der Zeile schon vorhanden ist
            do
            {
                Y = StopY;
                do
                {
                    if (Feldliste[X, Y] == Feldwert && (Y != Feld&&X!=Block))
                        return (true);
                    Y ++;
                } while (Y < StopY + 3);
                X ++;
            }
            while (X <= StopX + 2);

            return (false);
        }

Versteht ihr mein Problem?
Ich kann auch gerne das File anhängen.

Ich hoffe, ihr habt eine Lösung, denn ich bin hier langsam am verzweifeln.
Mit freundlichen Grüßen

derFarmer
 
Zuletzt bearbeitet:
Da die Inputwerte völlig unbekannt sind, wirst du die Ursache wohl selbst mit Debugging rausfinden müssen.

Ggf. läuft eine der beiden Schleifen ewig
 
[...] Ggf. läuft eine der beiden Schleifen ewig

Daran habe ich auch schon gedacht, jedoch gehen die Einzelschritte (per Haltepunkt im Quelltext) einwandfrei durch. Wie gesagt: Nur manchmal hängt sich das Programm weg. Zu ca. 3/4 läuft das Programm stabil. Außerdem darf die Funktion nur bei der ersten Spalte rumzicken, wenn zufällig eine 7 generiert wird, da das erste Feld 1,1 erste Spalte erste Zeile ja eine 7 enthält.
 
Erhältst Du eine bestimmte Fehlermeldung oder stürzt das Programm einfach nur ab? Wenn ich das richtig sehe, könnte es passieren, dass X oder Y durch die Do-While-Schleifen ausserdhalb des Array-Bereichs liegen und somit eine entsprechende Exception ausgelöst werden müsste. Drum würd ich mal ein entsprechendes try-catch rund um die beiden Schleifen setzen und sowas abfangen.
Ansonsten, bist Du Dir sicher, dass das Programm innerhalb der Methode abstürzt und nicht ausserhalb? Eventuell hilft es, ein Log-File zu erstellen, in dem die Zahlen reingeschrieben werden, die innerhalb der Methode verwendet werden. Wenn das Programm dann abstürzt, kannst Du den Debugger beenden und anhand der Zahlen versuchen, herauszufinden, wo das Problem war.

Ich tippe entweder auf ein Problem mit einer Array-Grösse oder auf eine Endlosschleife, wobei auf den ersten Blick eigentlich beide Schleifen früher oder später beendet werden müssten.


Übrigens würd ich der lesbarkeit halber einfach nur "int" verwenden und nicht "Int32". Ausserdem würd ich Dir empfehlen, Dich mit Naming-Conventions auseinanderzusetzen. Variablen immer mit kleinem Anfangsbuchstaben, da man sonst beim schnellen Drüberfliegen meint, es werden Methoden aufgerufen. Klammern um die Return-Werte sind nicht nötig, kannst Du aber lassen, wenn es Dir bei der Lesbarkeit hilft. Und ich würd mir angewöhnen, mit englischen Variablen zu arbeiten. War für mich anfangs auch mühsam, aber man gewöhnt sich schnell dran. Vor allem kann man dann auch mal schnell in nem englischen Forum um Hilfe bitten, ohne zuerst alles übersetzen zu müssen ;)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück