2015-10-20 57 views
0

我寫一個連接4個遊戲,遊戲的一般流程是:忽略用戶的輸入,而其他計算正在發生

  1. 請問哪裏用戶想要玩
  2. 播放用戶移動
  3. 移動到計算機的回合
  4. 運行的算法來決定電腦移動
  5. 玩電腦移動
  6. 重複

我遇到的問題是,如果用戶輸入任何信息並按下回車鍵,當計算機決定其移動(可能需要10秒左右)時,下次計算機運行該功能要求玩家想要玩的地方,意外的價值觀被視爲輸入,然後遊戲被毀掉。

因此,如果玩家爲輸入,例如,該流的數據:

1(返程) 4(返回) 2(返程) alskdf(返程) jklgo [2(返回)

計算機會將這5個輸入視爲玩家輸入的內容,作爲他/她想要在接下來的5回合中玩的列。

我需要的是某種方式來忽略任何數量的用戶輸入,而另一個函數正在執行計算,但是一旦該函數完成了計算所需的操作,那麼直到該計算函數再次被調用的任何用戶輸入都應該被視爲有效的輸入。

這裏是從程序的main()函數的相關大塊:

while (turn < w_*h_) 
{ 
    if (whosTurn == 1) //player's turn 
    { 
     playerTurn(board, rowPlayed, colPlayed); //function that asks for user input 
     printScreen(board); 
     if (printWin(board, rowPlayed, colPlayed, pDisc)) break; 
    } 

    else if (whosTurn == 2) //computer's turn 
    { 
     compTurn(board, rowPlayed, colPlayed); //function that does the long calculations 
     printScreen(board); 
     cout << "The computer played in column "; 
     printColor(colPlayed+1, GREEN); 
     cout << "\n\n"; 
     if (printWin(board, rowPlayed, colPlayed, cDisc)) break; 
    } 

    if (whosTurn == 1) whosTurn = 2; 
    else whosTurn = 1; 

    turn++; 
} 

是真正相關的唯一功能是playerTurn()和compTurn(),但我只是想我會包括整個代碼塊給一些上下文。如果更多的代碼會有幫助,請讓我知道!

回答

1

之前調用playerTurn嘗試cin.ignore()促使更多的投入之前清除輸入流

+0

請問這項工作如果玩家是輸入一些字符數,按回車鍵,然後輸入一些更多的字符,然後再次按下輸入?而如果玩家實際上不會輸入任何他不應該輸入的內容,那麼我想要忽略的真實輸入是否會被忽略? – Carson

+0

剛剛測試過把cin.cear()和cin.ignore()放在兩個不同的地方,實際上它們看起來沒有任何區別,這讓我感到驚訝。就像在我放置cin.ignore()的地方一樣,它不像只有第一個輸入被忽略,其餘的都被採用了,即使第一個輸入被忽略了也沒有 – Carson

+0

你傳遞了​​任何參數給can.ignore()它應該2個參數 - 第一個是丟棄的最大字符數,第二個是分隔字符(EOF是默認值),例如cin.ignore(10, '\ n');會拋出前10個字符或直到遇到換行符 –