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 的网格元素的值为零。 &&
运算符生成 0
或 1
,具体取决于您传递的值。
在第二种情况下,它也没有按预期工作:您不会通过 &&
-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
.
要将字符 x
、y
和 z
翻译成 C++(或几乎任何其他有点类似的语言)字符 c
和 C
,你必须计算
(x == c || x == C) && (y == c || y == C) && (z == c || z == C)
因此请将其应用于您的问题。
但更重要的是,在尝试处理 C++ 之前,请了解布尔运算符和一般编程。
这是一个我无法完全理解的简单逻辑错误:
为什么下面的语句总是等同于 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 的网格元素的值为零。 &&
运算符生成 0
或 1
,具体取决于您传递的值。
在第二种情况下,它也没有按预期工作:您不会通过 &&
-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
.
要将字符 x
、y
和 z
翻译成 C++(或几乎任何其他有点类似的语言)字符 c
和 C
,你必须计算
(x == c || x == C) && (y == c || y == C) && (z == c || z == C)
因此请将其应用于您的问题。
但更重要的是,在尝试处理 C++ 之前,请了解布尔运算符和一般编程。