0

トップダウン 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];
4

2 に答える 2

1

in.readASCII バイトを読み取ります。Asciiiの "0" は 48 であることに注意してください。したがって、次のように in.read から 48 を引きます。level_1[row][column]=in.read()-48;それが機能しない場合は、int にキャストします。level_1[row][column]=(int)(in.read-48);

編集:さて、あなたがそれを行うことができる1つの方法があります。それは私がしていることです. EDIT EDIT: 改行のチェック

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++;
    }
}

行/列コードに問題がある可能性がありますが、よく考えていませんでした。

EDIT EDIT EDIT: 問題が見つかりました。BufferedReader.read() は、バイトがない場合は -1 を返します。つまり、-1-48 を返すため、毎回 -49 を返します。これは、リーダーが適切に初期化されていないことを意味します。ファイルを確認してください。私は通常、次のことを行います。

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

Ok。

Circuit Smasher は、ASCII 値から 48 を引いて、レベル ファイル内の文字に対応する int を取得する必要があるという点で正しいです。-49 が表示されているのは、-1 (read() の EOF 戻り値) から 48 を引いたものが -49 であるためです。

ループ内の制限はfor読みにくいです。おそらく、それらをに変更することを検討する必要があります

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

次に、各行の 15 番目の文字が改行文字であることを思い出してください。これはグリッドをオフセットしています。この改行文字を読み取ることで、この改行文字を取り除くことができます。(または、入力の行全体を取得する関数を持つクラスをBufferedReader.read() 使用することもできます。)Scanner

次のスニペットは正しく機能しているように見えます (有効性を確認するためにいくつかの print ステートメントを追加しました)。

   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 に答える