Wo ist der Logikfehler?

Status
Nicht offen für weitere Antworten.
In der bittersten Stunde wendet sich euer JavaMaximum5000 an die Runde der Experten. In der Backtrackfunktion (Zeile 42) scheint ein Fehler zu sein. Hab 3 Stunden gesucht, vielleicht könnt ihr mir ja weiterhelfen. Würde mich riesig freuen.

Das Problem liegt darin, dass der Code in der Backtrackfunktion eine Endlosschleife produziert.
Es wird immer Hallo1 oder Hallo2 oder Hallo3 ausgegeben.

Das Programm sollte ein Sudokufeld ausgeben (noch ohne korrekte Blöcke, also nur Zeilen und Spalten)

Anbei der Code.

Euer JavaMaximum5000



Code:
import java.util.BitSet;
import java.util.Random;


public class Sudoku {


	public static void main(String[] args) {
		int random[] = new int[81];
		int pointer[] = new int[81];
		int tmp[] = new int[1];
		int game[][] = new int[9][9];
		boolean statussetrandomnumbertogame = false;
		int transfer[] = new int[2];
		
		
		createnumbers(random);
		
		while(pointer[80] == 0){
			if(statussetrandomnumbertogame = true){
				transfer[0] = 0;
				transfer[1] = 0;
			}
			nextnumber(random, pointer, tmp);
			statussetrandomnumbertogame = setrandomnumbertogame(tmp, game, transfer,pointer);
			while(statussetrandomnumbertogame == false){
				backtracking(pointer,tmp,random,game, transfer);
				statussetrandomnumbertogame = setrandomnumbertogame(tmp, game, transfer,pointer);
			}
		}
		
		for(int y = 0; y < 9; y++){
			for(int x = 0; x < 9; x++){
				System.out.print(game[y][x]+ " ");
			}
			System.out.println();
		}
		

	}
	private static void backtracking(int[] pointer, int[] tmp, int[] random, int[][] game,int transfer[]) {
		int i = 0;
		boolean status = false;
		
		while(status == false){
			if(pointer[i] == 0){
				pointer[i-1] = 0;
				tmp[0] = random[i-1];
				status = true;
			}
			i++;
		}
		
		for(int zeile = 8; zeile >= 0; zeile--){
			for(int spalte = 8; spalte >= 0; spalte--){
				if(game[zeile][spalte] == tmp[0]){
					game[zeile][spalte] = 0;
					if(spalte == 8 && zeile < 8){
						transfer[0] = zeile + 1;
						transfer[1] = 0;
						System.out.println("Hallo");
						return;
					}
					if(spalte == 8 && zeile == 8){
						transfer[0] = 8;
						transfer[1] = 8;
						System.out.println("Hallo3");
						return;
					}
					else{
						transfer[0] = zeile;
						transfer[1] = spalte + 1;
						System.out.println("Hallo2");
						return;
					}
				}
			}
		}
		
	}
	private static boolean setrandomnumbertogame(int[] tmp, int[][] game, int transfer[], int[] pointer) {
		boolean status = true;
		for(int zeile = transfer[0]; zeile < 9; zeile++){
			for(int spalte = transfer[1]; spalte < 9; spalte++){
				if(game[zeile][spalte] == 0){
					game[zeile][spalte] = tmp[0];
					status = checknumber(game, zeile, spalte);
					if(status == true){
						for(int i = 0; i < 81; i++){
							if(pointer[i] == 0){
								pointer[i] = 1;
								return true;
							}
						}
						
					}
					else{
						game[zeile][spalte] = 0;
					}
				}
			}
		}

		return false;
	}
	private static boolean checknumber(int[][] game, int zeile, int spalte) {
		boolean statuszeile = false;
		boolean statusspalte = false;
		
		statuszeile = checkzeile(game, zeile, spalte);
		statusspalte = checkspalte(game, zeile, spalte);
		
		if(statuszeile == true && statusspalte == true){
			return true;
		}
		return false;
	}
	
	private static boolean checkspalte(int[][] game, int zeile, int spalte) {
		for(int y = 0; y < 9; y++){
			if(zeile == y){
				y++;
			}
			else if(game[zeile][spalte] == game[y][spalte]){
				return false;
			}
		}
		
		return true;
		
	}
	
	private static boolean checkzeile(int[][] game, int zeile, int spalte) {
		for(int x = 0; x < 9; x++){
			if(spalte == x){
				x++;
			}
			else if(game[zeile][spalte] == game[zeile][x]){
				return false;
			}
		}
		
		return true;
	}
	
	private static void createnumbers(int random[]) {
		Random zufallszahl = new Random();
		for(int y = 0; y < 81; y = y + 9){
			BitSet generiertezahlen = new BitSet();
			for(int x = 0; x < 9; x++){
				int zahl = 1 + Math.abs(zufallszahl.nextInt()) % 9;
				if(! generiertezahlen.get(zahl)){
					generiertezahlen.set(zahl);
					random[y+x] = zahl;	
				}
				else x--;
			}
		}
	}
	
	private static void nextnumber(int[] random, int[] pointer, int[] tmp) {
		for(int i = 0; i < 81; i++){
			if(pointer[i] == 0){
				tmp[0] = random[i];
				return;
			}
		}
		
	}

}
 
S

SlaterB

Gast
> In der Backtrackfunktion (Zeile 42) scheint ein Fehler zu sein.

WAS läßt dich das vermuten?
wenn ich sowas schon lese..

na vielleicht gehen andere gerne auf Suche..
 

Wildcard

Top Contributor
Er hat aber recht. Der Code macht genau das was er soll, nur ist das nicht zwangsläufig das was du wolltest.
Aber woher sollen wir wissen was du willst?
 
Alles klar, dachte nur er will mich aufziehen. Ich werde mein Problem gleich weiter ausführen.
Entschuldigung nochmal für die Anschuldigung.
JavaMaximum5000
 
S

SlaterB

Gast
und hast du keine Ambition, das selber herauszufinden?
die System.out.println sidn doch ein guter Anfang, immer weiter damit, schauen was ist und was soll

ich nerve dich so weil ich keine Lust habe, das zu machen, sondern du das selber lernen sollst ;)


> Das Problem liegt darin, dass der Code in der Backtrackfunktion eine Endlosschleife produziert.

falsch, Hallo3 oder sonstwas ausgegeben wird, dann wird auch die Operation beendet,
der Fehler liegt also beim Aufrufer oder dieser erwartet andere Ergebnisse,

immer noch weiß niemand was der eigentlich machen soll,
die ganze Geschichte mit statussetrandomnumbertogame
udn was immer dazu gehört musst du erst erklären!,
von selbst geht das nicht
 
S

SlaterB

Gast
ich sehe grade zufällig noch eine Eclipse-Warning ;)

if(statussetrandomnumbertogame = true){
->
if(statussetrandomnumbertogame == true){
oder am besten gleich
if(statussetrandomnumbertogame){
 

Saxony

Top Contributor
Wildcard hat gesagt.:
Er hat aber recht. Der Code macht genau das was er soll, nur ist das nicht zwangsläufig das was du wolltest.
Aber woher sollen wir wissen was du willst?

Hehe - siehe Signatur von mir. :D

Ja CamelCase schützt vor Augenkrebs.

bye Saxony
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben