Проблема с перекрытием кораблей в 2D-массивах для игры Battleships, Java - PullRequest
1 голос
/ 22 января 2020

Я создаю простые консольные линкоры в Java, для людей, которые не знакомы с игрой, в нее играют по 2D-сетке, где вы можете сбрасывать корабли разных размеров как по горизонтали, так и по вертикали. В моем примере это сетка 10х10, созданная с использованием двумерного массива символов. Кораблям НЕ разрешается перекрывать друг друга, они не могут использовать одну и ту же сетку 1x1.

Мне удалось исправить, поэтому они не могут перекрывать друг друга, но у меня проблема в том, если доля корабля тот же столбец или строка (в зависимости от того, находится ли корабль вертикально или горизонтально) в исходной позиции, я не могу поставить его вниз.

См. Пример изображения ниже для лучшего понимания.

«0» - это «пустые» слоты, «S» - это текущие корабли (размером 3). Я могу разместить (в этом примере) корабли 4-х размеров на синих маркерах, но я не могу разместить их как красные маркеры

    public void placeShip(ShipType shipType, int posX, int posY, int shipSize, Placement placement) {
    boolean success = true;
    char tempChar = 'x';

    if(shipType == ShipType.BATTLESHIP)
        tempChar = 'B';
    else if(shipType == ShipType.CARRIER)
        tempChar = 'C';
    else if(shipType == ShipType.DESTROYER)
        tempChar = 'D';
    else if(shipType == ShipType.SUBMARINE)
        tempChar = 'S';


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

        if(success) {
            System.out.println("Got space");
            for(int i = 0; i < shipSize; i++) {
                board[posY-1][posX-1+i] = tempChar;
                success = false;
            }
        }
    }

    if(placement == Placement.VERTICAL) {
        for(int i = 0; i < posY+shipSize; i++) {
            for(int j = 0; j < posX+shipSize; j++) {
                if(board[posY-1][i] != '0' || board[i][posX-1] != '0') {
                    System.out.println("Can't place down the ship ");
                    success = false;
                    break;
                }                   
            }
        }

        if(success) {
            System.out.println("Got space");
            for(int i = 0; i < shipSize; i++) {
                board[posY-1+i][posX-1] = tempChar;
                success = false;
            }
        }
    }
}

Выше приведен код, который я использую для размещения кораблей, где Я отправляю в Положение X и Y и размер корабля, и направление корабля.

1 Ответ

1 голос
/ 22 января 2020

Вам нужно переосмыслить свои петли, чтобы проверить, можно ли поставить корабль вниз. Давайте разберем один из них на обычный 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
...