TicTacToe 游戏中的逻辑错误

Logic Error in TicTacToe game

这是一个我无法完全理解的简单逻辑错误:

为什么下面的语句总是等同于 true?

if ( (grid[i][0] && grid[i][1] && grid[i][2]) == ('X' || 'x') ) return true;

完美运行
if ( (grid[i][0] && grid[i][1] && grid[i][2]) == ('X') return true;

这样做:

创建一个函数来检查 x 的字符:

bool isX(char c)
{
  return c == 'X' || c == 'x';
}

然后你可以写:

if ( isX(grid[i][0]) && isX(grid[i][1]) && isX(grid[i][2]))
  return true;

在第一种情况下,它 returns true 因为 none 的网格元素的值为零。 && 运算符生成 01,具体取决于您传递的值。

在第二种情况下,它也没有按预期工作:您不会通过 &&-ing 值一起获得 'X'

检查三项是否等于'X'的正确方法如下:

if (toupper(grid[i][0]) == 'X'
&&  toupper(grid[i][1]) == 'X'
&&  toupper(grid[i][2]) == 'X') {
    return true;
}

为了在 TiCTacToe 中推广 "win" 的概念,编写一个函数,当在每个方向上具有特定步骤的三个项目的序列包含一个序列时,returns true给定字符,像这样:

bool isWin(int r, int c, int dr, int dc, char ch) {
    return toupper(grid[r+0*dr][c+0*dc] == ch
        && toupper(grid[r+1*dr][c+1*dc] == ch
        && toupper(grid[r+2*dr][c+2*dc] == ch;
}
bool isWin(char ch) {
    return isWin(0,0,0,1,ch)
        || isWin(0,0,1,0,ch)
        || isWin(1,0,0,1,ch)
        || isWin(0,1,1,0,ch)
        || isWin(2,0,0,1,ch)
        || isWin(0,2,1,0,ch)
        || isWin(0,0,1,1,ch)
        || isWin(2,0,-1,1,ch);
}

那是因为表达式

'X' || 'x'

grid[i][0] && grid[i][1] && grid[i][2]

在非零整数类型值之间使用 ||&& 运算符(因为 char 是整数类型),因此它们的计算结果都是 true .

要将字符 xyz 翻译成 C++(或几乎任何其他有点类似的语言)字符 cC,你必须计算

(x == c || x == C) && (y == c || y == C) && (z == c || z == C)

因此请将其应用于您的问题。

但更重要的是,在尝试处理 C++ 之前,请了解布尔运算符和一般编程。