Sudoku Spiel Block Abfrage
-
Hallo ich hab ein problem bei meinem Sudoku Spiel. Ich weiß echt nicht mehr weiter ich bekomme die Block Abfrage einfach nicht hin. Könnte mir bitte jemand eine Lösung geben?
Mein Lösungsansatz:
for(y;y<9;y++) { for(x;x<9;x++) { y/3; x/3; } }
aber wenn ich es so mache bekomme ich das komplette Spielfeld ich will aber nur den angeben y und x Wert überprüfen z.b x=1 y=1
1 0 2 0 0 3 0 4 0
0
2
8
1
7
0
0
0
-
Das sind zwei Schleifen die überhaupt gar nichts tun, außer ein bisschen zu rechnen und die Ergebnisse sofort wieder zu verwerfen. Gib mal Kontext. Wovon redest du überhaupt? Was willst du tun? Wie sehen die Datenstrukturen in deinem Programm aus? Wir sind hier keine Hellseher. Lies dir auch ganz dringend mal den "RTFM! Warum dir keiner helfen will..."-Thread hier im Forum, den Thread "Du brauchst Hilfe?" aus meiner Signatur und den jeweils dort verlinkten Aufsatz über das Stellen guter Fragen durch. Das ist kein Scherz. Wenn du gute Fragen stellst, dann bekommst du auch gute Antworten, anstatt Gegenfragen und dummen Kommentaren.
-
Ich entschuldige mich für meinen vorherigen Post denn mit dem kleinen Code fetzen kann man nun wirklich nichts anfangen. Ich habe mir nun auch die jeweiligen Threads durchgelesen.
Wenn du Code postest, dann bitte nur ein kleines darstellendes Programm, welches man sofort und ohne Umwege kompilieren kann.
Ich weiß nun leider nicht, ob ich wirklich nur einen Teil des Codes posten soll,denn es hängt größten teils zusammen ich habe dennoch einen abgespeckteren
Code gepostet und ich hoffe das dies ausreicht.#include <stdio.h> #include <stdlib.h> int main () { int Feld[9][9]={{0,0,0,1,5,7,0,3,6}, {0,0,7,0,0,6,0,0,0}, {6,0,1,0,0,0,0,0,7}, {7,0,6,4,0,5,2,1,3}, {0,0,0,3,0,8,0,4,5}, {4,0,0,7,0,1,0,0,0}, {5,7,0,2,1,3,0,8,4}, {8,0,4,5,7,9,0,0,0}, {0,1,0,0,0,4,5,0,0}}; int hori[9]={0}; int vert[9]={0}; int Spalte; int Zeile; int Zahl; int x; int y; int check=1; printf("Geben sie die gewuenschte Spalte an von (1-9):"); fflush(stdin); scanf("%d",&Spalte); x=Spalte; printf("Geben sie die gewuenschte Zeile an von (1-9):"); fflush(stdin); scanf("%d",&Zeile); y=Zeile; printf("Geben sie die gewuenschte Zahl an von (1-9):"); fflush(stdin); scanf("%d",&Zahl); for(y=0;y<9;y++) { y/3; vert[y]=Feld[y][x]; if(vert[y]==Zahl) { printf("Zahl schon in Spalte\n"); check=0; } } for(x=0;x<9;x++) { x/3; hori[x]=Feld[y][x]; if(hori[x]==Zahl) { printf("Zahl schon in Zeile\n"); check=0; } } printf("%d\n",check); if(check==1) { Feld[y-1][x-1]=Zahl; } return 0; }
Undzwar ab Zeile 47 wenn überprüft wird ob die Zahl schon vorkommt. Kommt die Zahl vor wird check auf 0 gesetzt wenn nicht dann bleibt check auf 1 aber leider wird check immer auf 0 gesetzt egal ob die Bedingung erfüllt ist oder nicht. Meine Frage ist nun wie schaffe ich es,dass check nur auf 0 gesetzt wird wenn auch wirklich nur die jeweilige if-Bedingung erfüllt ist oder kann es sein das ich da einen Logik-Fehler habe?
Ich hoffe ich konnte euch dieses mal ein wenig entgegenkommen.
-
Hervorragender Beitrag
, beim nächsten mal noch [cpp]-Tags anstatt [code] benutzen, dann wird es sogar bunt.
Was sollen
y/3;
undx/3;
bewirken? Das macht überhaupt gar nicht. Solche Fehler teilt dir dein Compiler auch gerne mit, wenn du ihn anweist, mit maximalen Warnungen zu compilieren (beim GCC geht das mit -Wall und für extra viele Warnungen auch noch -Wextra). Das sollte man grundsätzlich immer tun und solange man noch Anfänger ist und nicht ganz genau weiß, dass die Warnung ungefährlich ist, dann sollte man sie wie eine Fehlermeldung behandeln.
-
Mir fällt auf dass in der zweiten Schleife y IMMER 9 ist.. und am ende sind x und y 9.. Und y/3 sowie x/3 werden auch nie verwendet und sind da überflüssig.
Ich hätte das so gemacht: (Mal davon abgesehen dass es keine Fehlerbehandlung gibt)
int Feld[9][9]= { {0,0,0,1,5,7,0,3,6}, {0,0,7,0,0,6,0,0,0}, {6,0,1,0,0,0,0,0,7}, {7,0,6,4,0,5,2,1,3}, {0,0,0,3,0,8,0,4,5}, {4,0,0,7,0,1,0,0,0}, {5,7,0,2,1,3,0,8,4}, {8,0,4,5,7,9,0,0,0}, {0,1,0,0,0,4,5,0,0}}; int Spalte; int Zeile; int Zahl; bool vorhanden=false; printf("Geben sie die gewuenschte Spalte an von (1-9):"); fflush(stdin); scanf_s("%d",&Spalte); printf("Geben sie die gewuenschte Zeile an von (1-9):"); fflush(stdin); scanf_s("%d",&Zeile); printf("Geben sie die gewuenschte Zahl an von (1-9):"); fflush(stdin); scanf_s("%d",&Zahl); for(int y=0;y<9;y++) { if(Feld[y][Zeile]==Zahl) { printf("Zahl schon in Spalte\n"); vorhanden=true; } } for(int x=0;x<9;x++) { if(Feld[Spalte][x]==Zahl) { printf("Zahl schon in Zeile\n"); vorhanden=true; } } if(!vorhanden) { Feld[Spalte][Zeile]=Zahl; }
Sorry aber hast du dein Programm mal mit einem Debugger untersucht ?
-
NeXiiR schrieb:
oder kann es sein das ich da einen Logik-Fehler habe?
Ja
Wenn du schon Zeile und Spalte in Variablen einliest, solltest du sie auch beim Vergleich benutzen. (Bedenke aber das Arrays immer bei 0 anfangen.
for(y=0;y<9;y++) // hier lässt du y von 0 bis 98 laufen // egal welchen Wert y vorher hatte { y/3; // diese Zeile hat keinen Effekt vert[y]=Feld[y][x]; // y ist links und rechts das selbe // Warum liest du dann überhaupt Zeile und Spalte ein
-
Da du gerade am rumraten bist, wie du das am besten machst, gib doch mal ein bisschen mehr Informationen aus.
Lass dir die aktuelle Zeile und Spalte und den Wert mit ausgeben.
Statt
printf("Zahl schon in Spalte\n");
schreibst du etwaprintf("Zahl schon in Spalte %d Zeile %d: %d == %d\n", y, x, vert[y],Feld[y][x]);
-
DirkB schrieb:
Da du gerade am rumraten bist, wie du das am besten machst, gib doch mal ein bisschen mehr Informationen aus.
Lass dir die aktuelle Zeile und Spalte und den Wert mit ausgeben.
Statt
printf("Zahl schon in Spalte\n");
schreibst du etwaprintf("Zahl schon in Spalte %d Zeile %d: %d == %d\n", y, x, vert[y],Feld[y][x]);
Vielen Dank für den Tipp!