Bug in der Tic Tac Toe implementierung



  • ein paar gedanken dazu, die meisten sicherlich schlecht. es geht nur ums ausloten.

    #include<iostream>
    #include<iomanip>
    
    using namespace std;
    
    struct feld
    {
       feld(){isEmpty=true;}
       char ch;//Zeichen
       bool isEmpty;
    };
    //ch überladen und dreiwertig machen
    /*struct feld
    {
       feld(){ch='.';)
       char ch;
    };*/
    
    class tic_tac_toe
    {
    private:
        feld Spielfeld[3][3];//andere anordnung, wie bereits gesagt
    //    int anzahl;
    public:
        void zug(char ch);
        void anzeigen();
        bool gewonnen(char ch);
        tic_tac_toe();
        bool unentschieden();
    };
    
    bool tic_tac_toe::unentschieden()
    {
       //return anzahl==9
       for(int i=0;i<3;i++)
       {
          for(int j=0;j<3;j++)
          {
             if(Spielfeld[i][j].isEmpty) return false;
          }
       }
       return true;
    }
    
    tic_tac_toe::tic_tac_toe()
    {
    //passiert schon im ctor von feld
        Spielfeld[0][0].ch='.';
        Spielfeld[0][1].ch='.';
        Spielfeld[0][2].ch='.';
        Spielfeld[1][0].ch='.';
        Spielfeld[1][1].ch='.';
        Spielfeld[1][2].ch='.';
        Spielfeld[2][0].ch='.';
        Spielfeld[2][1].ch='.';
        Spielfeld[2][2].ch='.';
    }
    
    //bool range(int min,int x,int max){return min<=x && x<=max)
    
    void tic_tac_toe::zug(char ch)
    {
        int reihe=0;
        int spalte=0;
        do
        {
           cout<<"Spalte: ";
           cin>>spalte;
           cout<<"Reihe: ";
           cin>>reihe;
        }while(reihe<1 || reihe>3 || spalte<1 || spalte>3 || !Spielfeld[spalte-1][reihe-1].isEmpty);
    //while(range(1,reihe,3) || range(1,spalte,3) || Spielfeld[spalte-1][reihe-1]!='.');
        Spielfeld[spalte-1][reihe-1].ch=ch;
    //weg    Spielfeld[spalte-1][reihe-1].isEmpty=false;
    //++anzahl
    }
    
    void tic_tac_toe::anzeigen()
    {
    //    int i;
    //    int y;
        for(/*int */i=0;i<3;i++)//besser x?
        {
            for(/*int */y=0;y<3;y++)
            {
                cout<<setw(2)<<Spielfeld[y][i].ch;
            }
            cout<<"\n\n";
        }
    }
    
    bool tic_tac_toe::gewonnen(char ch)
    {//einfacher machen, das return ist viel guter als exit
        if(Spielfeld[0][0].ch==ch && Spielfeld[0][1].ch==ch && Spielfeld[0][2].ch==ch)
        {
            return true;
        }
        if(Spielfeld[1][0].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[1][2].ch==ch)
        {
            return true;        
        }
        if(Spielfeld[2][0].ch==ch && Spielfeld[2][1].ch==ch && Spielfeld[2][2].ch==ch)
        {
            return true;        
        }
        if(Spielfeld[0][1].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[2][1].ch==ch)
        {
            return true;       
        }
        if(Spielfeld[0][0].ch==ch && Spielfeld[1][0].ch==ch && Spielfeld[2][0].ch==ch)
        {
            return true;        
        }
        if(Spielfeld[0][2].ch==ch && Spielfeld[1][2].ch==ch && Spielfeld[2][2].ch==ch)
        {
           return true;       
        }
        if(Spielfeld[0][0].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[2][2].ch==ch)
        {
           return true;        
        }
        if(Spielfeld[0][2].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[2][0].ch==ch)
        {
           return true;        
        }
        return false;
    }
    
    int main()
    {
        tic_tac_toe tic;
        while(true)//for(;;)
        {
            tic.anzeigen();
            tic.zug('x');
            if(tic.gewonnen('x'))
            {
                cout<<"Spieler 1 hat gewonnen!"<<endl;
    //wirkungslos             void anzeigen();
                break;
    //return statt break, also diese schleife aus der main() raus
            }
            if(tic.unentschieden())
            {
                cout<<"Unentschieden!"<<endl;
                void anzeigen();
                break;
            }
    
            tic.anzeigen();
            tic.zug('o');
            if(tic.gewonnen('o'))
            {
                cout<<"Spieler 2 hat gewonnen!"<<endl;
                void anzeigen();
                break;
            }
            if(tic.unentschieden())
            {
                cout<<"Unentschieden!"<<endl;
                void anzeigen();
                break;
            }
    
        }
        cin.ignore();
        getchar();
        return 0;
    }
    


  • Warum for(;;) statt while(true) ???

    Sonst ja ok man konnte es noch verbessern. Wir könnten für ch auch ein enum machen zb: enum eCh{X,O,no};
    aber ist dann geschmakssache



  • Dumme Smileys meinte for( ; ; )



  • Karldin schrieb:

    Warum for(;;) statt while(true) ???

    for(;;) 🙂 nur um zu zeigen, daß man nicht pascal schreibt.

    Wir könnten für ch auch ein enum machen zb: enum eCh{X,O,no};

    oder char const KREUZ='X'; char const KREIS='O'; char const LEER=' ';
    sowas war ganz fein in nem 4-gewinnt-spiel, das ich mal schrieb.


Anmelden zum Antworten