我目前正在编写一艘战舰游戏,并且使用2个for循环制作了10x10网格。现在,我要做的就是根据是否有船来更改单元格的颜色。
目前作为测试用例,我有一个尺寸为3的飞船,其坐标为水平(1,4)。船舶存储为ships [i] = ShipData(整数大小,布尔值isHorizontal,整数左,整数顶)。我认为我有几种不同的绘画方式,并且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,isHorizontal,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迭代这些值等等
答案 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.
}