ASCII世界地图导入和读取

时间:2014-01-17 17:58:16

标签: java dictionary ascii bufferedreader

我正在用Java制作游戏,我希望玩家能够在具有指定边界的世界中移动。

在网上搜索定义“世界”的方法后,换句话说,玩家可以移动的位置,以及不移动的位置。

我喜欢2D ASCII地图的概念,其中一个字符代表一定数量的像素,例如:

###################
#-----------------#
#-----###---------#
#-----###---------#
#-----------------#
###################

在此示例中,-字符表示允许玩家进入的10x10图块,#字符表示玩家无法进入的10x10区域。

在Java中,我使用:

导入world.txt
void importMap() {
  BufferedReader br = new BufferedReader(new FileReader("world.txt"));
  String line;
  while ((line = br.readLine()) != null) {
     for (char ch: line.toCharArray()) {
       // Add to array
     }
  }
  br.close();
}

但是,我不知道在哪里存储这些数据。我正在考虑一个2D数组,我可以简单地将字符设置为某个x,y值,如下所示:

world[7][3];
// Should return #

我应该如何存储此ASCII地图? 2D数组,2D对象,散列图等?

3 个答案:

答案 0 :(得分:2)

2d阵列是最好的,因为它具有最小的内存占用,并且您将主要进行直接访问。 hashmap带来了空间开销,实际上并没有添加任何有用的东西。正如@assylias所提到的,抽象类中的数据结构可以实现干净的界面。 @Alexander Tokarev对于不了解阵列尺寸是正确的,但你可以使用NIO解决这个问题。

char[][] createWorld(String file)
{
    try {
        List<String> lines = Files.readAllLines(Paths.get(file),
            Charset.forName("US-ASCII"));
        char[][] world = new char[lines.size()][];
        int i = 0;
        for(String ln: lines)
            world[i++] = ln.toCharArray();
        return world;
    } catch (IOException ex) {
        Logger.getGlobal().log(Level.SEVERE, null, ex);
    }
    return null;
}

答案 1 :(得分:1)

将信息存储在2D数组中似乎是一种合理的解决方案。但是,您可能会将其隐藏在类中,例如:

class WorldMap {
    private final char[7][3] world = new char[7][3];

    //x,y below are pixels, so you don't need to convert from array index to pixels
    //everywhere in your code
    public boolean canMoveTo(int x, int y) { ... }

    public void addObstacle (Rectangle r) { ... }
}

你明白了。

答案 2 :(得分:0)

将数据存储在2D数组中的主要缺点是,在解析以创建合适的数组之前,您应该知道“World”的大小。如果大小是恒定的 - 那么2D阵列将适合您的解决方案。如果不是 - 考虑使用不同的结构。

您还可以创建一些动态扩展的结构,如ArrayList,并在解析后将其转换为2D数组。这将解决未知的大小问题。