将2D数组文件读入2D数组

时间:2013-08-06 02:16:05

标签: java arrays

我正在制作一个自上而下的RPG游戏,我打算使用txt文件和2D数组进行关卡,我将会有一个包含0到6值的2D数组,每个数组代表不同的纹理,我打算保留这些级别在txt文件中,但我在将文件读入2D数组时遇到问题。

这就是我的文件

0000000010000000044444444
0000050010000005504444444
0050000010000000005544444
0005000010000000000550550
0000000011111000333333333
0000000000001111100000000
0005000055000010000000000
0000000000000010000000000
0000050000500010000000000
0000000000000010000000000
0000000050005010000000200
0001111111111112200002000
0501000000000002200002000
0051000000000000000002000

这是我在我的数组中读取的代码,顺便说一下它的14x25。

public int[][] readInLevel(String levelNumber)
    {

        try
        {
            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(levelNumber)));
            while (in.ready() == true)
            {

                for (int row = 0; row <= 13; row++)
                {
                    for (int column = 0; column <= 24; column++)
                    {
                        level_1[row][column] = in.read();
                    }
                }
            }
        } catch (Exception e)
        {
            System.out.println(e);
        }

        return null;

    }

这是我的2D阵列。

int level_1[][] = new int[14][25];

2 个答案:

答案 0 :(得分:1)

in.read读取一个ASCII字节。注意here Asciii中的“0”是48.因此,从in.read中减去48,如下所示:level_1[row][column]=in.read()-48;如果这不起作用,则转换为int:level_1[row][column]=(int)(in.read-48); < / p>

编辑:好的,有一种方法可以做到这就是我的工作。 编辑编辑:检查换行符

byte b=0;
int row=0;
int column=0;
while((b=in.read())!=1) {
    if((char)b=='\n') {
        row++;
        column=0;
    } else {
        level_1[row][column]=b-48;
        column++;
    }
}

行/列代码可能存在一些问题,我没有仔细考虑过。

编辑编辑:好的,发现了问题。如果没有字节,BufferedReader.read()返回-1,这意味着它每次返回-49,因为它返回-1-48。这意味着您的读者未正确初始化。检查你的文件。我通常会这样做:

File f=new File(path);
FileReader fr=new FileReader(f);
BufferedReader reader=new BufferedReader(fr);

好的,这是我的代码:http://pastebin.com/qstGnK77

它工作得很好,看看输出。

答案 1 :(得分:0)

确定。

Circuit Smasher是正确的,你应该减去48 ascii值以获得与你的关卡文件中的字符相对应的int。你看到-49因为-1(read()的EOF返回值)减去48是-49。

for循环中的限制令人困惑;也许你应该考虑将它们改为

for (int row = 0; row < 14; row++)

然后,请记住每行的第15个字符是换行符。这抵消了网格。我们可以通过阅读它来摆脱这个换行符。 (您也可以使用BufferedReader.read()的另一个定义从每行输入中获取前14个字符。或者您可以使用具有函数的Scanner类来获取整行输入。)< / p>

以下代码段似乎正常运行(我添加了一些打印语句以确保有效性):

   int[][] level_1 = new int[14][25];
   try {
   BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream("input.txt")));
        while (in.ready() == true) {

            for (int row = 0; row < 14; row++) {
                for (int column = 0; column < 25; column++) {

                    level_1[row][column] = in.read() - 48;
                    System.out.print(level_1[row][column] + ", ");
                }
                in.read(); // this is important

                System.out.println("");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

其他编辑:您使用的是IDE吗?在Eclipse中,输入文件需要位于您正在处理的项目的根目录中。对于其他IDE可能有所不同。如果您仍然收到一堆-49s,那么我认为该文件没有被正确读取。