2016-09-09 80 views
1

中沒有效果我做了一個很好的井字遊戲。最近我決定添加重置遊戲功能。 這裏就是我需要來自用戶的輸入現在程序在調試中正常工作,但在版本

void playerMove() //Gets the player move and updates the box variables 
{ 
    int boxnumber; 
    while(1)  //Set's loop if the player enters a invalid input 
    { 
     cout << "\n Player " << player << "'s turn!(Press 0 to reset the game!): "; 
     cin >> boxnumber; 
     if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) // Checks if the input is valid or not 
     { 
      system("CLS");//If invalid, show error and loop back to start to get new input 
      displayBoard(); 
      cout << "\n Invalid Input! Try again!\n"; 

     }else if(boxnumber == 0) 
     { 
      refreshGame(); 
      displayBoard(); 
     }else 
     { 
      box[boxnumber-1] = player;//If inputs are fine, set the box variable's and break out of loop! 
      break; 
     } 
    } 

} 

,在調試模式下的一部分,當我按0,一切都正常運行,遊戲復位,但在發佈版本中,當我按0,它給我是「輸入無效!再試一次!」

我試過的東西沒有工作: - 重建整個版本和調試版本。 - 製作一個新項目並複製粘貼我的代碼。同樣的事情,調試工作,發佈沒有。

對於任何人想知道的,我使用code :: blocks IDE。編譯器是GNU GCC。 感謝您的幫助! :)

+0

我不認爲你可以得到箱[-1] –

+1

什麼是'boxnumber-1'去當你輸入'0'時,是否在'box [boxnumber-1]'中? – NathanOliver

回答

3

if語句中,將範圍檢查放在值檢查前面。也就是說,改變

if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) 

if(boxnumber < 0 || box number > 9 || box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O') 

這需要短路的優點:如果輸入值大於9的值的檢查將不被執行大於小於0或。這將避免檢查box[10]這些無效的內容。

這仍然存在一個問題:如果用戶輸入0,此代碼將愉快地檢查box[-1],這也超出範圍。爲了擺脫這種,移動if聲明,在這部分的測試前的box number == 0分支:

if (box number == 0) 
    // whatever 
else if (box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) 
    // whatever else 
+0

這是一個很好的修復。從來沒有想過這樣。感謝您的幫助:) – JohnMorris11

+0

@ JohnMorris11 - 另一個建議:從用戶處獲取值後,將其減1,以使可接受的值從0到8運行。這將消除數組訪問的所有「-1」。 –

4

您有未定義的行爲

在「第一」 if你有box[boxnumber-1],所以當你進入0(如你在你的問題已經說),你想用指數-1訪問元素。這就是UB,因爲你正在閱讀「無效」內存。

您應該首先檢查0(對於負數也是)。

+0

感謝您的回答。任何理由爲什麼這個工程在調試但不是在發佈? – JohnMorris11

+0

@ JohnMorris11 - 因爲「未定義行爲」:)生成的代碼在兩種模式下都不同,內存佈局也不同。所以,行爲也可能是/不同的。 –

+3

,因爲它可能實際上仍然給出「有效」的結果,僅憑意外 – deW1

相關問題