Android Java Battleship Game:在2D网格上绘制图纸

时间:2019-02-09 10:41:42

标签: java android grid-layout

我目前正在编写一艘战舰游戏,并且使用2个for循环制作了10x10网格。现在,我要做的就是根据是否有船来更改单元格的颜色。

目前作为测试用例,我有一个尺寸为3的飞船,其坐标为水平(1,4)。船舶存储为ships [i] = ShipData(整数大小,布尔值isHorizo​​ntal,整数左,整数顶)。我认为我有几种不同的绘画方式,并且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;如果它属于某艘船(总共5艘船),则需要返回0到4。

因此,我需要从ShipData类中提取具有4个变量的数据,即ship [i] = ShipData(size,isHorizo​​ntal,left,top),并计算在任何给定的单元格处是否有飞船,并绘制相应的单元格。当前,每个单元格的颜色与我尚未编写的方法相同。

ships[0] = new ShipData(3, true, 1, 4);

所以我需要检查(1,4)(2,4)(3,4)并从cellStatus返回0,但是我不知道如何编写cellStatus。 cellStatus的参数是(列,行),并且在游戏类中是一个公共int。

为澄清起见,我的cellStatus方法需要检查任何给定坐标处是否存在飞船阻挡,大概是通过读取ShipData类变量类型来进行的。 ShipData有几种方法,例如getLeft,getTop,getRight和getBottom,而且我不确定如何将列,行的输入转换为有关每个单元格的实际数据,如上所述。因此,对于一个空单元格,cellStatus的输出必须为-1,对于5艘舰船的每一个,其输出必须为0-4。

对于这个长期存在的问题,我们深表歉意。如果您需要更多信息,请告诉我,我会提供。

不幸的是,我的旧帖子没有得到任何答案,自那时以来我取得了一些进步,

@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和direction迭代这些值等等

1 个答案:

答案 0 :(得分:0)

这是一种方法:

在此示例中(x≡col和y≡行)

将此方法添加到您的<property>类中:

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

如果您无法修改Ship类,则只需将上面定义的 - - - - - - - - - - - - - - - 3 3 3 3 - - - - - - - - - - - - - - - - - - - - - - 0 0 0 - - - - - - - - - - - - - 4 - - - 1 - - - - - 4 - - - 1 - - - - - 4 - - - - - - - - - 4 - - 2 2 - - - - - 4 - - 方法更改为:

contains

并将Ship loop修改为:

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