2017-10-14 5 views
0

J'essaie de faire un jeu de base en utilisant C++ juste pour élargir ma compréhension de la langue. J'ai le code suivant et quand l'utilisateur entre une réponse invalide ils seront invités à essayer à nouveau.Cout dans la fonction imprime trop de fois en C++

void turn_update() 
{ 
    player = (player % 2 == 0)? 1 : 2; 
    mark = (player == 1)? 'X' : 'O'; 

    cout << " Please make your move, " << mark << ":" << endl; 
    int x = 0; 
    while(!(cin >> x) || x > 9 || x < 1 || board[x] == 'X' || board[x] == 'O') 
    { 
     cin.clear(); 
     cin.ignore(); 
     cout << " Invalid input. Try again: "; 
    } 
    cout << "\n" << endl; 
    board[x] = mark; 
    draw_board(board); 
} 

Lorsque les entrées utilisateur disent « 123456 » la réponse serait:

Please make your move, X: 
123456 
Invalid input. Try again: 

Maintenant, c'est-ce que je veux et va de même pour une seule lettre. Par exemple:

Please make your move, X: 
a 
Invalid input. Try again: 

Mais lorsque les entrées utilisateur deux ou plusieurs lettres le Invalid input: Try again: va imprimer le même nombre de fois que le nombre de lettres entrées ...

Please make your move, X: 
aa 
Invalid input. Try again: Invalid input. Try again: 

Please make your move, X: 
aaa 
Invalid input. Try again: Invalid input. Try again: Invalid input. Try again: 

Quelqu'un peut-il s'il vous plaît expliquer pourquoi? Je n'ai pas beaucoup d'expérience avec C++ et si vous avez des conseils pour le code général, j'apprécierais vos conseils.

+1

'std :: getline' peut être utile. Et 'std :: cin.ignore()' n'ignore qu'un seul caractère selon [cplusplus] (http://www.cplusplus.com/reference/istream/istream/ignore/) et [cppreference] (http: // fr .cppreference.com/w/cpp/io/basic_istream/ignore). – user202729

+0

cout << "\ n" << endl; pourquoi deux version –

+0

@ user202729 Merci! –

Répondre

0

Utilisez uniquement cin.clear() dans la boucle while.

while (!(cin >> x) || x > 9 || x < 1 || board[x] == 'X' || board[x] == 'O')) 
{ 
    cin.clear(); 
    cout << " Invalid input. Try again: "; 
} 
+0

Je l'ai essayé mais ensuite il imprime "Entrée invalide Essayez encore:" 'un million de fois –

+0

J'utilise Visual Studio et tout fonctionne bien –

0
cout << " Please make your move, " << mark << ":" << endl; 
int x = 0; 

while (true) 
    while (!(cin >> x)) { 
     cin.clear(); 
     cin.ignore(); 
     cout << "Please provide a valid number in range 1 - 9. Try again: "; 
    } 
    if (x < 1 || x > 9) { 
     cout << "value out of range 1 - 9" 
     continue; 
    } 
    if (board[x] != 'X' && board[x] != 'O') { 
     break; 
    } 
    cout << "Cant make a move at " << x << " occupied by: " << board[x]; 
} 
+0

Vous n'avez pas besoin du' break' ou du 'continue' si vous vous réorganisez la logique un peu. 'if (x < 1 || x > 9) std :: cout <<" mauvaise valeur \ n "; sinon si (board [x] == 'X' || board [x] == 'Y') std :: cout << "ne peut pas se déplacer là \ n"; '. –

+0

il suffit de le lancer et de voir comment cela fonctionne. –