这些代码示例是否有问题?如果现场有一个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;
}
}
答案 0 :(得分:2)
您不能同时比较两个不同的值,因为表达式88||79
是逻辑的,并且评估为1
,适当的方式是:
if(!(board[i][j] == 88 || board[i][j] == 79))
或
if(board[i][j] != 88 && board[i][j] != 79)
答案 1 :(得分:1)
此if
声明没有按照您的想法执行:
if(board[i][j+2] != (88||79))
应该是:
if (board[i][j+2] != 88 && board[i][j+2] != 79)
88||79
正在执行逻辑或值为79
和88
的值true
,它始终为1
,等于1
,所以你是每次将电路板元素与{{1}}进行比较。
答案 2 :(得分: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))
答案 3 :(得分: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'
s。在您担心它可能已经改变或无效的任何时候调用它。