2014-01-17 37 views
2

我正在用Java製作遊戲,我希望玩家能夠在具有指定邊界的世界中移動。ACSII世界地圖導入和閱讀

在搜索網絡後,如何定義「世界」,換句話說,玩家可以在哪裏移動,哪裏不在。

我喜歡2D ASCII地圖的想法,其中,一個字符表示一定量的像素,例如:

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

在這個例子中,-字符代表一個10×10瓦,玩家是允許進入,並且#角色代表玩家不能前來的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(); 
} 

不過,我不知道在哪裏存儲這些數據。我想一個二維數組來,我可以簡單地得到在一定的X這樣的字符,Y值:

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

我應該如何儲存這些ASCII地圖?二維數組,二維對象,散列圖等?

回答

2

一個2d數組將會是最好的,因爲它具有最小的內存佔用空間,並且您將主要進行直接訪問。哈希映射帶有空間開銷,並且不會添加任何有用的內容。正如@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

將信息存儲在二維數組似乎是一個合理的解決方案。但是,您可能會從隱藏類內部獲益,例如:

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) { ... } 
} 

您明白了。

0

將數據存儲在二維數組中的主要缺點是在分析之前應該知道「世界」的大小以創建合適的數組。如果大小不變 - 那麼二維數組將適合您的解決方案。如果不是 - 考慮使用不同的結構。

您還可以創建一些動態擴展結構,如ArrayList,並在解析後將其轉換爲二維數組。這將解決未知的大小問題。

+0

動態二維數組類(可能使用ArrayList的ArrayList實現)很酷。 – JVMATL