基于ArrayList随机地图的以撒类Roguelike游戏 minimap显示求助
解决小地图显示内存地址的问题
你遇到的显示RoomState@6ad22b72这种内存地址的情况,是因为Java默认调用了Object类的toString()方法,这个方法会返回类名加哈希码的字符串。要让小地图显示你想要的方括号和空白,只需要几步就能搞定:
1. 重写RoomState的toString()方法
首先,在你的RoomState类里重写toString(),让它根据房间状态返回对应的符号。比如假设你用isActive字段标记这个位置是否是有效房间,还可以加个字段标记玩家当前房间:
public class RoomState { // 你的现有属性,比如房间类型、是否有敌人等 private boolean isActive; // 标记该位置是否是已生成的有效房间 private boolean isCurrentRoom; // 标记玩家当前所在房间 // 重写toString方法,返回对应符号 @Override public String toString() { if (isCurrentRoom) { return "[*]"; // 用特殊符号突出当前房间,提升小地图实用性 } return isActive ? "[]" : " "; // 有效房间显示[],空区域显示两个空格(保持排版对齐) } // 对应的getter/setter方法 public boolean isActive() { return isActive; } public void setActive(boolean active) { isActive = active; } public boolean isCurrentRoom() { return isCurrentRoom; } public void setCurrentRoom(boolean currentRoom) { isCurrentRoom = currentRoom; } }
2. 遍历ArrayList生成格式化的小地图文本
接下来,把ArrayList里的房间数据转换成整齐的小地图字符串。假设你的地图是网格状(比如10x10尺寸),按行优先顺序存储在ArrayList里,可以这样处理:
// 在GameState类里添加生成小地图的方法 private String generateMiniMap() { int mapWidth = 10; // 你的地图列数,可根据实际配置调整 int mapHeight = 10; // 你的地图行数,可根据实际配置调整 StringBuilder miniMapBuilder = new StringBuilder(); for (int y = 0; y < mapHeight; y++) { for (int x = 0; x < mapWidth; x++) { // 按行优先计算当前位置在ArrayList中的索引 int index = y * mapWidth + x; RoomState room = map.get(index); // 如果ArrayList中存的是null表示空区域,就返回空格;否则调用重写后的toString() String roomSymbol = (room == null) ? " " : room.toString(); miniMapBuilder.append(roomSymbol); } miniMapBuilder.append("\n"); // 每行结束换行,保证小地图是网格状 } return miniMapBuilder.toString(); }
3. 在GameState中绘制小地图到屏幕右侧
最后,在你的绘制逻辑里(比如重写paint方法),把生成的小地图文本绘制到屏幕右侧。记得使用等宽字体,这样方括号和空格能完美对齐,小地图看起来更规整:
@Override public void paint(Graphics g) { super.paint(g); // 先绘制游戏主内容,避免小地图覆盖游戏画面 // 设置等宽字体,确保小地图排版整齐 g.setFont(new Font("Monospaced", Font.PLAIN, 12)); // 小地图的位置:屏幕右侧,距离右边20px,距离顶部20px(可根据屏幕尺寸调整) int miniMapX = getWidth() - 200; int miniMapY = 20; // 按行绘制小地图,避免单行太长导致显示异常 String[] miniMapLines = generateMiniMap().split("\n"); for (int i = 0; i < miniMapLines.length; i++) { g.drawString(miniMapLines[i], miniMapX, miniMapY + i * 15); // 15是行间距,可按需调整 } // 可选:给小地图加个边框,提升视觉效果 g.drawRect(miniMapX - 5, miniMapY - 5, 190, miniMapLines.length * 15 + 5); }
额外优化建议
- 玩家移动时,记得更新对应
RoomState的isCurrentRoom属性,取消之前房间的标记,这样小地图能实时显示玩家位置。 - 如果你的地图是动态尺寸,可以从游戏配置中读取
mapWidth和mapHeight,不用写死数值。 - 可以给不同类型的房间设置不同符号,比如隐藏房间用
[?]、BOSS房间用[B],让小地图信息更丰富。
内容的提问来源于stack exchange,提问作者224634
相关产品推荐
相关产品推荐

