2010-06-08 7 views
1

Très bien, j'ai une question, je me suis éloigné de l'utilisation de chaînes pour la sélection alors maintenant j'utilise un nombre entier. Lorsque l'utilisateur entre un nombre, le jeu progresse. S'ils entrent un mauvais caractère, il DEVRAIT donner l'instruction else, cependant si j'entre une lettre ou un caractère, le système se met dans un effet de boucle sans fin puis se bloque. Est-il possible de donner l'instruction else même si l'utilisateur définit le type de la variable.Else instruction se bloque lorsque je tape une lettre pour une valeur de cin << int

// action variable; 
int c_action: 

if (c_action == 1){ 
    // enemy attack and user attack with added effect buffer. 
    /////////////////////////////////////////////////////// 
    u_attack = userAttack(userAtk, weapons); 
    enemyHP = enemyHP - u_attack; 

    cout << " charging at the enemy you do " << u_attack << "damage" << endl; 
    e_attack = enemyAttack(enemyAtk); 
    userHP = userHP - e_attack; 
    cout << "however he lashes back causing you to have " << userHP << "health left " << endl << endl << endl << endl; 
    //end of ATTACK ACTION 
}else{ 
    cout << "invalid actions" << endl; 
    goto ACTIONS; 
} 
+10

'goto' ?? !! ?? !!? –

+2

Vous n'avez pas montré la ligne qui lit l'entrée de l'utilisateur. –

+0

J'imagine que 'goto ACTIONS' peut être remplacé par un appel de fonction approprié. –

Répondre

1

Votre problème n'est pas avec l'instruction else, mais avec votre entrée. Si vous faites quelque chose comme

cin >> i; 

et entrez un caractère, les flux état d'erreur est réglé et toute tentative ultérieure de lire du flux échouera à moins que vous réinitialiser l'état d'erreur d'abord.

Vous devriez plutôt lire une chaîne et convertir le contenu des chaînes en nombre entier.

+0

ha ... 40 secondes en retard;) – Axel

+0

merci, c'est une excellente idée, je m'apprends C++ donc j'ai des tonnes de questions. – TimothyTech

+0

@Timothy: Ne pas être un joy-kill, mais vous allez juste vous blesser dans la connaissance de cette façon. Prenez un bon livre. http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG

3

Vous n'avez pas montré comment vous lisez l'entier. Mais en général, vous voulez faire quelque chose comme ceci:

int answer; 
if (cin >> answer) 
{ 
    // the user input a valid integer, process it 
} 
else 
{ 
    // the user didn't enter a valid integer 
    // now you probably want to consume the rest of the input until newline and 
    // re-prompt the user 
} 
+2

Plus précisément, quelque chose comme cin.clear(); cin.ignore (numeric_limits :: max(), '\ n'); – user168715

2

Le problème est que votre cin est saisissant le caractère et à défaut, ce qui laisse le caractère dans le tampon d'entrée. Vous devez vérifier si le cin a travaillé:

if(cin >> k) { ... } 

ou

cin >>k; 
if(!cin.fail()) { ... } 

et si elle échoue, effacer la mémoire tampon et le échouez bit:

cin.clear(); // clears the fail bit 
cin.ignore(numeric_limits<streamsize>::max()); // ignore all the characters currently in the stream 

EDIT: numeric_limits se trouve dans le fichier d'en-tête des limites, que vous incluez comme d'habitude:

#include <limits> 
+2

Je dois obtenir un mauvais code ou quelque chose parce que je ne vois pas une seule utilisation de cin dans le code OP. –

+0

@Noah Roberts: Il a mentionné que la boucle infinie est causée par l'utilisateur entrant un caractère au lieu d'un nombre. J'ai également commenté une question précédente qu'il a posée au sujet de cin, donc j'ai supposé que c'était un suivi. –