java - 创建迷宫时 IndexOutofBounds 异常

标签 java javafx-8 indexoutofboundsexception maze

我正在做一项学校作业,我应该从文本文件创建一个迷宫。我的问题是创建迷宫。我知道这可能是一个简单的修复,但我真的很困难,需要完成这个工作..有什么建议吗?

package application;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javafx.application.Application;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;

public class Main extends Application {
LabyrintRute[][] Labyrint;
int X;
int Y;
int startx;
int starty;
Spiller spilleren;
int sizeX;
int sizeY;

@Override
public void start(Stage primaryStage) {
    try {
        GridPane root = new GridPane();
        Spiller spilleren = new Spiller(startx, starty);
        filLeser();

        root.add(spilleren.getUtseende(), spilleren.getxPossisjon(), spilleren.getyPossisjon());

        for(int x = 0; x<X; x++){
            for(int y = 0; y<Y; y++){
        root.add(Labyrint[x][y].getUtseende(), x, y);
        }
        }

        Scene scene = new Scene(root, X*10, Y*10);
        scene.setOnKeyPressed(new FilLytter(this));
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void filLeser() {
    String teksten = "";
    File fila;

    int rad = 0;

    FileChooser filvelger = new FileChooser();
    filvelger.setTitle("Åpne en tekstfil");
    filvelger.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
    fila = filvelger.showOpenDialog(null);


    try (Scanner filleser = new Scanner(fila)) {
        X = filleser.nextInt();
        Y = filleser.nextInt();
        teksten = filleser.nextLine();

        Labyrint = new LabyrintRute [X][Y];
        while (filleser.hasNext()) {
            teksten = filleser.nextLine();
            for (int i = 0;i< X;i++) {
                char tegn = teksten.charAt(i);
                switch (tegn) {
                case '#':
                    Labyrint[i][rad] = new Vegg(i, rad);
                    break;
                case ' ':
                    Labyrint[i][rad] = new Gang(i, rad);
                    break;
                case '-':
                    Labyrint[i][rad] = new Utgang(i, rad);
                    break;
                case '*':
                    Labyrint[i][rad] = new Gang(i, rad);
                    startx = i;
                    starty = rad;
                    break;
                }
                    rad++;

                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("Kan ikke åpne fila!");
            e.printStackTrace();
        }
    }

public void flyttSpiller(int deltax, int deltay) {
    int nyx = spilleren.getxPossisjon() + deltax;
    int nyy = spilleren.getyPossisjon() + deltay;
    Labyrint[nyx][nyy].flyttHit(spilleren);

}

public static void main(String[] args) {
    launch(args);
}
}

“Vegg”(墙)类:

package application;

import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

public class Vegg extends LabyrintRute {
private Node utseende;

public Vegg(int xKoordinat, int yKoordinat) {
    super(xKoordinat, yKoordinat);
    utseende = new Rectangle(10, 10, Color.MEDIUMPURPLE);
}

@Override
public void flyttHit(Spiller spilleren) {
    //spilleren.setxPossisjon(getxKoordinat());
    //spilleren.setyPossisjon(getyKoordinat());
}

@Override
public Node getUtseende() {
    return utseende;
}

}

抽象类:

package application;

import javafx.scene.Node;

public abstract class LabyrintRute {
private int xKoordinat;
private int yKoordinat;

public LabyrintRute(int xKoordinat, int yKoordinat) {
    this.xKoordinat = xKoordinat;
    this.yKoordinat = yKoordinat;
}

public int getxKoordinat() {
    return xKoordinat;
}

public int getyKoordinat() {
    return yKoordinat;
}

public abstract void flyttHit(Spiller spilleren);

public abstract Node getUtseende();

}

我还有一个“Gang”( channel )和一个“Utgang”(导出)类(class)。它们类似于“Vegg”类。

非常感谢您的意见!抱歉挪威代码..

最佳答案

当您读取文件并创建实验室时,您的变量 rad在从 0 开始的循环中递增至X-1 。但是,您使用它来索引 Y方面。如果 X > Y,你就会出界。

由于您的代码没有完全揭示文件的规则以及如何形成实验室,因此我无法直接提供修复。

我认为您很可能需要某种嵌套循环。也许你应该保留并增加 i 与 nextLine 的值,并以某种方式让内部循环像 for (int rad = 0; rad < Y; rad++) 一样。但话又说回来,我不可能不进一步深入了解就说出来。

关于java - 创建迷宫时 IndexOutofBounds 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37158031/

相关文章:

Java - IndexOutOfBoundsException

java - 计算 ASCII 字符频率时出现 ArrayIndexOutOfBoundsException

java - 同一变量中类的多个实例化

java - 如何从日志中提取带有 Http 响应 200 的 GET 请求请求的 gif 文件?

charts - 显示日期的折线图工具提示

javafx-8 - Javafx 8 如何使鼠标光标不可见?

JavaFX 自定义 Canvas 节点?

java - 替换字符串中所有出现的单词,但保持原始单词的大小写

java - Android SQLite SUM,抛出空指针

c# - 在循环中启动线程,将数组元素传递给每个线程