2013-04-20 95 views
-1

这些代码示例有问题吗?只要现场有一个X,如果能够取得胜利,它仍然会覆盖现场的O.显然,如果没有声明不起作用? 88和79是ASCII中的'X'和'O'。代码覆盖阵列

while(i+j<6) 
    { 
     if (board[i][j]+board[i][j+1] == compXO*2) 
     { 
      if(board[i][j+2] != (88||79)) 
      { 
      board[i][j+2] = compXO; 
      won=1; 
      break; 
      } 
     } 
     else 
      i++; 
    } 


if (board[i+1][j+1]+board[i+2][j+2] == compXO*2) 
    { 
     if(board[i][j] != (88||79)) 
     { 
     board[i][j] = compXO; 
     won=1; 

     } 
    } 

回答

2

您不能同时比较两个不同的值那样的,作为表达88||79是合乎逻辑的,或者和计算结果为1,适当的做法是:

if(!(board[i][j] == 88 || board[i][j] == 79)) 

if(board[i][j] != 88 && board[i][j] != 79) 
+0

第二个工作虽然我相信最后的括号是一个错误。 – 0x41414141 2013-04-20 01:33:34

+0

@ bh3244 - 你是对的 - 复制和粘贴的力量:) – MByD 2013-04-20 01:34:30

1

if声明没有做什么你认为它是:

if(board[i][j+2] != (88||79)) 

它应该是:

if (board[i][j+2] != 88 && board[i][j+2] != 79) 

88||79做逻辑或值7988的这将永远是true这将等于1,所以你比较th e板元素每次到1

+0

我想知道这是否是它。原来的声明究竟意味着什么? – 0x41414141 2013-04-20 01:22:23

1

88||79等于1.因此,您的if (board[i][j+2] != (88||79))实际上等于if (board[i][j+2] != 1)

你可能想要的是:

if (board[i][j+2] != 88 && board[i][j+2] != 79)) 
1

表达

if (board[i][j+2] != (88||79)) 

是比较board[i][j+2] 1,因为(88 || 79)计算结果为真,又名1.

也许你在做什么之后是:

if (board[i][j+2] != 88 && board[i][j+2] != 79) 

如果您给那些不明显的数字命名(或使用'X''O'--使用字符符号绝对没有效率增益(或损失),但清晰度有很大的提高)会更好。

if (board[i][j+2] != 'X' && board[i][j+2] != 'O') 

如果这是我们用来表示“既不X也不Ø本”的字符,这可能是' '或其他一些价值,那么你可以简化测试(0):

#define EMPTY ' ' 

if (board[i][j+2] == EMPTY) 

这似乎是你正在测试。如果您对自己的电路板没有信心,应该写一个验证函数,检查每个方块是否有有效值('X''O'EMPTY),并且没有太多的'X''O'。在任何您担心可能发生变化或无效的地方调用它。

+0

我最初确实使用'X'和'O',但不确定是否导致问题,所以我把它们放在数字形式。 – 0x41414141 2013-04-20 01:29:35