TicTacToe游戏中的逻辑错误

时间:2015-01-17 13:08:44

标签: c++ logic

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

为什么以下语句总是等于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;

3 个答案:

答案 0 :(得分:3)

这样做:

创建一个函数来检查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;

答案 1 :(得分:2)

那是因为表达式

'X' || 'x'

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

在非零整数类型的值之间使用||&&运算符(因为char是整数类型),因此它们都计算为true。< / p>

要将字符xyz等同于任何一个字符{C>(或几乎任何其他类似的语言) {1}}和c,您必须计算

C

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

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

答案 2 :(得分:1)

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

在第二种情况下,它也无法正常工作:您不会'X'一起获得&&个值。

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

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

概括&#34; win&#34;在TiCTacToe中,当每个方向上具有特定步骤的三个项目的序列包含给定字符的序列时,编写一个返回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);
}