通过 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;
}
老实说,嵌套循环并不像它们看起来那么糟糕!
我必须构建一个 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;
}
老实说,嵌套循环并不像它们看起来那么糟糕!