2017-10-14 11 views
0

私はC言語を使って基本的なゲームを作ろうとしています。私は次のコードを持っています。ユーザーが無効な答えを入力すると、再度試してみるように求められます。Coutで関数Coutで何度でも何度も印刷されます

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: 

今、それは私が欲しいものであり、同じは、単一の文字のために行きます。例えば:

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

しかし、時にユーザが入力Invalid input: Try again:は、入力された文字の数と同じ回数をプリントアウトします2つの以上の文字...

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'は有用である可能性があります。そして 'std :: cin.ignore()'は[cplusplus](http://www.cplusplus.com/reference/istream/istream/ignore/)と[cppreference](http:// en)に従って1文字だけを無視します。 .cppreference.com/w/cpp/io/basic_istream/ignore)。 – user202729

+0

cout << "\ n" << endl;なぜ2つのバージョン –

+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

は、私はそれを試みたが、それは 'プリントアウトし、「無効な入力を再度実行してください:」私はVisual Studioとすべてのものを使用しています'万回 –

+0

あなたが再編成場合は、 'break'または' continue'を必要としない、[OK] –

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

を実行しますロジックは少しです。 'if(x < 1 || x > 9)std :: cout <<" bad value \ n "; else if(board [x] == 'X' || board [x] == 'Y')std :: cout << "はそこに移動できません。 –

+0

これを実行して、どのように動作するかを確認してください。 –

関連する問題