我正在使用 Eclipse 控制台创建一个迷宫游戏。我试图移动一个玩家,并保存玩家的新位置,以便我可以将他移动到另一个方向。但是,每次我尝试移动播放器时,我都会让索引 ___ 超出长度 5(通常是 -1 或 5)的边界。它正在跳过整个数组,我不确定如何修复它。
运行时,它会打印以下内容
P。 . ! .
。 . . . .
。 . . ! .
! ! .
! . ! ! .
请选择以下选项之一:
按 1 向上移动。
按 2 向下移动。
按 3 向左移动。
按 4 向右移动。
按 0 停止玩游戏。
我只列出了一个动作,但其他动作都是一样的,只是变量互换。每个选项都返回超出范围的索引。有人建议我创建一个“检查”系统,但这并不能解决问题。它只是运行程序而不允许任何移动,因为每个移动都返回了界限。我相信这与线路有关
mazeStructure[vxTemp][vyTemp] = mazeStructure[i][k-1];
无论是那个还是与 for 条件有关的东西。如果有人可以提供修复,将不胜感激。
Scanner input = new Scanner(System.in);
int rowsTotal = 5;
int columnsTotal = 5;
int vxTemp = 0;
int vyTemp = 0;
String[][] mazeStructure = {
{"P",".",".","!","."},
{".",".",".",".","."},
{".",".",".","!","."},
{"!","!",".","T","."},
{"!",".","!","!","."},
};
boolean won = false;
while (won == false){
for (int a = 0; a < rowsTotal; a++){
for (int b = 0; b < columnsTotal; b++){
System.out.print(mazeStructure[a][b]);
System.out.print(" ");
}
System.out.print("\n");
}
System.out.printf("\n");
System.out.println("Please select one of the following:");
System.out.println("Press 1 to move up.");
System.out.println("Press 2 to move down.");
System.out.println("Press 3 to move left.");
System.out.println("Press 4 to move right.");
System.out.println("Press 0 to stop playing the game.");
int choice = input.nextInt();
int a = 0;
if (choice == 1 && a >= 0 && a < columnsTotal){
for (int i = 0; i < rowsTotal; i++){
for (int k = 0; k < columnsTotal; k++){
if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false && mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){
mazeStructure[vxTemp][vyTemp] = ".";
mazeStructure[vxTemp][vyTemp-1] = "P";
mazeStructure[vxTemp][vyTemp] = mazeStructure[i][k-1];
}else if (mazeStructure[vxTemp][vyTemp-1] == "!"){
System.out.println("Move isn't allowed.");
}else {
continue;}
答案 0 :(得分:0)
在 if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false && mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){
行中,您尝试访问 mazeStructure
处的 [vxTemp][vyTemp-1]
。您将 vyTemp
初始化为 0,在此之前它不会更改。您通过尝试 vyTemp - 1
开始该循环,该值将为 -1。这将超出您的数组范围。
您对循环中的变量 k
执行相同的操作。 k
附近的第一次将为零。因此,尽管 k - 1
存在是可以的,但您不能尝试访问某个 -1 索引处的任何数组。
答案 1 :(得分:0)
我猜问题出在这一行中的 vyTemp-1
if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false && mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){
vyTemp 的初始值为 0
答案 2 :(得分:0)
Scanner input = new Scanner(System.in);
int rowsTotal = 5;
int columnsTotal = 5;
int vxTemp = 0;
int vyTemp = 0;
String[][] mazeStructure = {
{"P",".",".","!","."},
{".",".",".",".","."},
{".",".",".","!","."},
{"!","!",".","T","."},
{"!",".","!","!","."},
};
boolean won = false;
while (won == false){
for (int a = 0; a < rowsTotal; a++){
for (int b = 0; b < columnsTotal; b++){
System.out.print(mazeStructure[a][b]);
System.out.print(" ");
}
System.out.print("\n");
}
System.out.printf("\n");
System.out.println("Please select one of the following:");
System.out.println("Press 1 to move up.");
System.out.println("Press 2 to move down.");
System.out.println("Press 3 to move left.");
System.out.println("Press 4 to move right.");
System.out.println("Press 0 to stop playing the game.");
int choice = input.nextInt();
int a = 0;
if (choice == 1 && a >= 0 && a < columnsTotal){
for (int i = 0; i < rowsTotal; i++){
for (int k = 0; k < columnsTotal; k++){
<块引用>
//if 条件有错误。如果你的选择是 1. 它会运行这个 如果条件 'mazeStructure[vxTemp][vyTemp-1].equals("!")'。作为 vyTemp = 0. vyTemp -1 < 0. java.lang.ArrayIndexOutOfBoundsException
if (mazeStructure[vxTemp][vyTemp-1].equals("!") == false && mazeStructure[i][k].equals(mazeStructure[vxTemp][vyTemp])){
mazeStructure[vxTemp][vyTemp] = ".";
mazeStructure[vxTemp][vyTemp-1] = "P";
mazeStructure[vxTemp][vyTemp] = mazeStructure[i][k-1];
}else if (mazeStructure[vxTemp][vyTemp-1] == "!"){
System.out.println("Move isn't allowed.");
}else {
continue;}