我在 android 中创建游戏,其中关卡将存储在单独的 .txt 文件中。每个级别都是一个字符网格,代表地图上的不同项目,但每个级别的大小都不同,所以我想创建一段健壮的代码来读取文件,并将每个级别存储在 2d 中arraylist,不管它的大小是多少。
我的第一次尝试:
private void loadLevel(String filename) {
mapWidth = 0;
mapHeight = 0;
BufferedReader br = null;
try {
String line = null;
br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(filename)));
while ((line = br.readLine()) != null) {
mapArray.add(getLevelLine(line));
mapHeight++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private ArrayList<Character> getLevelLine(String line) {
ArrayList<Character> levelLine = new ArrayList<Character>();
if (line == null) return levelLine;
char[] lineArray = line.toCharArray();
for (char mapPiece : lineArray) {
levelLine.add(mapPiece);
}
mapWidth = lineArray.length;
return levelLine;
}
这个效率有点低,因为每行都重新计算mapWidth,而且不起作用,因为读取了文本文件的第一条水平行,并存储在arraylist上的第一个垂直列中,所以它复制了文本文件,但是交换了 x 和 y 坐标。
尝试2:
private void loadLevel(String filename) {
mapWidth = 0;
mapHeight = 0;
BufferedReader br = null;
try {
String line = null;
br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(filename)));
while ((line = br.readLine()) != null) {
mapArray.add(new ArrayList<Character>());
char lineArray[] = line.toCharArray();
for (char mapPiece : lineArray) {
mapArray.get(mapHeight).add(mapPiece);
}
mapHeight++;
mapWidth = lineArray.length;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
这以相同的方式计算mapWidth,所以看起来仍然有点低效。希望通过在数组列表中添加一个空条目,我可以循环遍历它们每个的第 i 个元素。这第二次尝试也没有正确增加mapHeight,因为在最后一次迭代中,mapHeight会增加,然后while循环不会再次执行,但由于某种原因,即使我在while循环之后从mapHeight中减去1,我获取索引越界错误。更重要的是,通过手动设置mapWidth和mapHeight,我的第二次尝试在将其存储到arraylist时似乎仍然交换了x和y坐标。
我有什么明显的遗漏吗?似乎应该有一种相对简单的方法来做到这一点,不需要预先读取文本文件,并且避免使用普通的 char 数组。
提前感谢您的帮助!