Vier Gewinnt Problem
-
Hi,
Zuerst einmal ich bin noch Anfänger also seid nicht kritisch mit meinem Programm
Ich würde gerne ein 4 Gewinnt Programm programmieren
habe auch schon ein kleines Programm geschrieben, aber habe noch Probleme bei der Gewinnerkennung.
Es wäre nett wenn ihr mir helfen könntet.Danke
PS: Die Diagonalen Gewinnmöglichkeiten habe bewusst weggelassen
Hier der Code
#include <stdio.h> #include <stdlib.h> // Spielfeld mit 6 Zeilen und 7 Spalten int spielfeld[6][7]; //Nummer des Spielers der grad dran ist int spieler; int main(int argc, char *argv[]) { initialisiere_spielfeld(); spieler=1; zeige_spielfeld(); while (spielende() != 0) { int eingabe_ergebnis = naechste_eingabe(); if(eingabe_ergebnis !=0){ printf("Spieler %i hat ein Fehler gemacht",eingabe_ergebnis); return 0; } zeige_spielfeld(); } system("PAUSE"); return 0; } int naechste_eingabe(){ printf("Spieler %i ist an der Reihe\n",spieler); printf("Biite Spalte zwischen 0 und 6 waehlen:"); int spalte; scanf("%i",&spalte); //Falsche Eingabe führt zu beenden if(spalte<0 || spalte>6){ return spieler; } //Spalte schon voll if(spielfeld[0][spalte]!=0){ return spieler; } int zeile=5; //Chip muss möglichst weit durch fallen while(spielfeld[zeile][spalte]!=0){ zeile = zeile-1; } //Chip einsetzen spielfeld[zeile][spalte]=spieler; //wechsel auf anderen Spieler if(spieler==1){ spieler=2; } else { spieler=1; } return 0; } int spielende() { if (gewonnen() > 0) { return 0; } if (spielfeld_belegt() == 1) { return 3; } } int gewonnen() { int i; int j; // Horizontal: Duchlaufe alle Zeilen for (i=0; i<6; i++) { //Duchlaufe für jede Zeile alle Spalten for (j=0; j<4; j++) { if (spielfeld[i][j] != 0) { // Sichte die nachfolgende drei Komponenten rechts if ((spielfeld[i][j] == spielfeld[i][j+1]) && (spielfeld[i][j] == spielfeld[i][j+2]) && (spielfeld[i][j] == spielfeld[i][j+3])) { return spielfeld[i][j]; } } } } // Vertikal: Duchlaufe alle Spalten for (j=0; j<5; j++) { //Duchlaufe für jede Zeile alle Zeilen for (i=0; i<3; i++){ if (spielfeld[i][j] != 0) { // Sichte die nachfolgende drei Komponenten rechts if ((spielfeld[i][j] == spielfeld[i][j+1]) && (spielfeld[i][j] == spielfeld[i][j+2]) && (spielfeld[i][j] == spielfeld[i][j+3])) { return spielfeld[i][j]; } } } } } int spielfeld_belegt() { int i; int j; // Duchlaufe alle Zeilen for (i=0; i<6; i++) { // Duchlaufe für jede Zeile alle Spalten for (j=0; j<7; j++) { // Spielfeld in Zeile i und Spalte j mit 0 belegen if (spielfeld[i][j] == 0) { return 0; } } } return 1; // alle Felder sind belegt } int initialisiere_spielfeld() { int i; int j; // Duchlaufe alle Zeilen for (i=0; i<6; i++) { // Duchlaufe für jede Zeile alle Spalten for (j=0; j<7; j++) { // Spielfeld in Zeile i und Spalte j mit 0 belegen spielfeld[i][j] = 0; } } } int zeige_spielfeld() { int i; int j; // Duchlaufe alle Zeilen for (i=0; i<6; i++) { // Duchlaufe für jede Zeile alle Spalten for (j=0; j<7; j++) { // Spielfeld in Zeile i und Spalte j mit 0 belegen printf("%i",spielfeld[i][j]); } printf("\n"); } }
-
Schau dir mal an, welche Indizes du bei horizontal und vertikal vergleichst.
Nur durch einen Kommentar ändert sich die Bedeutung nicht.
-
DirkB schrieb:
Schau dir mal an, welche Indizes du bei horizontal und vertikal vergleichst.
Nur durch einen Kommentar ändert sich die Bedeutung nicht.ja ok das stimmt da muss ich die +1 noch zu dem[i] hinzufügen aber es ist ja das Problem das ich bei der Überprüfung bzw der Beendigung des Spieles Probleme habe.
Also meint Programm nimmt aus welchen Gründen auch immer nicht wahr, dass das Spiel Zuende ist wenn halt 4 in einer Reihe sind.Aber Danke für den Hinweis
-
incomingswag schrieb:
DirkB schrieb:
Schau dir mal an, welche Indizes du bei horizontal und vertikal vergleichst.
Nur durch einen Kommentar ändert sich die Bedeutung nicht.ja ok das stimmt da muss ich die +1 noch zu dem[i] hinzufügen aber es ist ja das Problem das ich bei der Überprüfung bzw der Beendigung des Spieles Probleme habe.
Also meint Programm nimmt aus welchen Gründen auch immer nicht wahr, dass das Spiel Zuende ist wenn halt 4 in einer Reihe sind.Aber Danke für den Hinweis
3 Fehler hast Du gemcht und eine Gemeinheit.
1. Hat schon Dirk gesehen.
2. Gewonnen gibt einen undefinierten wert zurück, wenn noch keiner gewonnen hat. Return 0 fehlt.
3. Sobald der ein Spieler ein ungültiges zeichen eingegeben hat, zeigt dein Programm ein zufälliges verhalten. Inputbuffer leeren.Es ist fies, das Programm nach einer erkannten Fehleingabe einfach zu beenden. Was würdest du sagen, wenn deine ide einfach nach nem compiler fehler terminiert ohne zu speichern?
Mfg Martin