TicTacToe -- Hilfe?



  • Nach dem ich jetzt mal das Programm gestartet habe (außerhalb Code::Blocks) funktz wider dafür hab ich 1 Problem (hoffentlich das Letzte! Gebe ich einen Char ein ("a") dann hängt sich das Programm auf und gibt Hundert mal de selbe Line aus (Bitte Geben Sie eine Zahl ein: ). Hört erst auf wenn Ich das Terminal schließe.



  • Das liegt daran, weil ein falsches Zeichen (keine Zahl wie int ja erwartet) eingegeben wurde und bei cin nun der Fehlerstatus verhängt ist. Das kannst du so lösen:

    #include <limits>
    if( !(std::cin >> variable) ) {
    	std::cin.clear(); //fehlerstatus zurücksetzen
    	std::cin.ignore(std::numeric_limits<int>::max(), '\n'); //fehlerhafte Zeichen überspringen
        continue; //oder sowas in der richtung
    }
    

    Dann sollte alles weitergehen.



  • Hey!

    Vielen Dank jetzt funktioniert alles allerdings durchschaue ich den letzten Teil nicht ganz 😞 --> und ich will das verstehen was ich programmiere :D.

    std::cin.ignore(std::numeric_limits<int>::max(), '\n'); //fehlerhafte Zeichen überspringen
    

    Was bringt das ganze/was heißt std::numeric_limits<int>::max(), ?

    Danke für eure Hilfe



  • numeric_limits<DATENTYP>::max()/min() gibt die jeweilige größtmögliche/kleinstmögliche Zahl für den Datentyp an. Was std::cin.ignore() macht, erfährst du hier.

    mfg



  • Ok cin.ignore() hab ich verstanden und auch die Überprüfung ist logisch allerdings verwirrt mich das Dritte:

    std::cin.ignore(std::numeric_limits<int>::max(), '\n'); //fehlerhafte Zeichen überspringen
    

    Soweit ich das verstehen könnte ich auch genauso gut:

    iselectedfield = 11;
    

    damit wäre der Fehler doch genauso ausgewiesen?!? Oder verstehe ich da etwas falsch?



  • Wenn du eine Variable vom Typ int hast und sie vom Standardeingabemedium eingeben lässt, werden die eingegeben Zeichen im Puffer gespeichert. Wenn also statt einer Zahl ein Buchstabe o.ä. eingegeben wird, dann hängen die Zeichen im Speicher rum. Du kannst dann solange den Fehlerstatus mit clear() auf 0 setzen wie du willst - durch die Zeichen, die immer noch da sind, wird er jedes mal aufs neue verhängt. Wenn du allerdings mit ignore() jedes fehlerhafte Zeichen aus dem Puffer "verwirfst", dann sind keine fehlerhaften Zeichen mehr im Puffer und der Fehlerstatus wird erfolgreich dauerhaft auf 0 gesetzt - jetzt kann wieder eingegeben werden.
    Wenn ich was falsches gesagt habt korrigiert mich bitte, ich kenn mich da nicht so gut aus.



  • Ok, also funktioniert das so: das alles was in der Klammer steht heißt dann nur das in den Puffer der größt mögliche wert reingeschrieben wird was bei der Überprüfung wieder auffällt. Hab ich das jetzt richtig verstanden?



  • OK, wieder 1 Problem bei der Namen Eingabe. Es wird 1 Buchstabe erkannt und dann heißt der Player hald kpieler1 statt Kuwiano, der Zweite Player wird garnicht erkannt oder verändert hier der Code:

    char player1[] = "Spieler1";                                            //Name für Spieler 1
    char player2[] = "Spieler2";                                            //Name für Spieler 2
    
    void Playername(void)                                                   //Spieler Name Abfragen
    {
        std::cout << "Spieler 1 gib deinen Namen ein: ";
        std::cin >> player1[11];
    
        std::cout << "Spieler 2 gib deinen Namen ein: ";
        std::cin >> player2[11];
    }
    


  • Da ich keine Lust habe, dir das jetzt mit den C-Strings zu erklären (dafür gibt es genug andere Posts) empfehle ich dir nur, std::string zu verwenden.



  • Hallo, wiedereinmal!

    Ich möchte jetzt einen Timer in mein Spiel einbauen (Wenn ein Spieler dran ist zählt er von 10 runter --> Beendet den Spielzug). Ich habe mal mit for schleifen und sleep(); probiert allerdings ohne Erfolg. Gibt es eine Möglichkeit das zu machen?



  • Guck mal in #include <ctime> rein ...

    Zeit zeit = Zeit::jetzt()
    Gib 10 aus 
    while (Zeit::jetzt() < zeit + 10 Sekunden)
    {
       // guck ob spieler was eingegeben hat (cronio.h) oder so ... 
       // wenn nicht: 
        /// wenn Zeit::jetzt() > zeit+9 Sekunde n gib 1 aus,
        /// sonst wenn Zeit::jetzt() > zeit+8 Sekunde n gib 2 aus,
        /// sonst wenn Zeit::jetzt() > zeit+7 Sekunde n gib 3 aus,
        /// sonst wenn Zeit::jetzt() > zeit+6 Sekunde n gib 4 aus,
        /// sonst wenn Zeit::jetzt() > zeit+5 Sekunde n gib 5 aus,
        /// sonst wenn Zeit::jetzt() > zeit+4 Sekunde n gib 6 aus,
        /// sonst wenn Zeit::jetzt() > zeit+3 Sekunde n gib 7 aus,
        /// sonst wenn Zeit::jetzt() > zeit+2 Sekunde n gib 8 aus,
        /// sonst wenn Zeit::jetzt() > zeit+1 Sekunde n gib 9 aus,
        ///  - du musst dir auch merken welche Zeit du schon ausgegeben hast ... damit der nicht die Konsole vollspammt
    
    }
    


  • Und wie kann ich mit conio.h prüfen ob der Spieler etwas eingegeben hat ohne dass das Programm stehen bleibt?



  • dafür guckst du in die FAQ dieses Forums, da gibts nen Post zu genau sowas ... das ganze ist dann aber nimmer platformunabhängig aber das dürfte dir ja eh egal sein. Mhh finde den Beitrag gerade nicht ... vielleicht hilft dir ein Moderator weiter :| insgesamt ist es nicht ganz trivial zu schauen ob schon user input anliegt ... die streams können zwar peek'en aber wenn nix drin ist, blockieren die dann bis was kommt ... mag mich aber auch irren, ist bei mir schon lange her 😉


Anmelden zum Antworten