1

我正在制作一个程序,它从文件中获取数据并从中制作迷宫游戏。一个示例 maze.txt 文件如下所示:

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

顶部的两个数字定义数组的行和列。这是我正在使用的代码

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

为什么要打开文件读取两次?

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

使用 aScanner或 a BufferedReader,不能同时使用。

另一种选择是在开始时简单地调用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

您可以只使用Scanner.nextLine而不是使用 BufferedReader 再次打开文件。

编辑:

为了澄清,我的意思是:

    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();

编辑2:

我删除了

    rows1 += 1;
    columns1 += 1;

并更改了 for 循环:

我不确定将 1 添加到 rows 和 columns 的目的是什么,并且循环实际上应该只循环 rows 的数量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 回答