【问题标题】:How can I write characters from a file to a 2D array?如何将文件中的字符写入二维数组?
【发布时间】:2016-11-23 18:29:04
【问题描述】:

我目前正在尝试通过将文件加载到数组中来从文件中加载“地图”。我可以在没有数组的情况下打印文件本身,但我的项目是制作一个基于 ASCII 的游戏,所以我需要有坐标来放置其他对象。

import java.io.*;

public class Map
{
    private static String mapFile = "";

    private static File currentMap;
    private static BufferedReader br;


    private static int width;
    private static int height;

    char[][] map;

    public Map(String newMap) throws IOException
    {
        int c;
        char mapPiece;
        mapFile = newMap;
        currentMap = new File(mapFile);
        try{
            br = new BufferedReader(new FileReader(currentMap));
            String line;
            width = 0;
            height = 0;

            while((line = br.readLine()) != null)
            {
                height++;
                width = line.length();
            }

            map = new char[width][height];

            br.close();
            br = new BufferedReader(new FileReader(currentMap));

            for(int x = 0; x < width; x++)  
            {
                for(int y = 0; y < height; y++)
                {   
                    if((c = br.read()) != -1)
                        map[x][y] = (char) c;
                }                   
            }

            br.close();
        } finally {}

        System.out.println();

        for(int x = 0; x < width; x++)  
        {
            for(int y = 0; y < height; y++)
            {   
                System.out.print(map[x][y]);
            }
            System.out.println();
        }
    }

}

当它返回输入时,地图完全是乱序的,没有任何意义。它应该看起来像:

#########################
#.......................#
#......#................#
########................#
#......#................#
#......#................#
#......#................#
#.######................#
#.......................#
#########################

但是看起来像:

##########
##########
#####
#..
..........
..........
.#
#.....
.#........
........#


########.
..........
.....#
#.
.....#....
..........
..#
#....
..#.......
.........#

#......#
..........
......#
#
.######...
..........
...#
#...
..........
..........
#
#######

我最初有它,其中 for 循环被包裹在一个 while 循环中,但当然它只打印了“#”符号。我只需要它来打印地图并将字符正确保存到数组中。

【问题讨论】:

  • 您可以更改文件的格式吗?例如,你能不能让文件的第一行告诉你地图的宽度和高度是多少?
  • 我可以,但是 ' while((line = br.readLine()) != null) { height++;宽度 = line.length(); }' 使高度和宽度由地图本身确定(以防大小发生变化)
  • 你没有回答我的问题。
  • 你负责地图文件吗?如,您是否允许在顶部添加一条指定宽度和高度的线?或者这是地图文件必须保持不变的某种家庭作业。
  • 我建议在顶部添加一条线,指定宽度和高度。您两次读取文件是非常丑陋的,第一次只是为了计算高度。

标签: java arrays io bufferedreader


【解决方案1】:

你有两个问题。

第一:您的所有读取和打印输出都有些乱序。

您将线的长度存储为 X 维度中的宽度,但是您有:

for(int x = 0; x < width; x++)  
        {
            for(int y = 0; y < height; y++)
            {   
                if((c = br.read()) != -1)
                    map[x][y] = (char) c;
            }                   
        }

这是首先读取列 (y),因此如果文件中的每一行都应该是水平的,那么您会错误地垂直读取它们。您需要交换内部和外部 for 循环。

然后,当您打印时,您也可以向后执行:

 for(int x = 0; x < width; x++)  
    {
        for(int y = 0; y < height; y++)
        {   
            System.out.print(map[x][y]);
        }
        System.out.println();
    }

您打印的每一列后面都有一个换行符。所以你也需要切换这些循环。


第二:您正在读取换行符作为图块的一部分。 read() 不关心换行符。

所以一次只读一行。然后遍历该行中的每个字符并将其打包到适当位置的map


顺便说一句,您还有这个循环,您可以在其中读取所有行以将它们计为第一遍。你真的不需要这样做。您可以一次性完成所有操作。如果您想假设每条线的长度相同,或者如何处理不同长度的线,这取决于您,但无论哪种方式,如果您使用动态可调整大小的容器,例如一个ArrayList,你不需要提前知道文件中有多少行或者每行有多长,你可以随时添加(在这种情况下你不需要存储宽度和高度单独在文件的顶部,或者——我个人不太喜欢在文件中编码重复信息,如果信息是容易获得的,例如,如果文件中的每一行都是你地图中的一行,那么你没有'不需要冗余存储行数,它只会增加更多不一致和错误的机会。

例如,如果您不需要真正的错误检查,您几乎可以在几行代码中完成整个操作:

List<char[]> map = new ArrayList<char[]>();

String line;
while ((line = br.readLine()) != null)
    map.add(line.toCharArray());

但您可能想要验证行长和其他内容。这是一个完整的演示(我忘了关闭文件,别忘了这样做):http://ideone.com/K6s6NQ

PS 你不希望 widthheight 成为 static(参见链接教程)。

【讨论】:

  • 如果我实现这个方法,我是否能够全程跟踪坐标以在地图上放置角色对象?这是目前我仍在使用数组的唯一原因。我需要一种坐标系。我还清理了我的代码,并将宽度和高度设置为与地图相同的文件中的前两行。
  • 有没有一种简单的方法来解释我如何创建第二层然后将它们组合起来?编辑:我打算让游戏每次都重新绘制基本地图,然后在绘制基本地图后绘制角色/实体。
  • @RobertIannuzzi 好吧,当我说“层”时,我只是指概念上的。有一些选择。例如,您可以存储characterXcharacterY。然后,当您绘制时,当您点击该位置时,绘制角色而不是背景。这样可以轻松移动角色。你可以对怪物和其他实体做同样的事情。我就是这样做的。想一想,然后尝试一些东西,如果它坏了/疯狂/困扰你,想办法改进。你最终会想出一些好的东西。
  • 我终于明白了!谢谢你的帮助。我一定会实现该方法并查看它是否有效。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2011-06-06
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多