-1

这些代码示例有问题吗?每当现场出现 X 时,如果可以获胜,它仍然会覆盖现场的 O。显然 if not 语句不起作用?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;

        }
    }
4

4 回答 4

2

您不能一次比较两个不同的值,因为表达式88||79是逻辑的或,并且计算结果为1,适当的方法是:

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

或者

if(board[i][j] != 88 && board[i][j] != 79)
于 2013-04-20T01:27:14.550 回答
1

This if statement is not doing what you think it is:

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

It should be:

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

88||79 is doing a logical or of the values 79 and 88 which will always be true which will be equal to 1, so you are comparing the board element to 1 each time.

于 2013-04-20T01:21:06.730 回答
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))
于 2013-04-20T01:27:39.540 回答
1

表达方式

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

与 1比较board[i][j+2],因为(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 也不存在 O”的字符,它可能是' '或其他值(0?),那么您可以将测试简化为:

#define EMPTY ' '

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

这似乎是您正在测试的内容。如果您不确定您的棋盘是否准确,您应该编写一个验证函数来检查每个方格是否具有有效值('X''O'EMPTY)以及是否有太多'X'的 s 或'O's。在您担心它可能已更改或无效的任何时候调用它。

于 2013-04-20T01:27:53.220 回答