Diablokiller999
Enthusiast
Thread Starter
- Mitglied seit
- 09.01.2004
- Beiträge
- 2.054
Hi Leute!
Ich wollte für ein Studienfach ein einfaches Sudoku objektorientiert schreiben.
Nun habe ich aber das Problem, dass das Programm in einer Endlosschleife weiterläuft bzw. es abschmiert, wenn ich eine Funktion rekursiv aufrufe. Momentan soll erstmal das Spielfeld initialisiert und ausgegeben werden.
Hoffe die Kommentare sind gut gesetzt und verständlich. Finde das Problem einfach nicht, aber ein paar eingefügte cout's haben mir gezeigt, das es sich immer bei unterschiedlichen Feldern im Array aufhängt, deshalb tippe ich auf die rand-Funktion. Hab' das Programm schon 3mal neu geschrieben und selbst strukturiert kommt der selbe Fehler
Würde mich ja gern mit nem Debugger hinsetzen und das ganze mal durchchecken, aber ich habe keine Ahnung wie man debuggt. Hat da evtl. jemand ein gutes Tutorial für an der Hand?
Ich wollte für ein Studienfach ein einfaches Sudoku objektorientiert schreiben.
Nun habe ich aber das Problem, dass das Programm in einer Endlosschleife weiterläuft bzw. es abschmiert, wenn ich eine Funktion rekursiv aufrufe. Momentan soll erstmal das Spielfeld initialisiert und ausgegeben werden.
Hoffe die Kommentare sind gut gesetzt und verständlich. Finde das Problem einfach nicht, aber ein paar eingefügte cout's haben mir gezeigt, das es sich immer bei unterschiedlichen Feldern im Array aufhängt, deshalb tippe ich auf die rand-Funktion. Hab' das Programm schon 3mal neu geschrieben und selbst strukturiert kommt der selbe Fehler
Code:
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//Klasse fürs Spielfeld
class spielfeld{
public: void init();
int zufallszahl(int x, int y);
int checkreihe(int zahl,int x);
int checkspalte(int zahl, int y);
int checkquadrat(int quadrat,int zahl);
int getquadrat(int x, int y);
void show();
private: int feld[9][9];
};
//Initialisiert das Feld
void spielfeld::init(){
int x,y;
for (x=0;x<9;x++)
{
for(y=0;y<9;y++){
feld[x][y]=zufallszahl(x,y);
}
}
//Löscht beliebige Zahlen aus dem Sudoku
for(int del=0;del<35;del++){
x=rand()%9+1;
y=rand()%9+1;
feld[x][y]=NULL;
}
}
//Erzeugt eine Zufallszahl für Feld X-Y
int spielfeld::zufallszahl(int x, int y){
/*REKURSIONSTEST
//Zufallszahl zwischen 1 und neun generieren
int zahl = rand()%9+1;
//Schauen in welchem Quadrat das Feld liegt.
int quadrat = getquadrat(x,y);
if(checkquadrat(quadrat,zahl) == 0 && checkspalte(x,zahl)==0 && checkreihe(y,zahl) ==0 ) return zahl;
else return zufallszahl(x,y);
*/
int zahl,quadrat;
//Holt die Information in welchem Quadrat des Sudoku's sich die Zahl befindet
quadrat=getquadrat(x,y);
//Macht die Schleife so lang, bis eine Zahl heraus kommt die weder in
//Reihe, Spalte noch Quadrat vorkommt, diese wird dann zurück gegeben
//Alle Funktionen müssen 0 zurückgeben!
do
{
zahl=rand()%9+1;
}while((checkquadrat(quadrat,zahl))+(checkreihe(zahl,x))+(checkspalte(zahl,y))!=0);
return zahl;
}
//Schaut in welchem Quadrat sich die Koordinate befindet
int spielfeld::getquadrat(int x, int y){
if(x >= 0 && x<=2 && y>= 0 && y<=2) return 0;
if(x >= 0 && x<=2 && y>= 3 && y<=5) return 3;
if(x >= 0 && x<=2 && y>= 6 && y<=8) return 6;
if(x >= 3 && x<=5 && y>= 0 && y<=2) return 1;
if(x >= 3 && x<=5 && y>= 3 && y<=5) return 4;
if(x >= 3 && x<=5 && y>= 6 && y<=8) return 7;
if(x >= 6 && x<=8 && y>= 0 && y<=2) return 2;
if(x >= 6 && x<=8 && y>= 3 && y<=5) return 5;
if(x >= 6 && x<=8 && y>= 6 && y<=8) return 8;
}
//Prüfet das Quadrat auf die gleiche Zahl
int spielfeld::checkquadrat(int quadrat,int zahl){
int xstart,ystart;
switch(quadrat) {
case 0: xstart = 0; ystart = 0; break;
case 1: xstart = 3; ystart = 0; break;
case 2: xstart = 6; ystart = 0; break;
case 3: xstart = 0; ystart = 3; break;
case 4: xstart = 3; ystart = 3; break;
case 5: xstart = 6; ystart = 3; break;
case 6: xstart = 0; ystart = 6; break;
case 7: xstart = 3; ystart = 6; break;
case 8: xstart = 6; ystart = 6; break;
}
//Wenn Zahl existiert, wird der Wert 1
for (int x = xstart; x <= (xstart + 2) ; x++) {
for (int y = ystart ; y <= (ystart + 2) ; y++) {
if (zahl == feld[x][y]) return 1;
}
}
return 0;
}
//Prüft Reihe auf gleiche Zahl
int spielfeld::checkreihe(int zahl,int x){
for(int y=0;y<9;y++)
{
if(feld[x][y]==zahl)
return 1;
}
return 0;
}
//Prüft Spalte auf gleiche Zahl
int spielfeld::checkspalte(int zahl,int y){
for(int x=0;x<9;x++)
{
if(feld[x][y]==zahl)
return 1;
}
return 0;
}
//Gibt das Spielfeld aus
void spielfeld::show(){
for(int x=0;x<9;x++){
for(int y=0;y<9;y++){
cout<<feld[x][y];
}
cout<<endl;
}
}
int main()
{ //Random-Initialisierung
srand(time(NULL));
spielfeld cSpielfeld;
cSpielfeld.init();
cSpielfeld.show();
getchar();
return 0;
}
Würde mich ja gern mit nem Debugger hinsetzen und das ganze mal durchchecken, aber ich habe keine Ahnung wie man debuggt. Hat da evtl. jemand ein gutes Tutorial für an der Hand?
Zuletzt bearbeitet: