2016-05-11 22 views
1

我正在从事一个学校任务,我应该从文本文件创建一个迷宫。我的问题是创造迷宫。我知道这可能是一个简单的修复,但我真的被卡住了,需要完成这个任务。任何建议?IndexOutofBounds例外创建一个迷宫

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

} 

我也有一个 “帮”(通道),以及 “Utgang”(退出)类。它们与“Vegg”类相似。

会真的很感激投入!对挪威代码感到抱歉。

+0

抛出异常在哪里? – Harry

+0

case'#': Labyrint [i] [rad] = new Vegg(i,rad); 休息; – Je9

+0

Y的价值是什么? – Harry

回答

0

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

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

我想你最可能需要某种嵌套循环。也许你应该保持和增加我与nextLine的,并有不知何故像for (int rad = 0; rad < Y; rad++)内循环,但再次,我不可能没有进一步说。

+0

该文本文件在单独的行上包含2个整数。第一个整数定义x方向的对象数量,y方向的第二个整数。然后通过使用“开关箱”中的字符形成一个实验室。 – Je9