2016-09-09 49 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

相关问题