2016-07-17 16 views
0

In meinem Henker Spiel habe ich Probleme, das Spiel zu beenden. Mit meiner Header-Datei I definiert haben ...So beenden Sie Hangman-Spiel mit "Int promptYN (String-Antwort)" in C++

#define PLAY 1 #define STOP 0 #define ERROR -1

... und dann I definiert Funktion

int promptYN(string reply) 
{ 
    reply = strToUpper(reply); 
    if (reply == "YES", "OK", "SURE", "Y") 
     return PLAY; 
    else if (reply == "NO", "QUIT", "STOP", "TERMINATE", "N", "Q") 
     return STOP; 
    else 
     return ERROR; 
} 

... nun, dass die Funktion in Haupt egal, was die aufgerufen wurde Benutzertypen Das Hangman-Spiel läuft immer, auch wenn ich mit "NEIN", "QUIT", "STOP", "TERMINATE", "N", "Q" antworte.

Hier ist meine While-Schleife, die ich benutze, um zu versuchen und das Spiel zu spielen, ich brauche nur Hilfe herauszufinden, wenn der Benutzer mit "Y" reagiert, dann spielt das Spiel, "N" dann stoppt das Spiel oder ERROR und das Spiel wird zurückgesetzt, um die Frage erneut zu stellen. Vielen Dank!

cout << "Do you want to play hangman? (y or n): "; 
    cin >> userReply; 
    gameStatus = promptYN(userReply); 

    while (gameStatus != STOP) 
    { 
     if (gameStatus == PLAY) 
     { 
      chances = 0; 
      cout << "Let's Play\n\n"; 

      guessWord = getNextWord();     // Function call (randword.h) 
      guessWord = strToUpper(guessWord);   // Function call (MyFuncts.h) 
      cout << "\nWord to Guess: " << guessWord << endl; 
      cout << endl << h1; 


      while (wrong != 6)       // Function to find out which hangman board to print to user 
      { 
       cout << "\nEnter a letter to guess: "; 
       cin >> gLetter; 
       gLetter = toupper(gLetter); 
       cout << "You entered: " << gLetter << endl << endl; 

       cout << gLetter << " is NOT in the word to guess."; 

       wrong++; 

       if (wrong == 0) 
        cout << endl << h1 << endl; 
       if (wrong == 1) 
        cout << endl << h2 << endl; 
       if (wrong == 2) 
        cout << endl << h3 << endl; 
       if (wrong == 3) 
        cout << endl << h4 << endl; 
       if (wrong == 4) 
        cout << endl << h5 << endl; 
       if (wrong == 5) 
        cout << endl << h6 << endl; 
       if (wrong == 6) 
        cout << endl << h7 << endl; 
      } 
     } 

     else if (gameStatus == STOP) 
     { 
      cout << "Goodbye\n"; 
     } 

     else 
     { 
      cout << "Error - please enter (y or n)\n"; 
     } 
     cout << "Do you want to play hangman? (y or n): "; 
     cin >> userReply; 
     gameStatus = promptYN(userReply); 
    } 
+1

'if (Antwort ==" YES "," OK "," SURE "," Y ")' tut nicht, was Sie denken, dass es tut. Der Komma-Operator wertet alle Ausdrücke aus, gibt aber nur das Ergebnis des letzten zurück (in diesem Fall ein Zeiger auf das String-Literal "Y"). Da dies ein Wert ungleich null ist, wird dieser Test immer erfolgreich sein. Wenn Sie mit mehreren Strings vergleichen möchten, müssen Sie jeden einzeln vergleichen. –

Antwort

2

Diese Zeile:

if (reply == "YES", "OK", "SURE", "Y")

nicht vergleichen reply jedem dieser Saiten. Um das zu tun, müssen Sie die Saiten einzeln vergleichen:

int promptYN(string reply) 
{ 
    if (reply == "YES" || reply =="OK" || reply == "SURE" || reply == "Y") 
     return PLAY; 
    //... 
} 

Dies funktioniert jedoch einen besseren Weg, dies der Einstellung in C bis ++ ist so etwas wie ein std::set<std::string> zu verwenden und sehen, ob der Wert vorhanden ist:

#include <set> 
//... 

int promptYN(string reply) 
{ 
    static std::set<std::string> OKResponse = {"YES", "OK", "SURE", "Y"}; 
    static std::set<std::string> StopResponse = {"NO", "QUIT", "STOP", 
               "TERMINATE", "N", "Q"}; 
    if (OKResponse.count(reply) == 1) 
     return PLAY; 
    else 
    if (StopResponse.count(reply) == 1) 
     return STOP; 
    return ERROR; 
} 

Die std::set::count gibt 1 zurück, wenn der Wert in der Menge vorhanden ist, andernfalls wird 0 zurückgegeben.

Um eine weitere Antwort entweder auf "ok" oder "stop" hinzuzufügen, müssen nur weitere Zeichenfolgen zu jedem der set Werte hinzugefügt werden.

Live Example

Hinweis: Stellen Sie sicher, dass Sie eine kompatible C++11 Compiler haben, sowohl für die Einrichtung der std::set, und dass static Arbeiten in einem Thread-sichere Weise zu gewährleisten.

+0

Schöne Erklärung. Meiner Meinung nach ist das Platzieren einer unveränderlichen Datendefinition in einer Funktion nur für Lern-/Beispielzwecke geeignet. Also würde ich es global machen und dann "const", um seine Unveränderlichkeit weiter hervorzuheben. – iksemyonov

+0

Danke, das war ein sehr einfacher Fehler, den ich ohne Ihre Hilfe nicht bemerkt hätte. –