我是Java的新手,我正在制作TicTacToe的扩展版本(基本上它与通常的3x3版本的游戏领域大小不同 - 它可能是4x4,5x5等等,玩家必须赢得一个连续几次获得最后的胜利,等等。用户可以自定义他的游戏)。 我有一些检查方法。
// 1。对于行:
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;
}
// 2。对于列:
boolean checkVertical(String[][] field) {
boolean valid = true;
for (int i = 0; i < field.length; i++) {
for (int j = 1; j < field[i].length; j++) {
if (!field[0][i].equals(field[j][i]) && !field[0][i].equals("[ ]")) {
valid = false;
}
}
}
return valid;
}
// 3。 '\'和'/'对角线有两种方法:
boolean checkDiagonal(String[][] field) {
boolean valid = true;
for (int i = 0; i < field.length; i++) {
if (!field[0][0].equals(field[i][i]) && !field[0][0].equals("[ ]")) {
valid = false;
}
}
return valid;
}
boolean checkAnotherDiagonal(String[][] field) {
boolean valid = true;
for (int i = 0, j = field.length - 1; i < field.length; i++, j--) {
if (!field[0][field.length - 1].equals(field[i][j]) && !field[i][0].equals("[ ]")) {
valid = false;
}
}
return valid;
}
以下是问题。对于空字段或字段,如:
{"[ ]", " X ", "[ ]"},
{"[ ]", " X ", "[ ]"},
{"[ ]", " X ", "[ ]"}
checkHorizontal(String[][] field)
的结果是true
。这意味着有比赛,但他们不是。同样适用于checkVertical(String[][] field)
和字段:
{"[ ]", "[ ]", "[ ]"},
{" X ", " X ", " X "},
{"[ ]", "[ ]", "[ ]"}
我将这些方法合二为一:
boolean validate(String[][] field) {
boolean valid = false;
if (checkHorizontal(field)
|| checkVertical(field)
|| checkDiagonal(field)
|| checkAnotherDiagonal(field)) {
valid = true;
}
return valid;
}
但是由于问题,程序无法正常运行。
我不知道如何解决这个问题。是否有其他更好的方法来检查2D数组的行,列和对角线?也许,通过一种通用方法有一些方法可以做到这一点吗?
答案 0 :(得分:0)
试试这样:
boolean checkHorizontal(String[][] field) {
// iterate over all rows
for (int i = 0; i < field.length; i++) {
boolean validRow = true;
// iterate over all columns
for (int j = 0; j < field[i].length; j++) {
// to consider a row valid, none of its cells can be empty
if (field[i][j].equals("[ ]")) {
validRow = false;
break; // this row is invalid
}
}
// is the row we're currently checking valid?
if (validRow) {
// we're done
return true;
}
// try the next row
}
// all horizontal rows are invalid
return false;
}