You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:14:35