比较二维布尔数组值?
Comparing 2D boolean array values?
我正在制作这个基本上是 Connect 4 game 的程序。正如您在下面看到的,我有一组集合圆 c0、c1、c2 等和一个重复的圆 c0d,它在每次单击按钮时产生并归结为可用插槽。在 "background" 中,我制作了一个二维矩阵,一个布尔数组,它帮助我决定何时赢得比赛(通过在一行中使用相同的颜色 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 循环通过比较一行中的位置来决定何时赢得游戏,如果它们都是 "false",则表示红色或真YELLOW, WON 应该在控制台上输出。由于某种原因,它没有显示。我错过了什么吗?
首先,您的 for
循环永远不会执行。你用i=5
初始化,条件是i <= 0
。由于条件在初始化时为假,因此循环退出而不执行。
其次,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]
,并评估为true
或false
。然后将该值与 wl[i-2][0]
进行比较,比较结果为 true
或 false
。最后将该比较与 wl[i-3]
进行比较。因此,如果您有 RED、RED、YELLOW、YELLOW (false
、false
、true
、true
),它将是 true
。 (false==false
是 true
,所以 (false==false)==true
) 是 true
,等等。类似地,RED、YELLOW、RED、YELLOW 的计算结果为 true
(练习 reader...).
最后,其余大部分逻辑对我来说并不是很清楚。您看起来像是在尝试从 i=5
迭代到 i=0
;但是随后访问数组的元素 i-1
、i-2
等显然是行不通的。
您的 for
循环永远不会执行,因为条件 i <= 0
始终为假,假设您使用值 5
.
初始化 i
但是,即使你解决了这个问题,你也会发现这个语句有问题,因为它没有按照你的想法去做(而且它无论如何都会抛出一个 ArrayIndexOutOfBoundsException
)
if (wl[i][0] == wl[i - 1][0] == wl[i - 2][0] == wl[i - 3][0]) { ...
即使您修复了 ArrayIndexOutOfBoundsException
,它编译的唯一原因是因为 wl
是 boolean[]
。该语句不会与任何其他类型的数组一起编译(例如 int[][]
)。这是因为它被评估为:
if (((wl[i][0] == wl[i - 1][0]) == wl[i - 2][0]) == wl[i - 3][0]) ...
实际上是:
- 评价
wl[i][0] == wl[i - 1][0]
- 获取该比较的
boolean
结果并将其与 wl[i - 2][0]
进行比较
- 一直这样做直到它到达块的末尾
因此,它实际上并没有按照您想要的方式将每个元素与下一个元素进行比较。这样下面的语句(和你的数组略有不同,但是原理是一样的)returns true
,虽然你要的是returnfalse
:
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");
}
我正在制作这个基本上是 Connect 4 game 的程序。正如您在下面看到的,我有一组集合圆 c0、c1、c2 等和一个重复的圆 c0d,它在每次单击按钮时产生并归结为可用插槽。在 "background" 中,我制作了一个二维矩阵,一个布尔数组,它帮助我决定何时赢得比赛(通过在一行中使用相同的颜色 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 循环通过比较一行中的位置来决定何时赢得游戏,如果它们都是 "false",则表示红色或真YELLOW, WON 应该在控制台上输出。由于某种原因,它没有显示。我错过了什么吗?
首先,您的 for
循环永远不会执行。你用i=5
初始化,条件是i <= 0
。由于条件在初始化时为假,因此循环退出而不执行。
其次,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]
,并评估为true
或false
。然后将该值与 wl[i-2][0]
进行比较,比较结果为 true
或 false
。最后将该比较与 wl[i-3]
进行比较。因此,如果您有 RED、RED、YELLOW、YELLOW (false
、false
、true
、true
),它将是 true
。 (false==false
是 true
,所以 (false==false)==true
) 是 true
,等等。类似地,RED、YELLOW、RED、YELLOW 的计算结果为 true
(练习 reader...).
最后,其余大部分逻辑对我来说并不是很清楚。您看起来像是在尝试从 i=5
迭代到 i=0
;但是随后访问数组的元素 i-1
、i-2
等显然是行不通的。
您的 for
循环永远不会执行,因为条件 i <= 0
始终为假,假设您使用值 5
.
i
但是,即使你解决了这个问题,你也会发现这个语句有问题,因为它没有按照你的想法去做(而且它无论如何都会抛出一个 ArrayIndexOutOfBoundsException
)
if (wl[i][0] == wl[i - 1][0] == wl[i - 2][0] == wl[i - 3][0]) { ...
即使您修复了 ArrayIndexOutOfBoundsException
,它编译的唯一原因是因为 wl
是 boolean[]
。该语句不会与任何其他类型的数组一起编译(例如 int[][]
)。这是因为它被评估为:
if (((wl[i][0] == wl[i - 1][0]) == wl[i - 2][0]) == wl[i - 3][0]) ...
实际上是:
- 评价
wl[i][0] == wl[i - 1][0]
- 获取该比较的
boolean
结果并将其与wl[i - 2][0]
进行比较
- 一直这样做直到它到达块的末尾
因此,它实际上并没有按照您想要的方式将每个元素与下一个元素进行比较。这样下面的语句(和你的数组略有不同,但是原理是一样的)returns true
,虽然你要的是returnfalse
:
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");
}