1

オブジェクト指向クラスの一環として、TUI を使用して最終的に GUI を実装する戦艦ゲームを設計します。設計によると、AI の船の位置を、次のようなテキスト ファイルから読み取ることになっています。

 ABCDEFGHIJ
1
2 BBBB
3
4       C
5D      C
6D
7AAAAA
8     SSS  
9
0

文字が異なる船を表す場所。ゲームの現在の実装では文字の 2 次元配列を使用しているため、テキスト ファイルを読み取って、対応する 2D 配列を作成できるようにしたいと考えています。次の文字列または次の整数を読み取ることができる組み込み関数をいくつか見てきましたが、文字ごとに読み取りたいだけです。これを行う方法はありますか?前もって感謝します!

4

5 に答える 5

3

私の意見では、これを行う最も簡単な方法は、最初にファイルを行ごとに読み取り、次にそれらの行を文字ごとに読み取ることです。組み込みのユーティリティを使用すると、OS/エディターによって異なるため、新しい行を処理する複雑さを回避できます。

BufferedReader ドキュメント

    BufferedReader fileInput = new BufferedReader(new FileReader("example.txt"));
    String s;
    while ((s = fileInput.readLine()) != null) {
        for (char c : s.toCharArray()) {
            //Read into array
        }
    }
    fileInput.close();
于 2015-08-02T02:12:21.893 に答える
2

@JudgeJohnの答えは良いです-コメントしますが、残念ながらできません。最初の行を 1 行ずつ読むことで、改行の実装などのシステムの詳細が Java のさまざまなライブラリによって処理されることが保証されます。Scannerファイルに対して何らかの種類のリーダーを使用すると、行を簡単に列挙できます。Stringこの後、たとえばtoCharArray()メソッドを使用して、取得した文字を文字ごとに読み取ることは問題になりません。

重要な追加 -StreamおよびReaderオブジェクトを使用Scannerし、それらに対して s を使用する場合、コードがプロセスの最後を適切に処理することが非常に重要です。つまり、ファイル ハンドルなどのシステム リソースを破棄します。これはclose()、これらのクラスのメソッドを使用して Java で行われます。ここで、読み取りを終了して を呼び出すだけでclose()、計画どおりに進んでいれば問題ありませんが、例外がスローされ、close()メソッドが呼び出される前にメソッドが終了する可能性があります。良い解決策はtry - catchortry - finallyブロックです。例えば

Scanner scanner = null;
try {
    scanner = new Scanner(myFileStream);
    //use scanner to read through file
    scanner.close();
} catch (IOException e) {
    if (scanner != null) scanner.close(); //check for null in case scanner never got initialised.
}

さらに良いのは

Scanner scanner = null;
try {
    scanner = new Scanner(myFileStream);
    //use scanner to read through file
} finally {
    if (scanner != null) scanner.close(); //check for null in case scanner never got initialised.
}

ブロックの終了finally方法に関係なく、ブロックは常に呼び出されます。tryさらに良いことに、Java には次のようなtry-with-resourcesブロックがあります。

try (Scanner scanner = new Scanner(myFileStream)) {
    //use scanner to read through file
}

これは、null のすべてのチェックfinallyと の呼び出しを行いclose()ます。非常に安全で、すばやく入力できます。

于 2015-08-02T02:26:37.113 に答える
2

こちらをご覧ください。このように一文字一文字読むことができます。新しい行に注意する必要があります。 http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

于 2015-08-02T02:07:46.033 に答える
1

a を使用しScannerて、次のように個々の文字を読み取ることができます。

scanner.findInLine(".").charAt(0)

ボードは 11x11 の文字 ( char[][] board = new char[11][11]) であるため、文字を読んでいるときに現在の行と列を追跡する必要があります。11 番目の文字を読んだ後、いつ次の行に移動するかがわかります。

コードサンプル:

public static void main(String[] args) throws Exception {
    String file = 
        " ABCDEFGHIJ\n" +
        "1          \n" +
        "2 BBBB     \n" +
        "3          \n" +
        "4       C  \n" +
        "5D      C  \n" +
        "6D         \n" +
        "7AAAAA     \n" +
        "8     SSS  \n" +
        "9          \n" +
        "0          \n";

    char[][] board = new char[11][11];
    Scanner scanner = new Scanner(file);

    int row = 0;
    int col = 0;
    while (scanner.hasNextLine()) {
        // Read in a single character
        char character = scanner.findInLine(".").charAt(0);
        board[row][col] = character;
        col++;

        if (col == 11) {
            // Consume the line break
            scanner.nextLine();

            // Move to the next row
            row++;
            col = 0;    
        }
    }

    // Print the board
    for (int i = 0; i < board.length; i++) {
        System.out.println(new String(board[i]));
    }
}

結果:

 ABCDEFGHIJ
1          
2 BBBB     
3          
4       C  
5D      C  
6D         
7AAAAA     
8     SSS  
9          
0          
于 2015-08-02T02:40:35.963 に答える