Android Java Game Battleship Game: рисование кораблей на 2D сетке - PullRequest
0 голосов
/ 09 февраля 2019

Я сейчас программирую игру на линкоре, и я сделал сетку 10х10, используя 2 для петель.Теперь я хочу изменить цвет ячейки в зависимости от того, есть там корабль или нет.

В настоящее время в качестве тестового примера у меня есть корабль размера 3 с координатами (1,4), идущий горизонтально.Корабли хранятся как корабли [i] = ShipData (int размер, логическое значение isHor Horizontal, Int слева, int top).У меня несколько разных красок на мой взгляд, и shipPaint должен заполнить ячейки черным, однако я не уверен, как поступить, так как я не знаю, как проверить корабль во время моего метода onDraw.

ИтакВот мой метод рисования начальной сетки внутри метода onDraw:

for (int i = 0; i < noOfColumns; i++) {
    int ystart = i * boxWidth;
    for (int j = 0; j < noOfRows; j++) {
        int xstart = j * boxWidth;


            box = new Rect(ystart, xstart, (ystart+boxWidth), (xstart+boxWidth));
            int var = mGame.cellStatus(i, j);
            switch (var)
                {
                    case -1: paint = fillPaint;

                    case 0: case 1: case 2: case 3: case 4: paint = shipPaint;
                }


            canvas.drawRect(box, paint);
            canvas.drawRect(box, borderPaint);

    }
}

Проблема в том, что я не знаю, как написать метод cellStatus, который должен возвращать -1, если это пустая ячейкаили от 0 до 4, если это часть определенного корабля (всего 5 кораблей.

). Поэтому мне нужно получить данные из класса ShipData, который имеет 4 переменные, т.е. ship [i] = ShipData (size, isHorizontal(слева, сверху), и вычислите, есть ли блок корабля в любой данной ячейке, и раскрасьте ячейку соответствующим образом. В настоящее время каждая ячейка имеет тот же цвет, что и мой метод, который еще не был написан.Поэтому мне нужно проверить (1,4) (2,4) (3,4) и вернуть 0 из cellStatus, но я понятия не имею, как написать cellStatus. Параметры для cellStatus (столбец, строка), и егопубличный int внутри моей игрыclass.

Чтобы уточнить, мой метод cellStatus должен проверить, есть ли блок корабля в любой заданной координате, предположительно, путем чтения из типа переменной класса ShipData.У ShipData есть несколько методов, таких как getLeft, getTop, getRight и getBottom, и я не уверен, как превратить ввод столбца, строки в фактические данные о каждой ячейке, как описано выше.Поэтому вывод cellStatus должен быть равен -1 для пустой ячейки и 0-4 для каждого из 5 кораблей.

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

К сожалению, мой старый пост не получил никаких ответов, и с тех пор я добился определенного прогресса,

@Override
public int cellStatus(int column, int row) {
int cellStatus = 0;
for (int i = 0; i < 5; i++){
    int maxSize = ships[i].getSize();
    for (int size = 0; size < maxSize; size++ ) {
        ships[i].getLeft();
    }
    cellStatus = ships[i].getLeft();

}

return cellStatus;
}    

Это то, что я получил до сих пор, но я не уверен, как заставить cellStatus возвращать желаемое значение для КАЖДОЙ координаты корабля, я просто не знаю, как перебирать значения, используя startLeft, startTop, ориентацию и т. Д.

1 Ответ

0 голосов
/ 09 февраля 2019

Вот один из способов:

В этом примере (x ≡ col и y ≡ строка)

Добавьте этот метод к вашему Ship классу:

  /** @return true if this Ship contains the point */
    public boolean contains(int x, int y) {
        int myX = left; int myY = top;
        int xInc = (isHorizontal ? 1 : 0);
        int yInc = ((xInc+1)%2);

        for (int z = 0; z < size; z++) {
            if (myX == x && myY == y) {
                return true;
            }
            myX += xInc; myY += yInc;
        }
        return false;
    }

И ваш cellStatus метод становится:

public static int cellStatus (int column, int row) {
    for (int shipIdx = 0; shipIdx < 5; shipIdx++) {
        if (ships[shipIdx].contains(column,  row)) {
            return shipIdx;
        }
    }
    return -1;
}

Итак, этот тестовый пример:

    ships[0] = new Ship(3, true, 1, 4);
    ships[1] = new Ship(2, false, 1, 6);
    ships[2] = new Ship(2, true, 0, 9);
    ships[3] = new Ship(4, true, 5, 1);
    ships[4] = new Ship(5, false, 7, 5);

С этим тестовым кодом:

    for (int row = 0; row < 10; row++) { 
        for (int col = 0; col < 10; col++) {
            int cellStat = cellStatus(col, row);
            String shipSymbol = (cellStat == -1 ? "-" : Integer.toString(cellStat));
            System.out.print(shipSymbol+" ");
        }
        System.out.println();
    }

Производит:

  - - - - - - - - - - 
  - - - - - 3 3 3 3 - 
  - - - - - - - - - - 
  - - - - - - - - - - 
  - 0 0 0 - - - - - - 
  - - - - - - - 4 - - 
  - 1 - - - - - 4 - - 
  - 1 - - - - - 4 - - 
  - - - - - - - 4 - - 
  2 2 - - - - - 4 - - 

Если вы не можете изменить класс Ship, просто измените метод contains, определенный выше, на:

public static boolean contains(Ship ship, int x, int y) {
    // modify all field accesses to ship.get...() accesses.
}

И измените цикл корабля на:

if (contains(ships[shipIdx],column,row) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...