Вам нужно переосмыслить свои петли, чтобы проверить, можно ли поставить корабль вниз. Давайте разберем один из них на обычный Engli sh:
if(placement == Placement.HORIZONTAL) {
for(int i = 0; i < posX+shipSize; i++) {
for(int j = 0; j < posX+shipSize; j++) {
if(board[i][posX-1] != '0' || board[posY-1][i] != '0') {
System.out.println("Can't place down the ship ");
success = false;
break;
}
}
}
Первый выпуск:
for(int i = 0; i < posX+shipSize; i++)
Почему мы выполняем итерацию от 0 до posX
+ shipSize
? нам нужно только проверить shipSize
пробелы. Таким образом, вы должны зацикливаться от posX
до posX
+ shipSize
или от 0 до shipSize
, а не комбинации.
Второй выпуск:
Несмотря на то, что ваша позиция горизонтальная или вертикальная, вы вкладываете свои циклы for. Это означает, что вы делаете l oop shipSize
раз без причины. Вам нужно сделать это только один раз.
Третий выпуск:
if(board[i][posX-1] != '0' || board[posY-1][i] != '0')
Позиция board[i][posX-1]
не имеет значения в этом контексте, и не связан с положением вашего корабля , потому что вы всегда начинаете с i = 0
. Поэтому независимо от того, где вы пытаетесь разместить свой корабль, если у вас есть один в том же ряду или столбце, у нас есть проблема. Это то, что вызывает проблему в вашем вопросе. Вместо этого должно быть что-то вроде: if(board[posY-1][posX-1] != '0')
.
Наконец, почему бы просто не установить позиции posX
и posY
должным образом? Так что вам не нужно вычитать 1 и вводить себя в заблуждение.
В конечном итоге ваш новый блок должен выглядеть примерно так (но я не уверен, поскольку вы не опубликовали минимальный воспроизводимый пример ) :
if(placement == Placement.HORIZONTAL) {
for(int i = 0; i < shipSize; i++) {
if(board[posY-1][posX-1+i] != '0') {
System.out.println("Can't place down the ship ");
success = false;
break;
}
}
// your code