2016-05-11 15 views
1

Ich arbeite an einer Schule Aufgabe, wo ich ein Labyrinth aus einer Textdatei erstellen soll. Mein Problem ist das Labyrinth zu schaffen. Ich weiß, es ist wahrscheinlich eine einfache Lösung, aber ich bin wirklich fest und muss das erledigen .. Irgendwelche Vorschläge?IndexOutofBounds Ausnahme erstellen ein Labyrinth

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

Die "Vegg" (Wand) Klasse:

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; 
} 

} 

Abstrakte Klasse:

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

} 

Ich habe auch einen "Gang" (Durchgang), und ein "utgång" (Ausfahrt) Klasse. Sie sind der "Vegg" -Klasse ähnlich.

Würde Input wirklich schätzen! Entschuldigung für den norwegischen Code.

+0

Wo wird die Ausnahme ausgelöst? – Harry

+0

Fall '#': Labyrint [i] [rad] = neues Vegg (i, rad); Pause; – Je9

+0

Was ist der Wert von Y? – Harry

Antwort

0

Wenn Sie die Datei lesen und das Labor erstellen, wird Ihre Variable rad in einer Schleife inkrementiert, die von 0 bis X-1 geht. Sie verwenden es jedoch, um die Y Dimension zu indizieren. Wenn X> Y, werden Sie dort außerhalb der Grenzen laufen.

Da Ihr Code die Regeln der Datei und die Art und Weise, wie das Labor erstellt werden kann, nicht vollständig aufdeckt, kann ich keine direkte Lösung bereitstellen.

Ich denke, dass Sie wahrscheinlich eine Art von verschachtelten Schleife benötigen. Vielleicht solltest du mit den nextLine's weitermachen und inkrementieren und die innere Schleife irgendwie wie for (int rad = 0; rad < Y; rad++) haben, aber wieder ist es unmöglich für mich, ohne weiter nach innen zu sagen.

+0

Die Textdatei enthält 2 ganze Zahlen in getrennten Zeilen. Die erste Ganzzahl definiert die Anzahl der Objekte in x-Richtung, die zweite in y-Richtung. Dann bildet es ein Labor mit den Zeichen im "switch-case". – Je9