C++ Vier Gewinnt ... die alte Laier



  • Mahlzeit zusammen,

    ich stehe kurz vor einem Nervenzusammenbruch ....

    Und zwar geht es obwohl das Netz ja eigentlich schon voll ist mit solchen Codes um einen Code für Vier Gewinnt. Wir haben eine Struktur vom Prof vorgeschrieben bekommen und sollen diesen nur mit Implementierungen ergänzen. Allerdings komme ich mit dieser Struktur überhaupt nicht zurecht.
    Zudem muss ich auch gestehen, dass Informatik noch nicht mein Steckenpferd ist.

    Ich habe jetzt etliche Stunden an dem Code verbracht aber letztendlich noch nichts auf die Beine gestellt bekommen. Das Projekt muss morgen abgeben werden und es wäre stark wenn ich hier ein paar Denkanstöße bekommen könnte. Durch die Projektarbeit können wir Bonuspunkte für die anstehende Prüfung sammeln, welche ich ungern liegen lassen würde, da die Prüfung ohnehin schon schwer genug sein wird für mich.

    Also dies ist der vollständige Quelltext:

    #include <iostream>
    #include <ctime>
    #include <windows.h>
    
    using namespace std;
    
    /*--------------------------------------------------------------------------------------*/
    /* Funktionsdeklarationen                                                               */
    /*--------------------------------------------------------------------------------------*/
    
    void ZeichneSpielfeld(unsigned char const spielfeld[6][7]);
    int SpielerEingabe(unsigned char const spielfeld[6][7], int spieler);
    int ZugAusfuehren(unsigned char spielfeld[6][7], int spieler, int spalte);
    bool PruefeGewinn(unsigned char const spielfeld[6][7], int spieler, int spalte, int zeile);
    bool PruefeUnentschieden(unsigned char const spielfeld[6][7]);
    int ComputerEingabe(unsigned char spielfeld[6][7], int spieler);
    void gotoxy(short x, short y);
    int ErstesFreiesFeld(int spalte, unsigned char const spielfeld[6][7]);
    
    /*--------------------------------------------------------------------------------------*/
    /* Hauptprogramm                                                                        */
    /*--------------------------------------------------------------------------------------*/
    
    // Achtung: Das Hauptprogramm darf nur zu Testzwecken ver�ndert werden. Ihre Abgabe wird
    // mit dem Original-Hauptprogramm getestet und sollte damit funktionieren.
    int main()
    {
        // Computerspieler aktivieren bzw. deaktivieren: true/false
        bool computer = true;
    
        // Startspieler festlegen: 1 oder 2 (Computer ist immer 2)
        int spieler = 1;
    
        // Zufallszahlengenerator initialisieren
        srand((unsigned int)time(NULL));
    
        // leeres Spielfeld erzeugen
        unsigned char spielfeld[6][7] = {};
    
        // Spielfeld zeichnen
        ZeichneSpielfeld(spielfeld);
    
        int spalte, zeile;
        for (;;)
        {
            // Computer an der Reihe? 
            if (computer && spieler == 2)
            {
                // Wahl der Spalte durch Computerspieler
                spalte = ComputerEingabe(spielfeld, spieler);
                gotoxy(15,0);
                cout << "Computer: " << spalte;
            }
            else
            {
                // Wahl der Spalte durch menschlichen Spieler
                spalte = SpielerEingabe(spielfeld, spieler);
            }
    
            // Zug ausf�hren
            zeile = ZugAusfuehren(spielfeld, spieler, spalte);
    
            // Gewonnen?
            if (PruefeGewinn(spielfeld, spieler, spalte, zeile))
            {
                gotoxy(14,0);
                cout << "Spieler " << spieler << " hat das Spiel gewonnen!" << endl;
                break;
            }
    
            // Unentschieden?
            if (PruefeUnentschieden(spielfeld))
            {
                gotoxy(14,0);
                cout << "Das Spiel ist unentschieden ausgegangen!" << endl;
                break;
            }
    
            // n�chster Spieler
            spieler = spieler % 2 + 1;
        }
    
        system("pause");
        return 0;
    }
    
    // Cursor in Zeile x und Spalte y positionieren
    void gotoxy(short x, short y)
    {
        COORD coord = {y, x};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    } 
    
    /*--------------------------------------------------------------------------------------*/
    /* BITTE NUR UNTERHALB DIESER LINIE IHRE IMPLEMENTIERUNG VORNEHMEN.                     */
    /*--------------------------------------------------------------------------------------*/
    
    void ZeichneSpielfeld(unsigned char const spielfeld[6][7])
    {
    	std::cout <<std::endl;
      cout <<   "  1   2   3   4   5   6   7\n\n"
    
      for (int i=0;i<6;++i)
      {
        for (int j=0;j<8;++j)
        {
          cout <<  "| ";
          switch (spielfeld[i][j])
          {
            case 1:
                 cout << "x";
                 break;
            case 2:
                 cout << "o";
                 break;
            default:
                 cout << " ";
                 break;
          }//switch
          cout<<" " ;
        }
    
        cout <<"\n|---|---|---|---|---|---|---|\n";
      }
      cout << "\n\n\n";
    
    }
    
    int ErstesFreiesFeld(const int spalte, unsigned char const  spielfeld[6][7])
    {
      if ((spalte>=7) || (spalte<0)) return -1;
      int i;
      for (i=6;i>=0;--i)
      {
        if (spielfeld[i][spalte]==0) return i;
      }
      return -1;
    }
    
    int SpielerEingabe(unsigned char const spielfeld[6][7], int spieler,  int frei)
    {
        bool validInput = false;
    	int spalte = 0;
    
    	while (true)
    	{
    	cout << "In welcher Spalte soll Ihr Stein gesetzt werden?  ";
        cin >> spalte; 
    	spalte = spalte -1;
    	frei = ErstesFreiesFeld(spalte, spielfeld);
    
    	validInput = ((spalte>=0) && (spalte<6) && (frei!=-1));//ACHTUNG HIER UEBERPRUEFEN -1
    	if (!validInput)
    	{
    		cout << "Diese Spalte ist bereits voll!\n";
    	}
    	else
    	{
    		break;
    	}
    	}
        return spalte;
    	return frei;
    }
    
    int ZugAusfuehren(unsigned char spielfeld[6][7], int spieler, int spalte)
    {
    
    	int frei = ErstesFreiesFeld(spalte, spielfeld);
    
    	spielfeld[frei][spalte] = spieler;
    
        return spieler;
    }
    
    bool PruefeGewinn(unsigned char const spielfeld[6][7], int spieler, int spalte, int zeile)
    {
        bool gewinn = true;
    
        // ---------------------------------------------------------------------
        // Bitte hier Ihre Implementierung der Funktion realisieren
        // ---------------------------------------------------------------------
    
        return gewinn;
    }
    
    bool PruefeUnentschieden(unsigned char const spielfeld[6][7])
    {
        bool unentschieden = true;
    
        // ---------------------------------------------------------------------
        // Bitte hier Ihre Implementierung der Funktion realisieren
        // ---------------------------------------------------------------------
    
        return unentschieden;
    }
    
    int ComputerEingabe(unsigned char spielfeld[6][7], int spieler)
    {
        int spalte = 0;
    
        // ---------------------------------------------------------------------
        // Bitte hier Ihre Implementierung der Funktion realisieren
        // ---------------------------------------------------------------------
    
        return spalte;
    }
    

    Ja wie ihr hier wahrscheinlich seht fehlen mir echt noch elementare Dinge der Programmierung.
    Es scheitert schon daran einen Stein zu setzten. 😕

    Habe schon versucht mit Internetquellen zu arbeiten aber naja, dass ist leider dass beste was ich herausholen konnte.

    Ich wäre dankbar für jegliche Unterstützung
    Lieben Gruß 🙂



  • Wo ist denn das Problem? Was funktioniert nicht?

    So wie ich das sehe musst du nur die letzten 3 Methoden implementieren. Überlege dir als was eintreffen muss, damit das Spiel gewonnen oder unentschieden ist.

    Die Computereingabe wird wohl nur eine Markierung in der nächsten freien Stelle vornehmen?



  • Schon das setzten der "Steine" funktioniert nicht, hab mich ziemlich verrannt und sehe den Wald vor lauter Bäume nicht mehr.



  • -hier steht nichts-



  • Warum kann ich das Array denn nicht als Kopie übergeben.



  • Das erste was mir hier gleich mal auffällt ist Zeile 166+167
    Eine Methode hat keine 2 return-Werte. Nur einen!

    Um weitere Fehler zu finden, bietet sich der Debugger an. Nachdem du offenbar noch nicht so viel Erfahrung hast, HIER gibt es eine kleine Anleitung.

    Am besten eine Methode nach der anderen angehen und durchtesten.
    Wenn das Zeichnen des Spielfeldes klappt, dann versuchen per Abfrage eigene Steine zu setzen. Wenn das nicht klappt konkrete Fragen stellen, so kann die besser geholfen werden.



  • Oh ja das "return frei;" sollte da nicht mehr stehen

    Okay ich werde mal gleich das Projekt von vorne beginnen. Mal schauen wie weit ich es noch schaffe.


Log in to reply