如何检测2D网格指定位置是否存在数组中存储的玩家、敌人对象
代码修复方案
核心问题说明
你的cells数组仅存储静态墙体的字符数据,读取文件时遇到玩家、敌人标识只会创建对应实例,不会把对应标识写入cells数组,原判定逻辑完全不匹配你的数据存储逻辑。
修复细节
1. hasPlayer方法修复
默认Player类提供getRow()、getCol()方法返回当前所在行列坐标,只需判断传入坐标是否和玩家当前坐标一致即可,补充非空判断避免空指针异常:
public boolean hasPlayer(int row, int col) { return player != null && player.getRow() == row && player.getCol() == col; }
如果你的Player类坐标属性的getter方法命名不同,对应修改即可。
2. hasLion方法修复
不需要查询cells数组,遍历lions数组匹配坐标即可,补充非空判断避免空指针:
public boolean hasLion(int row, int col) { if (lions == null || lions.length == 0) { return false; } for (Lion lion : lions) { if (lion != null && lion.getRow() == row && lion.getCol() == col) { return true; } } return false; }
3. display方法修复
原方法存在语法错误(缺方法括号),且遗漏墙体渲染逻辑,补充后代码如下:
public void display() { for(int i = 0; i < ROWS; i++) { for(int j = 0; j < COLS; j++) { if(hasPlayer(i,j)){ System.out.print(Main.BLUE + "P "); } else if(hasLion(i,j)){ System.out.print(Main.YELLOW + "& "); } else { // 渲染墙体,直接取cells中存储的墙体字符 System.out.print(Main.RESET + cells[i][j] + " "); } } // 每行结束换行,重置颜色避免后续输出异常 System.out.println(Main.RESET); } }
如果你的Main类中没有定义RESET颜色重置常量,可以自行添加,值为ANSI重置码"\u001B[0m"即可。
内容的提问来源于stack exchange,提问作者Jack Hueson
相关产品推荐
相关产品推荐

