Java — Connect Four game не будет складывать разные счетчики выше трех

#java #eclipse

#java #eclipse

Вопрос:

Я не могу понять, почему счетчики не будут складываться выше 3, когда в этом столбце есть разные счетчики. Например, на изображении ниже вы можете видеть, что первые 3 счетчика размещены нормально. Однако, если я попытаюсь поместить счетчик во второй столбец четвертый раз подряд, ничего не будет добавлено, и плата останется прежней.

введите описание изображения здесь

Это меня озадачивает, потому что кажется, что это происходит только тогда, когда в одном столбце используются разные счетчики. На изображении ниже вы можете видеть, что он отлично работает, когда размещены четыре счетчика одного и того же типа.

введите описание изображения здесь

Не мог бы кто-нибудь взглянуть на мой код, чтобы помочь определить проблему?

 private void placeCounter(char player, int position){
    boolean placed = false;


    if(player == 'r'){
        for( int i=board.length-1; i>=0; i--){
            if(!placed){
                if(board[i][position] == 'y'){
                    board[i-1][position] = 'r';
                    placed = true;
                }

                else if(board[i][position] != 'r'){
                    board[i][position] = 'r';
                    placed = true;
                }
            }
        }
    }
    else {
        for( int i=board.length-1; i>=0; i--){
            if(!placed){
                if(board[i][position] == 'r'){
                    board[i-1][position] = 'y';
                    placed = true;
                }

                else if(board[i][position] != 'y'){
                    board[i][position] = 'y';
                    placed = true;
                }
            }
        }
    }
}
  

Комментарии:

1.Почему boardWidth и boardHeight 7 , но ваша доска char[6][7] ?

2. Прошу прощения, это все еще в процессе. Это то, что вызывает проблему?

3. Нет, но мне просто интересно.

4. Кстати, у вас проблема с вашей «выигрышной» логикой. Вам не обязательно иметь 4 «подключенных», просто 4 «внутри одного ряда», чтобы выиграть. (От строки ~ 127 до 153.) Вам нужно сбросить count переменную в блоках else.

5. Рассмотрите возможность использования перечисления для содержимого ячейки вместо «r» или «y». Это может содержать даже «пустое» содержимое. Сначала вы бы инициализировали всю свою доску с помощью empty, поэтому вам нужно только искать непустые ячейки в вашем «placeCounter». С помощью этого вы можете удалить много повторяющегося кода, просто выполнив итерацию по «CellContent.r / CellContent.y». Кроме того, замените «i» и «j» на «row» и «column», что даст вам лучшее понимание.

Ответ №1:

Ваш placeCounter метод должен быть примерно таким:

 private void placeCounter(char player, int position) {
        boolean placed = false;

        if (player == 'r') {
            for (int i = board.length - 1; i >= 0; i--) {
                if (!placed amp;amp; board[i - 1][position] != 'r' amp;amp; board[i - 1][position] != 'y') {
                    if (board[i][position] == 'y') {
                        board[i - 1][position] = 'r';
                        placed = true;
                    }

                    else if (board[i][position] != 'r') {
                        board[i][position] = 'r';
                        placed = true;
                    }
                }
            }
        } else {
            for (int i = board.length - 1; i >= 0; i--) {
                if (!placed amp;amp; board[i - 1][position] != 'y' amp;amp; board[i - 1][position] != 'r') {
                    if (board[i][position] == 'r') {
                        board[i - 1][position] = 'y';
                        placed = true;
                    }

                    else if (board[i][position] != 'y') {
                        board[i][position] = 'y';
                        placed = true;
                    }
                }
            }
        }
    }
  

Когда вы пытаетесь установить счетчик, вы должны проверить, занята ли ячейка уже r или y . Если вы заметили, я добавил эти условия в if(!placed) инструкцию:

 amp;amp; board[i - 1][position] != 'y' amp;amp; board[i - 1][position] != 'r'
  

Если вы не выполните этот элемент управления, вы всегда будете переопределять одну и ту же ячейку, и именно поэтому после четвертого раза ничего не добавляется.

Вы также должны проверить, является ли пользовательский ввод r или y , потому что, если я вставлю пробел или число в качестве входных данных, программа выдаст исключение.

Это грубое решение, вы могли бы предложить что-то получше, но это просто для того, чтобы направить вас в правильном направлении.

Комментарии:

1. Это вызывает ArrayIndexOutOfBoundsException при заполнении строки 0 и 1 случайным образом.

2. Да, я знаю, фактически я написал, что это грубое решение, просто чтобы направить его в правильном направлении, это не окончательное решение. Он спросил, почему счетчик не был добавлен после четвертого раза, а не для выполнения домашних заданий