Will Sudokus basteln - klappt net

M

Max Matti

Gast
Hi,

Ich wollte mal ein Programm entwerfen, was (später auch nach Vorgaben) Sudokus bastelt.
Naja, das Ergebnis ist eher ernüchternd, es kommen momentan meistens 81 Nullen raus, die da alle nicht stehen sollten.

Vielleicht kann mir mal jemand weiterhelfen.

Der Code:
Java:
public class Sudoku {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// Auto-generated method stub
		int[][] a = new int[9][9];
		boolean restart = false;

		int i = 0; // Zählvariable für die erste Dimension - in jeder Funktion i
		int j = 0; // Zählvariable für die zweite Dimension - in jeder Funktion j
		
		while (i < 9 && !restart) {
			j = 0;
			
			while (j < 9 && !restart) {
				if (!generiereZufallszahl(a, i, j)) {
					/*
					 * generiereZufallszahl holt sich von gibZufallszahl eine Zufallszahl.
					 * Dann wird mit pruefeZeile, pruefe Spalte und pruefeQuadrat überprüft,
					 * ob die Zahl da überhaupt stehen darf.
					 * Wenn nicht, wird das mit der nächsten versucht.
					 * Nach 500 Versuchen wird ein neues Feld erstellt.
					 */
					restart = true;
					break;
				}
				j++;
			}
			i++;
			if (restart) {
				i = 0;
				j = 0;
				a = new int[9][9];
			}
		}

		i = 0;
		j = 0;
		while (i < 9) {
			j = 0;
			while (j < 9) {
				if (a[i][j] == 0) {
					generiereZufallszahl(a, i, j);
				}
			}
		}

		System.out.println("╔═══════════╦═══════════╦═══════════╗");
		for (i = 0; i < 9; i++) {
			System.out.println("║ " + a[i][0] + " │ " + a[i][1] + " │ " + a[i][2] + " ║ " + a[i][3] + " │ " + a[i][4] + " │ " + a[i][5] + " ║ " + a[i][6] + " │ " + a[i][7] + " │ " + a[i][8] + " ║");
			if (i == 2 || i == 5) {
				System.out.println("╠═══════════╬═══════════╬═══════════╣");
			} else if (i < 8) {
				System.out.println("║───┼───┼───║───┼───┼───║───┼───┼───║");
			}
		}
		System.out.println("╚═══════════╩═══════════╩═══════════╝");
	}

	public static int gibZufallszahl() {
        return (int) ((Math.random()*9)+1);
    }

	public static boolean generiereZufallszahl(int[][] a, int i, int j) {
		a[i][j] = gibZufallszahl();
		boolean retry = true;
		int versuche = 0;
		boolean ok = false;
		while (retry && versuche < 500) {
			retry = false;
			if (!pruefeSpalte(a, i, j) || !pruefeZeile(a, i, j) || !pruefeQuadrat(a, i, j)) {
				a[i][j] = gibZufallszahl();
				retry = true;
				versuche++;
			}
		}
		if (versuche < 500) {
			ok = true;
		}
		return ok;
		
	}

	public static boolean pruefeSpalte(int[][] a, int i, int j) {
		int k = 0;
		boolean success = true;
		for (k=0; k<i && success; k++) {
			if (a[i][j] == a[k][j]) {
				success = false;
			} else {
			}
		}
		return success;
	}

	public static boolean pruefeZeile(int[][] a, int i, int j) {
		int k = 0;
		boolean success = true;
		for (k=0; k<j && success; k++) {
			if (a[i][j] == a[i][k]) {
				success = false;
			} else {
			}
		}
		return success;
	}

	public static boolean pruefeQuadrat(int[][] a, int i, int j) {
		boolean success = true;
		int iversatz = 0;
		int jversatz = 0;
		int izaehler = 0;
		int jzaehler = 0;
		boolean test = true;
		if (i == i % 3) {
			iversatz = 0;
		} else if (i == (i % 3) + 3) {
			iversatz = 3;
		} else if (i == (i % 3) + 6) {
			iversatz = 6;
		} else {
			test = false;
		}

		if (j == j % 3) {
			jversatz = 0;
		} else if (j == (j % 3) + 3) {
			jversatz = 3;
		} else if (j == (j % 3) + 6) {
			jversatz = 6;
		} else {
			test = false;
		}
		int[] b = {a[iversatz][jversatz], a[iversatz][jversatz+1], a[iversatz][jversatz+2], a[iversatz+1][jversatz], a[iversatz+1][jversatz+1], a[iversatz+1][jversatz+2], a[iversatz+2][jversatz], a[iversatz+2][jversatz+1], a[iversatz+2][jversatz+2]};

		if (test) {
			for (izaehler = 0; izaehler < b.length; izaehler++) {
				for (jzaehler = 0; jzaehler < b.length; jzaehler++) {
					if (b[izaehler] == b[jzaehler] && izaehler != jzaehler) {
						success = false;
					}
				}
			}
		} else {
			success = false;
		}
		
		return success;
	}
}

Danke im Voraus.

LG
Max Matti
 

Marco13

Top Contributor
Nur kurz drübergeschaut aber... am Anfang stehen im Array lauter nullen - er wird also vermutlich schon daran scheitern, auch nur die erste Zahl zu setzen, weil das Brett ja (egal, was im Feld (0,0) steht) wegen der anderen 80 Felder in jeder hinsicht "ungültig" ist ...
Wenn das abgefangen wird, hab' ich's wohl übersehen...
 

Andi_CH

Top Contributor
Der "pruefSpalte" hat beim ersten Aufruf i==0 und j==0
for (k=0; k<j; k++) wird also gar nie ausgeführt ???:L???:L???:L success ist immer true, was ja sicher nicht stimmt. Du muss immer die ganze Zeile überprüfen.

Was die Überprüfung genau machen soll, solltest du dir erst mal auf Papier überlegen .... das ist nämlich auch sehr suspekt

Weisst du was ein Debugger ist? Benutze ihn!
 
M

Max Matti

Gast
Wenn eine Zahl abgefragt wird, sind die dahinter (j>k) auch noch nicht vorhanden, das ganze wird doch bei jeder Zahl einzeln überprüft!

Zu den Überprüfungen:
pruefe[...] gibt einen boolean zurück, der sagt, ob die Zahl da hin darf oder nicht.
Wenn nicht, wird eine neue Versucht und eine Zählvariable angestubst.
Wenn die Zählvariable bei 500 ist, geht das ganze Sudoku von vorne los, weil ich dann davon ausgehe, dass auf einem bestimmten Feld keine Zahl mehr möglich ist.
 

Marco13

Top Contributor
Gib mal überall am ende der pruefe-Methoden
Code:
        if (success)
        {
            System.out.println("pruefeSpalte "+i+" "+j+" true");
        }
aus, und du wirst sehen, das NUR bei 0,0 'true' zurückgegeben wird. Siehe meine erste Antwort.
 

Andi_CH

Top Contributor
prüfeSpalte() ist defintiv falsch!

Ausserdem erschweren doofe Paramternamen wie i und j das Verständnis massiv!

Teste doch die Prozeduren einzeln! Zum Beispiel so:

Java:
package com.javaforum.Sudokus;

public class SudokuTest {

	static int[][] ungueltigeZeile = {{1,2,3,4,2,6,7,8,9}};
	static int[][] ungueltigeSpalte = {{1},{2},{3},{4},{2},{6},{7},{8},{9}};

	public static void main(String[] args) {
		System.out.println("prüfeZeile");
		// bis 3 ist die Zeile ok, bei 4 ist sie falsch
		for (int ende = 3; ende <= 4; ende ++) {
			System.out.print(zeileToStr(ungueltigeZeile, 0) + " ist bis " + ende);
			if(pruefeZeile(ungueltigeZeile, 0, ende))
				System.out.println(" gültig");
			else
				System.out.println(" ungültig");
		}
		System.out.println();
		System.out.println("prüfeSpalte");
		for (int ende = 3; ende <= 4; ende ++) {
			// bis 3 ist die Spalte ok, bei 4 ist sie falsch
			System.out.print(spalteToStr(ungueltigeSpalte, 0) + " ist bis " + ende);
			if(pruefeSpalte(ungueltigeSpalte, 0, ende))
				System.out.println(" gültig");
			else
				System.out.println(" ungültig");
		}
	}

	static String zeileToStr (int[][] feld, int nr) {
		String retVal = "";
		for(int i=0; i<feld[nr].length; i++)
			retVal += feld[nr][i] + " ";
		return retVal;
	}

	static String spalteToStr (int[][] feld, int nr) {
		String retVal = "";
		for(int i=0; i<feld.length; i++)
			retVal += feld[i][nr] + " ";
		return retVal;
	}

	public static int gibZufallszahl() {
		return (int) ((Math.random()*9)+1);
	}

	public static boolean generiereZufallszahl(int[][] a, int i, int j) {
		a[i][j] = gibZufallszahl();
		boolean retry = true;
		int versuche = 0;
		boolean ok = false;
		while (retry && versuche < 500) {
			retry = false;
			if (!pruefeSpalte(a, i, j) || !pruefeZeile(a, i, j) || !pruefeQuadrat(a, i, j)) {
				a[i][j] = gibZufallszahl();
				retry = true;
				versuche++;
			}
		}
		if (versuche < 500) {
			ok = true;
		}
		return ok;

	}

	public static boolean pruefeSpalte(int[][] a, int i, int j) {
        int k = 0;
        boolean success = true;
        for (k=0; k<i && success; k++) {
            if (a[i][j] == a[k][j]) {
                success = false;
            }
        }
        return success;
    }

	public static boolean pruefeZeile(int[][] a, int zeile, int letzes) {
		int k = 0;
		boolean success = true;
		for (k=0; k<letzes && success; k++) {
			if (a[zeile][letzes] == a[zeile][k]) {
				success = false;
			}
		}
		return success;
	}

	public static boolean pruefeQuadrat(int[][] a, int i, int j) {
		boolean success = true;
		int iversatz = 0;
		int jversatz = 0;
		int izaehler = 0;
		int jzaehler = 0;
		boolean test = true;
		if (i == i % 3) {
			iversatz = 0;
		} else if (i == (i % 3) + 3) {
			iversatz = 3;
		} else if (i == (i % 3) + 6) {
			iversatz = 6;
		} else {
			test = false;
		}

		if (j == j % 3) {
			jversatz = 0;
		} else if (j == (j % 3) + 3) {
			jversatz = 3;
		} else if (j == (j % 3) + 6) {
			jversatz = 6;
		} else {
			test = false;
		}
		int[] b = {a[iversatz][jversatz], a[iversatz][jversatz+1], a[iversatz][jversatz+2], a[iversatz+1][jversatz], a[iversatz+1][jversatz+1], a[iversatz+1][jversatz+2], a[iversatz+2][jversatz], a[iversatz+2][jversatz+1], a[iversatz+2][jversatz+2]};

		if (test) {
			for (izaehler = 0; izaehler < b.length; izaehler++) {
				for (jzaehler = 0; jzaehler < b.length; jzaehler++) {
					if (b[izaehler] == b[jzaehler] && izaehler != jzaehler) {
						success = false;
					}
				}
			}
		} else {
			success = false;
		}

		return success;
	}
}

Output:
Code:
prüfeZeile
1 2 3 4 2 6 7 8 9  ist bis 3 gültig
1 2 3 4 2 6 7 8 9  ist bis 4 ungültig

prüfeSpalte
1 2 3 4 2 6 7 8 9  ist bis 3 gültig
1 2 3 4 2 6 7 8 9  ist bis 4 gültig
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Bitte Hilfe für Funktionalität eines Sudokus Java Basics - Anfänger-Themen 8
hdi Konsole basteln -> wie die Anzeige des Inhalts realiseren Java Basics - Anfänger-Themen 3
C Editor basteln Java Basics - Anfänger-Themen 8
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Darkherobrine9 Import klappt nicht Java Basics - Anfänger-Themen 7
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
TeacherMrSSimon Schachspiel, Werte in Figur eintragen klappt nicht Java Basics - Anfänger-Themen 23
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
F jsoup einloggen klappt nicht Java Basics - Anfänger-Themen 10
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
nbergmann Umgebungsvariablen einstellen unter Windows 7 klappt nicht Java Basics - Anfänger-Themen 2
C Erste Schritte Insert Into klappt nicht Java Basics - Anfänger-Themen 6
O Klappt nicht: Ein Panel neu zeichnen Java Basics - Anfänger-Themen 3
L Resourcen laden klappt nicht Java Basics - Anfänger-Themen 2
L Variablen Einheiten umrechen klappt nicht Java Basics - Anfänger-Themen 16
I Schleifendurchlauf ab 2. Durchlauf klappt nicht Java Basics - Anfänger-Themen 10
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
J Datei auslesen klappt nicht Java Basics - Anfänger-Themen 4
K Methoden Pause drücken klappt nur jedes 2. Mal Java Basics - Anfänger-Themen 6
S UserPref und Java Application klappt immer nicht. Java Basics - Anfänger-Themen 2
P Shape Zeichnen klappt nicht - einlesen der Breite/Höhe schon Java Basics - Anfänger-Themen 1
S clip.loop(Clip.LOOP_CONTINUOUSLY); stoppen klappt nicht! Java Basics - Anfänger-Themen 11
Z Lotto-Programm Wieso klappt das? Java Basics - Anfänger-Themen 8
J Erste Schritte Zweithöchster Wert eines Arrays herausfinden - warum klappt mein Code nicht? Java Basics - Anfänger-Themen 3
D Telefon programmieren klappt nicht. Java Basics - Anfänger-Themen 5
VfL_Freak Tastaturabfrage auf '@' klappt nicht :-( Java Basics - Anfänger-Themen 1
M Image Download klappt nicht mehr Java Basics - Anfänger-Themen 4
B Erste Schritte Vererbung klappt nicht Java Basics - Anfänger-Themen 24
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
S Date parsen klappt nicht richtig Java Basics - Anfänger-Themen 3
K RGB Wert Heller machen (Dunkler machen klappt) Java Basics - Anfänger-Themen 2
K Einlesen einer txt von BufferedReader klappt nicht wie gewünscht Java Basics - Anfänger-Themen 12
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
H Runden klappt nicht Java Basics - Anfänger-Themen 10
S Dateien/LinkedList/StringBuffer - SOrtierung klappt nicht so ganz Java Basics - Anfänger-Themen 2
K CompareTo zwei mal benutzen klappt nicht. Java Basics - Anfänger-Themen 2
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
J Erste Schritte Bin ein Programm am schreiben klappt aber nicht und weis nicht warum Java Basics - Anfänger-Themen 20
F Dateien lesen klappt nicht Java Basics - Anfänger-Themen 2
Kenan89 Export klappt nicht Java Basics - Anfänger-Themen 2
K Serialisierung: speichern und auslesen, auslesen klappt nicht Java Basics - Anfänger-Themen 14
M Dividieren bei Grafischem Taschenrechner klappt nicht Java Basics - Anfänger-Themen 2
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
K Frame öffnen klappt nicht?! Java Basics - Anfänger-Themen 36
C Methoden Negativer Wert klappt nicht Java Basics - Anfänger-Themen 4
M Datei löschen, klappt nicht Java Basics - Anfänger-Themen 3
J Compiler-Fehler Eclipse .jar Export klappt nicht. Java Basics - Anfänger-Themen 17
A Oracle Verbindungsaufbau klappt nicht Java Basics - Anfänger-Themen 7
GianaSisters Erste Schritte Datei umbennen bzw verschieben klappt nicht Java Basics - Anfänger-Themen 6
Z Speichern in eine .txt klappt.. fast Java Basics - Anfänger-Themen 23
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
K Klassenumbenennung klappt nicht Java Basics - Anfänger-Themen 11
M Synchronized klappt nicht Java Basics - Anfänger-Themen 11
I .csv-Datei einlesen klappt aber kann nicht in String geschrieben werden!?!?! Java Basics - Anfänger-Themen 11
N Serialization, Laden klappt nicht wenn die Klasse geändert wurde Java Basics - Anfänger-Themen 3
D Jar klappt nicht trotz main Methode Java Basics - Anfänger-Themen 19
R fireTableDataChanged klappt nicht Java Basics - Anfänger-Themen 7
M methoden aufruf klappt nicht Java Basics - Anfänger-Themen 6
T Override klappt nochmal wie? Java Basics - Anfänger-Themen 3
I 1 Frame und mehrere Panels klappt nicht Java Basics - Anfänger-Themen 4
C SELECT klappt INSERT klappt nicht!!!??? Java Basics - Anfänger-Themen 3
Luk10 Aufrufen klappt nicht! Java Basics - Anfänger-Themen 7
A Quicksort, #Vergleiche zählen klappt nicht Java Basics - Anfänger-Themen 3
raptorrs Schreiben in Properties-File klappt nicht Java Basics - Anfänger-Themen 6
T JComboBox klappt nur ein- bis zweimal auf Java Basics - Anfänger-Themen 30
T Polymorphie:Überschreiben der Methode klappt nicht Java Basics - Anfänger-Themen 4
Gonzalez Eingabe des Benutzers mittels readLine()-Methode. Klappt in meinem Beispiel nicht! Java Basics - Anfänger-Themen 7
C .java in .class klappt nicht Java Basics - Anfänger-Themen 16
J Datenbankverbindung klappt doch nicht? IBM DB2 Java Basics - Anfänger-Themen 2
O JPanel einbinden klappt nicht Java Basics - Anfänger-Themen 5
R Fehlersuche - KeyListener, KeyAdaper - Nichts Klappt! Java Basics - Anfänger-Themen 2
B Strings aus Array einlesen klappt nicht Java Basics - Anfänger-Themen 5
J reverse array, klappt nicht ? Java Basics - Anfänger-Themen 3
L Leider klappt bei mir ein Befehl nicht Java Basics - Anfänger-Themen 4
G Unterverzeichnisse anlegen klappt nicht Java Basics - Anfänger-Themen 4
D Ausgabe klappt nicht Java Basics - Anfänger-Themen 9
1 JList Problem : Synchronisation mit Vector klappt nicht :( Java Basics - Anfänger-Themen 6
G EventHandling klappt nicht Java Basics - Anfänger-Themen 8
G JFreeChart und das Update(was nicht klappt). Java Basics - Anfänger-Themen 3
S Schleife klappt nicht Java Basics - Anfänger-Themen 5
G Vergleich klappt nicht Java Basics - Anfänger-Themen 3
J jar erstellen. Es klappt einfach nicht Java Basics - Anfänger-Themen 14
G JDK Installation klappt auf Vista nicht Java Basics - Anfänger-Themen 4
H import java.io.* klappt nich Java Basics - Anfänger-Themen 12
G Icon einfügen klappt nicht Java Basics - Anfänger-Themen 3
M String in textarea übernehmen klappt nicht Java Basics - Anfänger-Themen 13
M Insert into klappt nicht? Java Basics - Anfänger-Themen 7
V Insert into klappt nicht so ganz Java Basics - Anfänger-Themen 6
M Audioclip wiedergabe klappt nicht Java Basics - Anfänger-Themen 4
2 Aufruf einer Methode klappt nicht Java Basics - Anfänger-Themen 3
B JPasswordField *beep* klappt nich Java Basics - Anfänger-Themen 8
Y Main Klasse in Konsole ausführen klappt nicht Java Basics - Anfänger-Themen 7
T Plus-Operation beim Taschenrechner klappt nicht. Java Basics - Anfänger-Themen 7
U BufferedImages verschieben klappt nicht Java Basics - Anfänger-Themen 37
B textfeld mit enter auslesen klappt nicht Java Basics - Anfänger-Themen 12
D import java.utils.Scaner klappt nicht Java Basics - Anfänger-Themen 17
P Bestimmter befehl der nicht klappt Java Basics - Anfänger-Themen 5
P dynamisches Binden klappt nicht so recht Java Basics - Anfänger-Themen 7
D FileDIalog klappt. aber geladenes bild nicht angezeigt Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben