Also ich wollte mich an ein Sudoku traun. Hab hierfür schon eins zwei sachen fertig
enthalten sind bis jetzt ein paar check methoden, die überprüfen sollen ob ein fehler gefunden wurde
und ein paar get bzw set methoden
das funktioniert soweit ich weiß auch alles
mir macht die generate methode probleme
also die, die mein array mit werten füllt
meine methode macht dies zwar aber braucht wenn cih pech habe ewig
wenn sagen wa ma nur ne 2 in der reihe fehlt und der zufall es so will dass
diese einfach net gerandomed wird dann dauerts ewig bis die zahl vorkommt.
mein Lösungsansatz:
ein array mit den werten erzeugen mit den werten von 1-9
(bzw muss ich mein quelltext noch so umschreiben dass 0 als nicht gefüllt annimmt
aber dass is ja net mein prob)
dieses array soll dann zufälluig gemischt werden
oder habt ihr nen besseren vorschlag, bzw einen quelltextauszug der mir weiterhelfen würde
ps: ich will keine fertiglösung... will ja auch noch was lernen
mfG Florian Weinhold[/code]
Code:
import java.util.Random;
/**
* Eine Klasse zum erstellen eines Sudokufeldes
*
* @author Florian Weinhold
* @version 1.0
*/
public class Sudoku {
private int field[][] = null; //Das Feld in dem die Werte gespeichert werden
private int n = 9; //Anzahl der Felder pro Reihe, Spalte
private int num_box; //Anzahl der Boxen pro Reihe, Spalte
private Random r = new Random();
/**
* Konstuktor
*/
public Sudoku(){
field = new int[n][n];
num_box = (int)Math.sqrt(n); //Anzahl berechnen
generate(); //füllt soduko mit werten
}
/**
* Gibt den Integer-Wert des Feldes an der Position x,y zurück.
*
* @param x verticale Angabe
* @param y horizontale Angabe
*
* @return Wert des Feldes in INT.
*/
public int getField(int x, int y){
return field[x][y];
}
/**
* Gibt das array mit allen Werten zurück.
*
* @return Alle werte vom sudoku.
*/
public int[][] getAll(){
return field;
}
/**
* Sezt den Integer-Wert des Feldes an der Position x,y.
*
* @param x verticale Angabe
* @param y horizontale Angabe
*/
public void setField(int value, int x, int y){
field[x][y] = value;
}
/**
* Sezt den Integer-Wert des Feldes an der Position x,y.
*
* @param field enthält alle werte
*/
public void setall(int[][] field){
this.field = field;
}
/**
* Füllt das gesammte Sudoku mit Werten
*/
public void generate(){
int current = 0; //zwischenspeicher
for(int x = 0; x < 9; x++){
for(int y = 0; y < 9; y++){
do{
current = r.nextInt(n+1);
}while(check(current, x, y));
setField(current, x, y);
System.out.println(Math.random());
}
}
}
/**
* Prüft auf Fehler
*
* @param value zu prüfender Wert
* @param x Reihe in der geprüft wird
* @param y Spalte in der geprüft wird
*
* @return bei einem Fehler wird true zurück gegeben
*/
public boolean check(int value,int x, int y){
if(checkVertical(value, y)||checkHorizontal(value, x)||checkBox(value, x, y)){
return true;
}
return false;
}
/**
* Prüft ob der Wert schon in einer Reihe vorkommt
*
* @param value zu prüfender Wert
* @param y Spalte in der geprüft wird
*
* @return bei einem Fehler wird true zurück gegeben
*/
public boolean checkVertical(int value, int y){
for(int x = 0; x < n; x++){
if(getField(x, y) == value){
return true;
}
}
return false;
}
/**
* Prüft ob der Wert schon in eine Spalte vorkommt
*
* @param value zu prüfender Wert
* @param x Reihe in der geprüft wird
*
* @return bei einem Fehler wird true zurück gegeben
*/
public boolean checkHorizontal(int value, int x){
for(int y = 0; y < n; y++){
if(getField(x, y) == value){
return true;
}
}
return false;
}
/**
* Prüft ob der Wert schon in einer Box vorkommt
*
* @param value zu prüfender Wert
* @param x Reihe in der geprüft wird
* @param y Spalte in der geprüft wird
*
* @return bei einem Fehler wird true zurück gegeben
*/
public boolean checkBox(int value, int x, int y){
//erste Feld der Box herrausfinden
int field_x = (int)(x/num_box)*num_box;
int field_y = (int)(y/num_box)*num_box;
for(x = field_x; x < field_x+num_box; x++){
for(y = field_y; y < field_y+num_box; y++){
if(value == getField(x, y)){
return true;
}
}
}
return false;
}
public static void main(String[] args) {
Sudoku S = new Sudoku();
S.checkBox(10, 1, 1);
}
}
enthalten sind bis jetzt ein paar check methoden, die überprüfen sollen ob ein fehler gefunden wurde
und ein paar get bzw set methoden
das funktioniert soweit ich weiß auch alles
mir macht die generate methode probleme
Code:
/**
* Füllt das gesammte Sudoku mit Werten
*/
public void generate(){
int current = 0; //zwischenspeicher
for(int x = 0; x < 9; x++){
for(int y = 0; y < 9; y++){
do{
current = r.nextInt(n+1);
}while(check(current, x, y));
setField(current, x, y);
System.out.println(Math.random());
}
}
}
meine methode macht dies zwar aber braucht wenn cih pech habe ewig
wenn sagen wa ma nur ne 2 in der reihe fehlt und der zufall es so will dass
diese einfach net gerandomed wird dann dauerts ewig bis die zahl vorkommt.
mein Lösungsansatz:
ein array mit den werten erzeugen mit den werten von 1-9
(bzw muss ich mein quelltext noch so umschreiben dass 0 als nicht gefüllt annimmt
aber dass is ja net mein prob)
dieses array soll dann zufälluig gemischt werden
oder habt ihr nen besseren vorschlag, bzw einen quelltextauszug der mir weiterhelfen würde
ps: ich will keine fertiglösung... will ja auch noch was lernen
mfG Florian Weinhold[/code]