2017-10-14 117 views
0

我正在嘗試使用C++製作一個基本遊戲,以擴展我對該語言的理解。我有以下代碼,當用戶輸入無效答案時,他們會被要求再次嘗試。Cout函數在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); 
} 

當用戶輸入說「123456」他們的迴應是:

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

現在,這就是我想和同樣適用於一個字母。 E.g:

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

但是,當用戶輸入兩個或多個字母Invalid input: Try again:會打印出相同的次數作爲輸入的字母數...

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: 

可有人請解釋一下爲什麼?我對C++沒有太多的經驗,如果您對常規代碼有任何提示,我將非常感謝您的建議。

+1

'的std :: getline'可能是有用的。根據[cplusplus](http://www.cplusplus.com/reference/istream/istream/ignore/)和[cppreference](http:// en),'std :: cin.ignore()'只會忽略1個字符.cppreference.com /瓦特/ CPP/IO/basic_istream /忽略)。 – user202729

+0

cout <<「\ n」<< endl;爲什麼兩個版本 –

+0

@ user202729謝謝! –

回答

0

在while循環中只使用cin.clear()。

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

我試過,但後來打印出''無效的輸入。再試一次:「'一百萬次 –

+0

我正在使用visual studio,一切運行正常 –

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

如果你重新組織,你不需要'break'或'continue'有點邏輯。 'if(x < 1 || x > 9)std :: cout <<「錯誤值\ n」;否則if(board [x] =='X'|| board [x] =='Y')std :: cout <<「不能在那裏移動\ n」;'。 –

+0

只是運行它,看看它是如何工作的。 –