(代码审查)Java if语句涉及逻辑和(&&)运算符

时间:2012-06-28 19:40:58

标签: java android

我几周前开始在java / android中编程。我想写一个小的tic tac toe游戏作为一个Android应用程序,但我有我的方法,将检查获胜者的麻烦。它如下:

 public void checkForWinner() { 

        if( taken[0] && taken[3] && taken[6]  ||
            taken[0] && taken[1] && taken[2] ||
            taken[2] && taken[5] && taken[8] ||
            taken[6] && taken[7] && taken[8] ||
            taken[0] && taken[4] && taken[8] ||
            taken[2] && taken[4] && taken[6] ||
            taken[1] && taken[4] && taken[7] ||
            taken[3] && taken[4] && taken[5] == 1 ){}
}

这里我有一个名为taken的数组,它包含9个整数,每个整数都是一个整数,意味着玩家一个拥有该块,或者两个,意味着玩家两个阻止。目前,我正在尝试尝试所有可能的场景,其中玩家将成为赢家,但是eclipse告诉我The operator && is undefined for the argument type(s) int, int。该错误似乎只显示if语句的每一行的第一个逻辑和操作。例如,第一个错误上升到taken[0] && taken[3],然后消失,直到下一行。

6 个答案:

答案 0 :(得分:3)

或者,您可以检查拍摄的[n]值以查看它们是否包含1或2,如果您认为这样可以使您的代码更清晰:

(taken[0]==1 && taken[3]==1 && taken[6]==1)

请记住&& operator需要布尔操作数...所以它不会像你期望的那样使用你的int数组。

答案 1 :(得分:2)

交换您的&&到==,你试图看看它们是否都是我认为会显示胜利者的相同值,并确保使用括号进行排序,因此一个胜利条件看起来像

((taken[0] == taken[3]) && (taken[0] == taken[6]))

然而,这只会告诉你一些玩家赢了,而不是哪个玩家。我猜你可以查看一旦确定有人获胜并且宣布该球员为胜利者,哪位球员最后一步获胜。

答案 2 :(得分:1)

在java中,

if (a && b) or if (a || b) 

仅当a和b是布尔值/布尔表达式时才有效。

答案 3 :(得分:1)

1)您无法在&&变量上使用||int运算符,因为它们适用于boolean值。

2)也使用括号对

等条件进行分组
 if (
      (taken[0]==1 && taken[3]==1 && taken[6]==1)||
      (taken[0]==1 && taken[1]==1 && taken[2]==1)||
      ...

答案 4 :(得分:1)

  

这里我有一个名为taken的数组,它包含9个整数,每个整数都是一个整数,意味着玩家一个拥有该区块,或者两个,意味着玩家2拥有该区块。

在这种情况下,您可以使用按位运算符替换逻辑运算符:

int winner = taken[0] & taken[3] & taken[6]
           | taken[0] & taken[1] & taken[2]
           | taken[2] & taken[5] & taken[8]
           | taken[6] & taken[7] & taken[8]
           | taken[0] & taken[4] & taken[8]
           | taken[2] & taken[4] & taken[6]
           | taken[1] & taken[4] & taken[7]
           | taken[3] & taken[4] & taken[5];

如果玩家1获胜,则变量winner将包含1,如果玩家2获胜则包含2,如果他们两个都没赢,则为0,或者两者中的3个获胜(这可能在您的游戏中不可能)

答案 5 :(得分:0)

好的,这里有两个主要问题。

首先,taken[0]需要返回true或false才能在if语句中保持原样。您已经提到它是一个整数,因此要返回true或false,您需要进行比较,例如taken[0] == 1

其次,您需要使用括号并进行一些分组。 Java不尊重空格。而不是if( taken[0] && taken[3] && taken[6] || ...,您需要if( (taken[0] && taken[3] && taken[6]) || ...。也就是说,您需要在每组分组周围加上括号。

Eclipse出错的原因是&&运算符仅用于比较布尔值。那是true && true。你给它整数而且不喜欢它。

您可能想要解决此问题的一种方法是编写一个确定是否已达到解决方案的函数。所以可能是这样的:

private boolean isSolutionPresent(int[] taken, int index1, int index2, int index3) {
    return (taken[index1] == 1 ) && (taken[index2] == 1) && (taken[index3] == 1);
}

然后您可以将if语句转换为:

if (isSolutionPresent(taken, 0, 3, 6) ||
    isSolutionPresent(taken, 0, 1, 2) ||
    isSolutionPresent(taken, 2, 5, 8) || //... etc, removing the final ==1

由于isSolutionPresent方法返回一个布尔值(即true / false),您可以将||运算符应用于它。