0

我正在制作一个自上而下的 rpg 游戏,我计划使用 txt 文件和 2D 数组作为关卡,我将有一个包含 0 到 6 的值的 2D 数组,每个值代表不同的纹理,我打算保留这些关卡txt 文件,但我无法将文件读入二维数组。

这就是我的文件的样子

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;

    }

这是我的二维数组。

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

2 回答 2

1

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

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

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

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

于 2013-08-06T02:21:24.120 回答
0

好的。

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

循环中的限制for读起来很混乱;也许您应该考虑将它们更改为

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

然后,记住每行的第 15 个字符是换行符。这是偏移网格。我们可以通过阅读来摆脱这个换行符。(您也可以使用其他定义从每行输入中获取前 14 个字符,BufferedReader.read() 或者您可以使用Scanner具有获取整行输入的函数的类。)

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

   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 可能会有所不同。如果您仍然收到一堆 -49,那么我认为该文件没有被正确读取。

于 2013-08-06T03:10:15.443 回答