1

ファイルからデータを取り込んで迷路ゲームを作るプログラムを作っています。maze.txt ファイルの例は次のようになります。

5  5
P.XX.
...X.
.XT..
..X..
X....

上の 2 つの数値は、配列の行と列を定義します。これが私が使用しているコードです

import java.util.*;
import java.io.*;

public class MazeGame {

    public static void main(String[] args) throws Exception {

        // Display the maze

        Scanner sc = new Scanner(new File("maze.txt"));
        int rows1 = sc.nextInt();
        int columns1 = sc.nextInt();
        rows1 += 1;
        columns1 += 1;

        BufferedReader in = new BufferedReader(new FileReader("maze.txt"));

        char[][] treasureMaze = new char[rows1][columns1];
        for (int i = 0; i < rows1 || i < columns1; ++i) {
            String line = in.readLine();
            if (line == null) {
                System.out.println("Error in array");
                return;
            }
            sc.nextLine();

            treasureMaze[i] = line.toCharArray();
        }

        display(treasureMaze);
        int vertical = 0;
        int horizontal = 0;

        // Give Move Options
        options();

        // Setup a while loop that continues until
        // the user has gotten to the treasure, or 'P'
        while (treasureMaze[vertical][horizontal] != 'T') {
            // Get Users Decision
            Scanner moveChoice = new Scanner(System.in);
            int choice = moveChoice.nextInt();

            if (choice == 1) {
                System.out.println("You chose to Move up");
            } else if (choice == 2) {
                System.out.println("You chose to Move down");
            } else if (choice == 3) {
                System.out.println("You chose to Move left");
            } else if (choice == 4) {
                System.out.println("you chose to Move right");
            } else {
                return;
            }

            // Move the Player: Each choice will move the player
            // according to their choice and then re-display the
            // map and options so that they can move through the maze

            // Move Up
            if (choice == 1) {
                if (vertical - 1 < 0) {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical - 1][horizontal] == '.') {
                    treasureMaze[vertical - 1][horizontal] = 'P';
                    treasureMaze[vertical][horizontal] = '.';
                    vertical -= 1;
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical - 1][horizontal] == 'T') {
                    System.out.println("\nCongratulations you won!");
                    treasureMaze[vertical][horizontal] = 'T';
                } else {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                }
            }

            // Move Down
            else if (choice == 2) {
                if (vertical + 1 < 0) {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical + 1][horizontal] == '.') {
                    treasureMaze[vertical + 1][horizontal] = 'P';
                    treasureMaze[vertical][horizontal] = '.';
                    vertical += 1;
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical + 1][horizontal] == 'T') {
                    System.out.println("\nCongratulations you won!");
                    treasureMaze[vertical][horizontal] = 'T';
                } else {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                }
            }

            // Move Left
            else if (choice == 3) {
                if (horizontal - 1 < 0) {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical][horizontal - 1] == '.') {
                    treasureMaze[vertical][horizontal - 1] = 'P';
                    treasureMaze[vertical][horizontal] = '.';
                    horizontal -= 1;
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical][horizontal - 1] == 'T') {
                    System.out.println("\nCongratulations you won!");
                    treasureMaze[vertical][horizontal] = 'T';
                } else {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                }
            }

            // Move Right
            else if (choice == 4) {
                if (horizontal + 1 < 0) {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical][horizontal + 1] == '.') {
                    treasureMaze[vertical][horizontal + 1] = 'P';
                    treasureMaze[vertical][horizontal] = '.';
                    horizontal += 1;
                    display(treasureMaze);
                    options();
                } else if (treasureMaze[vertical][horizontal + 1] == 'T') {
                    System.out.println("\nCongratulations you won!");
                    treasureMaze[vertical][horizontal] = 'T';
                } else {
                    System.out
                            .println("\nCannot move there! Try something else\n");
                    display(treasureMaze);
                    options();
                }
            } else {
                System.out.println("Bye!");
                return;
            }

        }
    }

    // Display Object: prints out the maze for the user
    public static void display(char x[][]) {
        for (int row = 0; row < x.length; row++) {
            for (int column = 0; column < x[row].length; column++) {
                System.out.print(x[row][column] + "\t");
            }
            System.out.println();
        }
    }

    // Options Object: gives the options menu to the user
    static void options() {
        System.out.println("You may:");
        System.out.println("\t1) Move up");
        System.out.println("\t2) Move down");
        System.out.println("\t3) Move left");
        System.out.println("\t4) Move right");
        System.out.println("\t0) Quit");

    }
}

プログラムを実行しようとするときは5 5、最初の実行で を確認してから削除する必要があります。これにより、プログラムの残りの部分を上の数字に遭遇することなく使用できるようになります。これらの数字を無視する方法はありますか?

4

3 に答える 3

1

ファイルを 2 回読み取るために開いているのはなぜですか?

Scanner sc = new Scanner(new File("maze.txt"));
BufferedReader in = new BufferedReader(new FileReader("maze.txt"));

Scanneraまたは a のいずれかを使用しBufferedReaderます。両方を使用することはできません。

もう 1 つのオプションはBufferedReader.readLine、最初の行を無視するために最初に余分な時間を呼び出すことです。

最小限のコード変更で、実際に String を渡して Scanner を構築できます。

    //move BufferedReader creation up
    BufferedReader in = new BufferedReader(new FileReader("maze.txt"));
    Scanner sc = new Scanner(in.readLine()); //Scan first line from the Reader

    // The res tof your code as it exists now
    int rows1 = sc.nextInt();
    int columns1 = sc.nextInt();
    rows1 += 1;
    columns1 += 1;
于 2012-09-25T21:39:10.880 に答える
1

BufferedReader でファイルを再度開く代わりに、Scanner.nextLineを使用できます。

編集:

明確にするために、私は意味します:

    Scanner sc = new Scanner(new File("maze.txt"));
    int rows1 = sc.nextInt();
    int columns1 = sc.nextInt();

    char[][] treasureMaze = new char[rows1][columns1];

    for (int i = 0; i < rows1; ++i) {
        String line = sc.nextLine();

EDIT2:

私は削除しました

    rows1 += 1;
    columns1 += 1;

forループを変更しました:

行と列に 1 を追加する目的が何であるかはわかりません。ループは実際には行数だけループする必要がありますrows1。少なくともファイル部分の読み取りについては。

于 2012-09-25T21:40:14.547 に答える
0

同様のシナリオを作成しようとしましたが、私のコードはあなたのコードとは完全に異なります。1行目の数字を無視したい場合は、次の行に進む前にチェックを行うだけです。このコードを確認してください:

Scanner scan = new Scanner(System.in);
    System.out.println("Enter rows and columns");
    PrintWriter write = new PrintWriter("maze.txt");
    write.println(scan.next());
    write.print("a bc db gj");
    write.flush();
    write.close();

    BufferedReader reader = new BufferedReader(new FileReader("maze.txt"));
    String rt="";
    while((rt=reader.readLine())!=null) {
        if(rt.startsWith("5")) {
         continue;  
        }
        else {
        System.out.println(rt);
        }
    }

}

入力:

5 5

出力:a bc db gj

お役に立てれば :)

于 2012-09-25T21:54:43.107 に答える