【发布时间】:2017-01-19 17:58:21
【问题描述】:
我是编程初学者,我正在制作一个类似于井字游戏的简单游戏。我们有一个正方形的游戏场(2D 数组),其边的大小是随机的。它可能看起来像:
[ ] [ ] [ ]
[ ] [ ] [ ]
[ ] [ ] [ ]
这是检查行匹配的方法之一:
boolean checkHorizontal(String[][] field) {
boolean valid = true;
for (int i = 0; i < field.length; i++) {
for (int j = 1; j < field[i].length; j++) {
if (!field[i][0].equals(field[i][j]) && !field[i][0].equals("[ ]")) {
valid = false;
}
}
}
return valid;
}
这里面有问题。方法适用于通常情况,例如:
[ ] [ ] O
X X X
[ ] O [ ]
但是如果游戏字段为空或者第一列为空,如下,
[ ] [ ] [ ] [ ] X [ ]
[ ] [ ] [ ] [ ] X [ ]
[ ] [ ] [ ] [ ] X [ ]
checkHorizontal(String[][] field) 的结果是true,但应该是false,因为这里的行中没有匹配项,我真的不知道如何解决这个问题。
更新。@David Choweller 的回答帮助了我。我稍微改变了他的方法,但总的来说是一样的:
boolean checkHorizontal(String[][] field) {
boolean valid = false;
for (int i = 0; i < field.length; i++) {
if (field[i][0].equals("[ ]")) {
continue;
}
int j;
for (j = 1; j < field[i].length; j++) {
if (!field[i][j].equals(field[i][0])) {
break;
}
}
if (j == field[i].length) {
valid = true;
}
}
return valid;
}
【问题讨论】:
-
你的逻辑似乎很奇怪。你的 if 是说:如果不是一行的所有元素都相同,并且如果第一个元素不为空,则它是无效的。
-
你可能想要:如果一行的所有元素都不是相同的,或者如果第一个元素是空的,那么它是无效的
-
所以你的 if 应该是:
if (!field[i][0].equals(field[i][j]) || field[i][0].equals("[ ]")) -
@EliSadoff 如果我这样做,结果是
false,尽管事实上一行的值是相等的。 -
@EliSadoff 我试过
if (!field[i][0].equals(field[i][j]) && field[i][0].equals("[ ]")),但它对于空字段也不正确(我们得到false)。
标签: java validation multidimensional-array boolean-logic tic-tac-toe