我正在用Java构建一个简单的2D游戏,但我无法决定如何存储地图数据。我想要类似于数组的东西,但是Java中的全局数组是静态的,并且它们不能是动态大小的。我将从文件加载地图,但是,有时地图的大小不同。
Hashmap对于我想要的东西看起来太复杂了。 什么是轻松存储数据的好方法?我想创建一个简单的方法来检索每个坐标的数据。
示例:
int blockdata = blockCheck(5, 8);
然后它将返回数据“5a7”或无论数据是什么。在类似的游戏中,我在数组中只有静态变量,但我不知道如何动态调整大小。
答案 0 :(得分:3)
通常我建议创建一个自定义Map
类,将存储封装在私有成员中。这样,如果更改内部存储,其余代码仍可以保持不变。您可以为地图提供一个不错的APi,以便您可以执行map.get(10,12)
和map.set(3,4,BRICK_WALL);
之类的操作。
对于内部存储,您可以选择以下几种选择/技巧:
ArrayList
ArrayLists
可以很好地表示2D地图,并允许动态调整大小Tile[][]
或类似的嵌套数组。如果你想创建一个新的地图,你当然需要创建一个新的嵌套数组,但这通常不是问题。Tile[]
或类似数据,并计算此数组中的索引位置。您可以使用array[x + y * columnCount]
。就个人而言,我可能会选择阵列。它们是最轻量级和最高效的,我认为动态大小调整通常是不必要的:如果您需要不同大小的地图,每次只需创建一个所需大小的新Map
。
答案 1 :(得分:2)
我想要类似于数组的东西,但是Java中的全局数组是静态的,并且它们不能是动态大小的。我将从文件加载地图,但是,有时地图的大小不同。
你可以添加一个类成员并在构造函数中用动态值初始化它,即当你创建它的对象时
class Map {
int[][] twodspace;
Map(){}
Map(int len, int width){
twodspace = new int[len][width];
}
}
答案 2 :(得分:1)
您可以拥有ArrayLists的ArrayList。例如:
ArrayList<ArrayList<Integer>> myarray= new ArrayList<>();
int blockCheck(int x, int y) {
return myarray.get(x).get(y);
}
答案 3 :(得分:1)
我正在使用基于树图的数据结构,主要是因为它在我的情况下相对稀疏,我需要能够按顺序迭代:
public class Grid<T> implements Iterable<T> {
private TreeMap<Integer,TreeMap<Integer,T>> data = new TreeMap<Integer,TreeMap<Integer,T>>();
public T get(int row, int col) {
TreeMap<Integer,T> r = data.get(row);
return r == null ? null : r.get(col);
}
public void set(int row, int col, T value) {
TreeMap<Integer,T> r = data.get(row);
if (r == null) {
r = new TreeMap<Integer, T>();
data.put(row, r);
}
r.put(col, value);
}
}
我建议使用类似的抽象级别(您自己的2d“Grid”支持最适合您需求的数据结构),这样您就可以轻松调整底层实现(数组,树,hasmap,等等)根据您的需要,无需更改其余的应用程序代码。
答案 4 :(得分:0)
我刚刚使用了一个结构如下的txt文件:
*
* + +
* ____
*
**************************
然后我只是处理文件。对我来说最简单的方式。然后例如+字符是东西, - 是等等。