#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. Да, я знаю, фактически я написал, что это грубое решение, просто чтобы направить его в правильном направлении, это не окончательное решение. Он спросил, почему счетчик не был добавлен после четвертого раза, а не для выполнения домашних заданий