比较2D布尔数组值?

时间:2015-02-16 20:00:08

标签: java arrays for-loop javafx boolean

我正在制作这个基本上是Connect 4 game的程序。正如你在下面看到的,我有一组设置圆圈c0,c1,c2等,以及一个复制圆圈c0d,它会在每次按钮点击时生成,然后下到可用的插槽。在“背景”中我创建了一个2d矩阵,一个布尔数组,这有助于我决定告诉游戏何时获胜(通过在该行中使用相同的颜色4次。当然,我有6个其他行具有相同的功能也是如此,但基本上也是这样。

Circle c0d = new Circle(64, 32, 32);

    TranslateTransition translate = new TranslateTransition(
            Duration.millis(750), c0d);
    translate.setToX(0);
    FadeTransition fade = new FadeTransition();
    fade.setDuration(Duration.seconds(1));

    GridPane.setConstraints(c0d, 0, 0);
    GridPane.setHalignment(c0d, HPos.CENTER);
    grid.getChildren().add(c0d);
    if (c0.getFill() == Color.YELLOW) {
        c0.setFill(Color.RED);
        c1.setFill(Color.RED);
        c2.setFill(Color.RED);
        c3.setFill(Color.RED);
        c4.setFill(Color.RED);
        c5.setFill(Color.RED);
        c6.setFill(Color.RED);
        c0d.setFill(Color.YELLOW);
        switch (x0) {
        case 0:
            translate.setToY(432);
            x0++;
            wl[5][0] = true;
            break;
        case 1:
            translate.setToY(360);
            x0++;
            wl[4][0] = true;
            break;
        case 2:
            translate.setToY(288);
            x0++;
            wl[3][0] = true;
            break;
        case 3:
            translate.setToY(216);
            x0++;
            wl[2][0] = true;
            break;
        case 4:
            translate.setToY(144);
            x0++;
            wl[1][0] = true;
            break;
        case 5:
            translate.setToY(72);
            x0++;
            wl[0][0] = true;
            butt0.setDisable(true);
            break;
        }
    } else {
        c0.setFill(Color.YELLOW);
        c1.setFill(Color.YELLOW);
        c2.setFill(Color.YELLOW);
        c3.setFill(Color.YELLOW);
        c4.setFill(Color.YELLOW);
        c5.setFill(Color.YELLOW);
        c6.setFill(Color.YELLOW);
        c0d.setFill(Color.RED);
        switch (x0) {
        case 0:
            translate.setToY(432);
            x0++;
            wl[5][0] = false;
            break;
        case 1:
            translate.setToY(360);
            x0++;
            wl[4][0] = false;
            break;
        case 2:
            translate.setToY(288);
            x0++;
            wl[3][0] = false;
            break;
        case 3:
            translate.setToY(216);
            x0++;
            wl[2][0] = false;
            break;
        case 4:
            translate.setToY(144);
            x0++;
            wl[1][0] = false;
            break;
        case 5:
            translate.setToY(72);
            x0++;
            wl[0][0] = false;
            butt0.setDisable(true);
            break;
        }
    }

    for (i = 5; i <= 0; i--) {
        if (wl[i][0] == wl[i - 1][0] == wl[i - 2][0] == wl[i - 3][0]) {
            System.out.println("WON");
            break;
        }

现在你可以看到,最后一个for-loop通过比较一行中的位置来决定赢得比赛的时间,如果它们都是“假”,这意味着RED或者是黄色,WON应该在控制台上输出。由于某种原因它没有显示。我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

首先,您的for循环永远不会执行。您使用i=5进行初始化,条件为i <= 0。由于初始化条件为false,因此循环退出而不执行。

其次,if中的条件没有按照您的想法进行。你需要一些布尔逻辑:你想要的东西是

if (wl[i][0]==wl[i-1][0] && wl[i-1][0]==wl[i-2][0] && wl[i-2][0]==wl[i-3][0]) {
   // ...
}

实际评估它的方式是评估wl[i][0]==wl[i-1][0],并评估为truefalse。然后将该值与wl[i-2][0]进行比较,并将评估结果与truefalse进行比较。最后,将该比较与wl[i-3]进行比较。所以,如果你有红色,红色,黄色,黄色(falsefalsetruetrue),它将是true。 (false==falsetrue,因此(false==false)==true)为true等。同样,RED,YELLOW,RED,YELL将评估为true(为读者练习) ...)。

最后,其余的逻辑对我来说并不是很清楚。您似乎正在尝试从i=5迭代到i=0;但随后访问阵列的元素i-1i-2等显然不会起作用。

答案 1 :(得分:0)

for循环永远不会执行,因为条件i <= 0始终为false,因为您使用值i初始化5

但是,即使您解决了这个问题,您也会发现该声明存在问题,因为它没有按照您的想法行事(并且无论如何都会抛出ArrayIndexOutOfBoundsException

if (wl[i][0] == wl[i - 1][0] == wl[i - 2][0] == wl[i - 3][0]) { ...

即使你修复了ArrayIndexOutOfBoundsException,它编译的唯一原因是因为wlboolean[]。此语句不会与任何其他类型的数组一起编译(例如int[][])。这是因为它被评估为:

if (((wl[i][0] == wl[i - 1][0]) == wl[i - 2][0]) == wl[i - 3][0]) ...

实际上是这样的:

  1. 评估wl[i][0] == wl[i - 1][0]
  2. 获取该比较的boolean结果,并将其与wl[i - 2][0]
  3. 进行比较
  4. 并执行此操作直至到达块的结尾
  5. 因此,实际上并不是按照您想要的方式将每个元素与下一个元素进行比较。通过这种方式,以下语句(与您的数组略有不同,但原理相同)返回true,即使您希望它返回false

    boolean arr[] = {false, false, true}; // note they are not all the same
    System.out.println(arr[0] == arr[1] == arr[2]); // outputs true
    

    您真正想要的是检查所有元素是否相同。我建议使用一个函数来执行此操作,例如:

    public static boolean fourInALine(boolean[][] arr, int index2)
    {
      for (int j = 0; j <= arr.length - 4; j++) {
        boolean allSame = true;
        boolean firstValue = arr[j][index2];
        for (int i = 1; allSame && i < 4; i++) {
          allSame = (arr[j+i][index2] == firstValue);
        }
        if (allSame) return true;
      }
      return false;
    }    ...
    // used like:
    if (fourInALine(wl, 0)) {
      System.out.println("WON");      
    }