我正在制作这个基本上是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应该在控制台上输出。由于某种原因它没有显示。我错过了什么吗?
答案 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]
,并评估为true
或false
。然后将该值与wl[i-2][0]
进行比较,并将评估结果与true
或false
进行比较。最后,将该比较与wl[i-3]
进行比较。所以,如果你有红色,红色,黄色,黄色(false
,false
,true
,true
),它将是true
。 (false==false
为true
,因此(false==false)==true
)为true
等。同样,RED,YELLOW,RED,YELL将评估为true
(为读者练习) ...)。
最后,其余的逻辑对我来说并不是很清楚。您似乎正在尝试从i=5
迭代到i=0
;但随后访问阵列的元素i-1
,i-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
,它编译的唯一原因是因为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]
因此,实际上并不是按照您想要的方式将每个元素与下一个元素进行比较。通过这种方式,以下语句(与您的数组略有不同,但原理相同)返回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");
}