2016-05-11 41 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