【问题标题】:Incorrect validation of rows in 2D array (Java)二维数组中的行验证不正确(Java)
【发布时间】: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]) &amp;&amp; field[i][0].equals("[ ]")),但它对于空字段也不正确(我们得到false)。

标签: java validation multidimensional-array boolean-logic tic-tac-toe


【解决方案1】:

假设如果您发现任何由所有 X 或所有 Os 组成的水平行,并且您的空字段是字符串 "[ ]",那么您希望返回 true,这应该可以:

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;
}

【讨论】:

    【解决方案2】:

    如果您只是水平检查,为什么不只取每行的第一个元素并将其与同一行的下两个元素进行比较,然后返回 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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2020-01-08
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多