首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ACSII世界地图导入和读取

ACSII世界地图导入和读取
EN

Stack Overflow用户
提问于 2014-01-17 17:58:15
回答 3查看 276关注 0票数 2

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

在搜索网络之后,寻找定义“世界”的方法,换句话说,玩家可以移动的地方,或者不能移动的地方。

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

代码语言:javascript
复制
###################
#-----------------#
#-----###---------#
#-----###---------#
#-----------------#
###################

在本例中,-字符表示允许播放机移动的10x10块,而#字符表示播放机无法移动的10x10区域。

在Java中,我使用以下方法导入world.txt

代码语言:javascript
复制
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值的字符,如下所示:

代码语言:javascript
复制
world[7][3];
// Should return #

我该如何存储这张ASCII地图?二维数组、二维对象、哈希映射等?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-17 18:23:03

2d数组将是最好的,因为它具有最小的内存占用,而且您将进行大部分直接访问。hashmap会占用空间,实际上并没有添加任何有用的内容。正如@assylias所提到的,抽象类中的数据结构可以提供一个干净的接口。@Alexander不知道前面的数组维是对的,但是您可以使用NIO来解决这个问题。

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2014-01-17 18:04:27

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

代码语言:javascript
复制
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) { ... }
}

你知道这个主意。

票数 1
EN

Stack Overflow用户

发布于 2014-01-17 18:09:35

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21192694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档