通过 Java 中的调用方法传递 return 类型

passing a return type through the calling method in Java

我必须构建一个 connect4 板,并且我正在努力检查获胜。我知道我可以用 400 个 if else 语句和条件语句来做,但我尝试做一些更聪明的事情,但我不明白为什么它不起作用:

public boolean checkWin() {
    // check horizontal
    for (int x = 0; x < BOARD_WIDTH; x++) {
      if (recursiveCheck(4, x, 0, 1, 0)) {
        return true;
      }
    }
    return false;
}

private boolean recursiveCheck(int count, int x, int y, int incX, int incY) {
    while (count > 1) {
      if (x + incX < BOARD_WIDTH && y + incY < BOARD_HEIGHT && board[x][y] != 0
          && board[x][y] == board[x + incX][y + incY]) {
        System.out.println("TRUE");
        System.out.printf("x = %d, x+1 = %d", x, x + incX);
        recursiveCheck(count - 1, x + incX, y + incY, incX, incY);
      }
      return false;
    }
    System.out.println("BIG TRUE");
    return true;
}

在递归方法返回为 true 的情况下,我确实得到了控制台日志

BIG TRUE

但是我的 checkWin() 方法中的 return true; 语句永远不会触发。

有什么想法吗?

这是删除了 print 语句的 recursiveCheck 函数

private boolean recursiveCheck(int count, int x, int y, int incX, int incY) {
    while (count > 1) {
      if ((x + incX < BOARD_WIDTH && y + incY < BOARD_HEIGHT && board[x][y] != 0
          && board[x][y] == board[x + incX][y + incY]) {
        recursiveCheck(count - 1, x + incX, y + incY, incX, incY);
      }
      return false;
    }
    return true;
}

在我看来,如果你传入一个大于或等于 2 的计数,这个 recursiveCheck 函数总是先 return false。你正在调用

recursiveCheck(count - 1, x + incX, y + incY, incX, incY);

在你的 if 语句中,但你没有对调用函数得到的结果做任何事情。因此 if 语句最终将评估为 false。所以你应该

return recursiveCheck(count - 1, x + incX, y + incY, incX, incY);

而不是简单地在 while 循环中调用函数

好吧,如果递归方法达到了 "Big True" 部分,它应该 return 为真。但我看不出你会如何检查它? "Big True" 已打印,因此请检查 return 语句。 要么我们使用调试器并设置断点,要么如果您想使用打印语句,则只需为每个输出添加语句。喜欢

public boolean checkWin() {
// check horizontal
for (int x = 0; x < BOARD_WIDTH; x++) {
  if (recursiveCheck(4, x, 0, 1, 0)) {
    System.out.println("SMALL TRUE");
    return true;
  }
}
System.out.println("SMALL FALSE");
return false;
}

private boolean recursiveCheck(int count, int x, int y, int incX, int incY) {
while (count > 1) {
  if (x + incX < BOARD_WIDTH && y + incY < BOARD_HEIGHT && board[x][y] != 0
      && board[x][y] == board[x + incX][y + incY]) {
    System.out.println("TRUE");
    System.out.printf("x = %d, x+1 = %d", x, x + incX);
    recursiveCheck(count - 1, x + incX, y + incY, incX, incY);
  }
  System.out.println("BIG FALSE");
  return false;
}
System.out.println("BIG TRUE");
return true;
}

万一有人在互联网上进行了非常具体的搜索并提出了这个问题,我想我会包括我的最终(工作)代码(感谢 MT756 和 Bender)

public boolean checkWin() {
// check horizontal
int[][] cartesian = { { 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 } };
for (int[] c : cartesian) {
  for (int x = 0; x < BOARD_WIDTH; x++) {
    for (int y = 0; y < BOARD_HEIGHT; y++) {
      if (recursiveCheck(Game.connect, x, y, c[0], c[1])) {
        return true;
      }
    }
  }
}
return false;
}

private boolean recursiveCheck(int count, int x, int y, int incX, int incY) {
while (count - 1 > 0) {
  if (x + incX < BOARD_WIDTH && x + incX > 0 && y + incY < BOARD_HEIGHT && y + incY > 0 && board[x][y] != 0
      && board[x][y] == board[x + incX][y + incY]) {
    return recursiveCheck(count - 1, x + incX, y + incY, incX, incY);
  }
  return false;
}
return true;
}

老实说,嵌套循环并不像它们看起来那么糟糕!