【问题标题】:Working TicTacTo CheckWin function?工作 TicTacTo CheckWin 功能?
【发布时间】:2013-11-06 12:11:37
【问题描述】:

所以我正在编写一个 C 程序,该程序将针对用户播放 TicTacTo。但是,我在检查是否有赢家的功能上遇到了问题。它似乎根本不起作用。当连续有 3 个时,游戏才继续。这是相关代码。

这是我的主要功能:

do {
    humanChoice(); // let the user make a play  
    computerChoice(); // does nothing at the moment
    gameStatus = checkWin(); // returns 1 if it finds a winner
} while(gameStatus==0);

humanChoice 在数组中用户选择的位置播放“X”。这已经过彻底测试并且可以完美运行。然后是 checkWin() 函数:

int checkWin() {

if (
    matrix[0][0] == matrix[0][1] == matrix[0][2] || // 1st row
    matrix[1][0] == matrix[1][1] == matrix[1][2] || // 2nd row
    matrix[2][0] == matrix[2][1] == matrix[2][2] || // 3rd row

    matrix[0][0] == matrix[1][0] == matrix[2][0] || // 1st column
    matrix[0][1] == matrix[1][1] == matrix[2][1] || // 2nd column
    matrix[0][2] == matrix[1][2] == matrix[2][2] || // 3rd column

    matrix[0][0] == matrix[1][1] == matrix[2][2] || // left to right diagonal
    matrix[0][2] == matrix[1][1] == matrix[2][0]    // right to left diagonal
) {
    printf("Win! Game Over!");
    return(1);
}

return(0);
}

我正在为我的“矩阵”使用以下二维数组:

char matrix[3][3];

我意识到现在程序无法区分计算机获胜和用户获胜。现在这无关紧要。我只需要它来检查一般的胜利。

你注意到了什么?

【问题讨论】:

  • 如果您的问题已经得到回答,您应该接受其中一个答案。

标签: c comparison logic conditional-statements tic-tac-toe


【解决方案1】:
if (matrix[0][0] == matrix[0][1] == matrix[0][2]) ... 

不同于:

if (matrix[0][0] == matrix[0][1] && matrix[0][1] == matrix[0][2]) ...

在第一种情况下,首先评估第一个比较,使其等效于:

int b = matrix[0][0] == matrix[0][1];
if (b == matrix[0][2]) ...

比较返回01,而不是正在比较的值(与赋值运算符不同,它返回已分配的值)。

【讨论】:

  • 会有什么不同?
【解决方案2】:

如果左右手操作数相等,== 运算符将返回 true

a == b 将在它们相等时返回 trueb == c 将在它们相等时返回 true

但是,当a == b 的计算结果与c 相同时,a == b == c 将返回 true。

您将希望使用(a == b) && (b == c) 来实现您想要实现的目标。

【讨论】:

  • 有趣!我已经和 C 一起工作了大约一年,从来没有遇到过这个问题。你一直在学习新的东西。 :D 谢谢!
【解决方案3】:

a == b == c 之类的表达式与 a == b && b == c 不同。这就是为什么您的功能无法按预期工作的原因。

【讨论】:

  • a == b 是一个布尔表达式,如果 a=b 则为 1,否则为 0。当你写a == b == c时,你将第一次比较的结果(0或1)与c进行比较。
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多