我正在制作一个程序,从文件中获取数据并从中制作迷宫游戏。 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
然后将其删除,以便我可以使用我的程序的其余部分而不会遇到顶部的数字。有没有办法忽略这些数字?
答案 0 :(得分:1)
为什么要打开文件阅读两次?
扫描仪sc =新扫描仪(新文件(“maze.txt”));
BufferedReader in = new BufferedReader(new FileReader(“maze.txt”));
使用Scanner
或BufferedReader
,而不是两者。
另一个选择是简单地在开始时调用BufferedReader.readLine
一个额外的时间来忽略第一行。
使用最少的代码更改,您实际上可以传递一个字符串来构建一个扫描程序:
//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;
答案 1 :(得分: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();
EDIT2:
我删除了
rows1 += 1;
columns1 += 1;
并更改了for循环:
我不确定在行和列中添加1的目的是什么,并且循环应该只循环遍历行数rows1
。至少对于文件部分的阅读。
答案 2 :(得分: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
输出:bc db gj
希望这有助于:)