TicTacToe, Problem mit Schleife



  • Hi,

    ich bin gerade dabei ein TicTacToe für 2 Personen zu programmieren. Ich bin noch neu in Cpp, seit deshalb bitte nicht so hart mit meinen Programmierkünsten.

    #include <iostream>
    #include <string>
    using namespace std;
    
    /*Funktionen*/
    void setup();
    void show();
    bool check();
    bool zug();
    
    /*Variablen*/
    string spieler[3];
    int player = 2;
    bool game = true;
    bool zug_ok;
    int eingabe;
    string field[10];
    
    int main(){
        setup();
        while(game==true){
            if(player==2){
                player--;
            }else{
                player++;
            }
            show();
            while(zug_ok==false){
                zug_ok=zug();
            }
            zug_ok=false;
            game = check();
        }
        return 0;
    }
    
    void setup(){
        field[0] = "0";
        field[1] = "1";
        field[2] = "2";
        field[3] = "3";
        field[4] = "4";
        field[5] = "5";
        field[6] = "6";
        field[7] = "7";
        field[8] = "8";
        field[9] = "9";
        spieler[0] = "0";
        cout<<"Spieler 1 geben Sie Ihren Namen ein: ";
        cin>>spieler[1];
        cin.clear();
        cout<<"Spieler 2 geben Sie Ihren Namen ein: ";
        cin>>spieler[2];
        cin.clear();
        }
    
    void show(){
        cout<<"\n"<<field[1]<<"  |  "<<field[2]<<"  |  "<<field[3]<<endl;
        cout<<"-------------\n";
        cout<<field[4]<<"  |  "<<field[5]<<"  |  "<<field[6]<<endl;
        cout<<"-------------\n";
        cout<<field[7]<<"  |  "<<field[8]<<"  |  "<<field[9]<<endl;
    }
    
    bool zug(){
        cout<<spieler[player]<<" geben Sie ihre Zahl ein: ";
        cin>>eingabe;
        if(field[eingabe]=="X"||field[eingabe]=="0"){
            cout<<"Versuchen Sie es nochmal\n";
            return false;
        }
    
        return true;
    }
    
    bool check(){
        if((field[1]=="0"&&field[2]=="0"&&field[3]=="0")||(field[4]=="0"&&field[5]=="0"&&field[6]=="0")||(field[7]=="0"&&field[8]=="0"&&field[9]=="0")||(field[1]=="0"&&field[4]=="0"&&field[7]=="0")||(field[2]=="0"&&field[5]=="0"&&field[8]=="0")||(field[3]=="0"&&field[6]=="0"&&field[9]=="0")||
        (field[1]=="0"&&field[5]=="0"&&field[9]=="0")||(field[3]=="0"&&field[5]=="0"&&field[7]=="0")){
            cout<<"Spieler "<<spieler[1]<<" hat gewonnen!!\n";
            return false;
        }else if ((field[1]=="X"&&field[2]=="X"&&field[3]=="X")||(field[4]=="X"&&field[5]=="X"&&field[6]=="X")||(field[7]=="X"&&field[8]=="X"&&field[9]=="X")||(field[1]=="X"&&field[4]=="X"&&field[7]=="X")||(field[2]=="X"&&field[5]=="X"&&field[8]=="X")||(field[3]=="X"&&field[6]=="X"&&field[9]=="X")||
        (field[1]=="X"&&field[5]=="X"&&field[9]=="X")||(field[3]=="X"&&field[5]=="X"&&field[7]=="X")){
            cout<<"Spieler "<<spieler[2]<<" hat gewonnen!!\n";
            return false;
        }
        return true;
    }
    

    Und zwar habe ich das Problem, dass wenn ich einen Buchstaben, statt eine Zahl eingebe, schreib er danach nur noch ununterbrichen "Versuchen Sie es nochmal" In die Konsole. Wie kann ich bei cin überprüfen, ob wirklich ein Int eingegeben wurde? Und wo liegt, das problem, dass er nur noch "Versuchen sie es nochmal" aufruft.

    Philipp



  • lord-maricek schrieb:

    Und zwar habe ich das Problem, dass wenn ich einen Buchstaben, statt eine Zahl eingebe, schreib er danach nur noch ununterbrichen "Versuchen Sie es nochmal" In die Konsole. Wie kann ich bei cin überprüfen, ob wirklich ein Int eingegeben wurde? Und wo liegt, das problem, dass er nur noch "Versuchen sie es nochmal" aufruft.

    hi,

    also wenn du einen alphanumerischen Wert eingibst, statt einem numerischen (numerisch wird erwartet),
    dann wird das Eingabeobjekt (cin) auf einen Fehlerzustand gesetzt,

    cin.fail() // true
    

    und der eingegeben alphanumerische Wert bleibt im Puffer stecken.

    Um dieses Eingabeobjekt wieder benutzen zu können, musst du den Zustand dieses Objekts zurücksetzen,

    cin.clear();
    

    und dann solltest du die noch im Puffer stehenden Zeichen verwerfen:

    cin.sync()
    

    Alles in allem also:

    cin.clear();
    cin.sync();
    // ... und die nachfolgende Eingabe funktioniert wieder.
    

    hoffe das hilft 😉


Anmelden zum Antworten