存储2D游戏地图的最佳方式

时间:2017-10-20 22:31:30

标签: java data-structures

我正在用Java实现炸弹人克隆。它的地图有17 * 13个瓷砖。现在我将游戏地图存储在ArrayList中。显然它没有效果,因为游戏机制只提供离散的移动(向右,向左,向上,向下)。炸弹也只能有离散的位置。所以使用ArrayList我必须在处理碰撞或火力生成时通过整个列表查找四个相邻的图块。那么用Java存储这些地图的最佳实践是什么呢。

1 个答案:

答案 0 :(得分:2)

您可以通过多种方式对此进行建模。这是一个我经常用于类似问题的建议:

enum Direction {
    NORTH, SOUTH, EAST, WEST;
}

class Position {
    private final int x;
    private final int y;

    public static Stream<Position> getAllPositions();
    public Stream<Position> getNeighbours();
    public Optional<Position> positionInDirection(Direction direction);

    // make sure you implement equals and hashCode
}

class Map {
    private final Map<Position, Tile> tiles = new HashMap<>();

    public Map() {
        Position.getAllPositions().forEach(pos -> tiles.put(pos, new Tile());
    }

    public Tile getTile(Position position) {
        return tiles.get(position);
    }
}

这提供了许多有用的封装。例如,Position类是唯一需要了解地图和边缘大小的类。

现在要查看相邻位置是否有炸弹(例如),您可以使用:

position.getNeighbours().map(map::getTile).anyMatch(Tile::hasBomb);