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


Anmelden zum Antworten