Android Java战舰游戏:实现cellStatus方法判断网格单元格状态
解决Android战舰游戏cellStatus方法的实现问题
我来帮你搞定这个cellStatus方法的实现,同时也给你提个小bug修复建议!
首先,先明确核心需求:我们需要检查传入的(column, row)坐标是否落在某艘战舰的覆盖范围内,如果是,返回对应战舰的编号(0-4),否则返回-1。
实现思路
每艘战舰的位置由起始坐标、方向和长度决定:
- 水平战舰:行固定,列从起始列
left开始,连续占据size个单元格(比如起始列1、长度3的水平战舰,覆盖列1、2、3,行不变) - 垂直战舰:列固定,行从起始行
top开始,连续占据size个单元格
基于这个逻辑,我们可以遍历每艘战舰,逐一判断当前坐标是否属于它:
完整的cellStatus实现代码
@Override public int cellStatus(int column, int row) { // 默认返回-1,表示空单元格 int status = -1; // 遍历所有5艘战舰 for (int shipIndex = 0; shipIndex < ships.length; shipIndex++) { ShipData currentShip = ships[shipIndex]; int shipLeft = currentShip.getLeft(); int shipTop = currentShip.getTop(); int shipSize = currentShip.getSize(); boolean isHorizontal = currentShip.isHorizontal(); // 判断当前坐标是否在这艘战舰的范围内 if (isHorizontal) { // 水平战舰:行必须等于战舰的top,列在[left, left+size-1]区间内 if (row == shipTop && column >= shipLeft && column <= shipLeft + shipSize - 1) { status = shipIndex; // 找到匹配的战舰,直接跳出循环,不用再检查其他战舰 break; } } else { // 垂直战舰:列必须等于战舰的left,行在[top, top+size-1]区间内 if (column == shipLeft && row >= shipTop && row <= shipTop + shipSize - 1) { status = shipIndex; break; } } } return status; }
顺便修复onDraw里的小bug
你当前的switch语句没有加break,会导致空单元格(case -1)执行完后,继续执行后面的case,最终所有单元格都会用shipPaint,这显然不对。需要给每个case加上break:
switch (var) { case -1: paint = fillPaint; break; // 加上break,避免fall through case 0: case 1: case 2: case 3: case 4: paint = shipPaint; break; }
测试验证
针对你提到的测试用例:一艘位于坐标(1,4)、长度为3的水平战舰(假设它是ships数组的第0艘,即索引0),当调用cellStatus(1,4)、cellStatus(2,4)、cellStatus(3,4)时,都会返回0;其他不在这个范围内的坐标会返回-1,这样就能正确切换单元格颜色了。
内容的提问来源于stack exchange,提问作者user7327019
相关产品推荐
相关产品推荐

