передача типа возврата через вызывающий метод в Java - PullRequest
1 голос
/ 26 февраля 2020

Мне нужно собрать доску connect4, и я борюсь с проверкой выигрыша. Я знаю, что я мог бы просто сделать это с 400, если еще утверждениями и условиями, но я пытался сделать что-то более умное, но я не могу понять, почему это не работает:

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

, но оператор return true; внутри моего метода checkWin() никогда не срабатывает.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Это ваша функция 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;
}

Мне кажется, что эта функция recursiveCheck всегда будет возвращать false первым, если вы передадите число, большее или равное 2. Вы вызов

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

внутри вашего оператора if, но вы ничего не делаете с результатом, полученным при вызове функции. Следовательно, оператор if в конечном итоге станет ложным. Таким образом, вместо этого вы должны

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

вместо простого вызова функции в то время как l oop

0 голосов
/ 26 февраля 2020

На всякий случай, если кто-нибудь сделает очень точный c поиск по inte rnet и придумает этот вопрос, я подумал, что включу мой окончательный (рабочий) код (благодаря 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;
}

Вложенные циклы не так плохи, как кажутся, честно !!

0 голосов
/ 26 февраля 2020

Хорошо, если рекурсивный метод достиг части "Big True", он должен вернуть true. Тем не менее, я не вижу, как бы вы это проверили «Большая правда» напечатано, поэтому проверьте наличие возврата. Либо мы используем отладчик и устанавливаем контрольные точки, либо просто, если вы хотите, чтобы go с инструкциями печати добавлял оценки для каждого вывода. Как

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