二维数组中的行验证不正确 (Java)
Incorrect validation of rows in 2D array (Java)
我是编程初学者,正在制作一款类似于井字棋的简单游戏。我们有一个边长随机的方形游戏场(二维数组)。它可能看起来像:
[ ] [ ] [ ]
[ ] [ ] [ ]
[ ] [ ] [ ]
这是检查行匹配的方法之一:
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;
}
假设您希望 return 为真,如果您发现任何由所有 X 或所有 Os 组成的水平行,并且您的空字段是字符串 "[ ]"
这应该有效:
boolean checkHorizontal(String[][] board) {
final String emptyCell = "[ ]";
for (int row = 0; row < board.length; row++) {
String firstElementInRow = board[row][0];
if (firstElementInRow.equals(emptyCell)) {
continue;
}
int column;
for (column=1; column < board[row].length; column++) {
if (!board[row][column].equals(firstElementInRow)) {
break;
}
}
if (column==board[row].length) {
return true;
}
}
return false;
}
如果你只是水平检查它为什么不取每一行的第一个元素并将它与同一行的下两个元素进行比较 return true
否则 false
.
public static boolean checkHorizontal(String[][] field) {
boolean valid = false;
int j = 0;
for (int i = 0; i < field.length; i++) {
String s = field[i][0]; //first element of each row
if (s.equals(field[i][j + 1]) && s.equals(field[i][j + 2]))
return true;
}
return valid;
}
我是编程初学者,正在制作一款类似于井字棋的简单游戏。我们有一个边长随机的方形游戏场(二维数组)。它可能看起来像:
[ ] [ ] [ ]
[ ] [ ] [ ]
[ ] [ ] [ ]
这是检查行匹配的方法之一:
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;
}
假设您希望 return 为真,如果您发现任何由所有 X 或所有 Os 组成的水平行,并且您的空字段是字符串 "[ ]"
这应该有效:
boolean checkHorizontal(String[][] board) {
final String emptyCell = "[ ]";
for (int row = 0; row < board.length; row++) {
String firstElementInRow = board[row][0];
if (firstElementInRow.equals(emptyCell)) {
continue;
}
int column;
for (column=1; column < board[row].length; column++) {
if (!board[row][column].equals(firstElementInRow)) {
break;
}
}
if (column==board[row].length) {
return true;
}
}
return false;
}
如果你只是水平检查它为什么不取每一行的第一个元素并将它与同一行的下两个元素进行比较 return true
否则 false
.
public static boolean checkHorizontal(String[][] field) {
boolean valid = false;
int j = 0;
for (int i = 0; i < field.length; i++) {
String s = field[i][0]; //first element of each row
if (s.equals(field[i][j + 1]) && s.equals(field[i][j + 2]))
return true;
}
return valid;
}