IndexOutofBounds异常创建迷宫

时间:2016-05-11 09:13:02

标签: 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”(段落)和一个“Utgang”(退出)课程。它们类似于“Vegg”类。

非常感谢投入!对不起挪威代码..

1 个答案:

答案 0 :(得分:0)

当您阅读文件并创建实验室时,您的变量rad会在从0X-1的循环中递增。但是,您可以使用它来索引Y维度。如果X>是的,你会在那里跑出界限。

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

我认为你最有可能需要某种嵌套循环。也许你应该使用nextLine来保持和增加i,并且内部循环有点像for (int rad = 0; rad < Y; rad++)但是再一次,我不可能在没有进一步内部的情况下说出来。