2016-04-07 4 views
0

Grundsätzlich hat jedes Zimmer eine Größe von 10 mal 10, das "W" steht für die Wände und die Leerstellen - "" für das Stockwerk, und die Zahlen sind Doors.Ich dachte, der beste Weg, um den Raum zu erstellen ist eine Methode, die eine Datei empfängt und sie liest und ihre "Information" in einen String [10] [10] legt, und dann eine andere Methode (oder einfach in meinem Main) erstelle, die den erzeugten String [10] [10] empfängt und schafft den Raum (fügt die Bilder dem Raum hinzu), aber ich habe einige Schwierigkeiten, die Datei zu lesen, also, wenn Sie mir mit diesem Teil helfen konnten, würde ich dankbar sein. Hier ist die Art von Textdateien, von denen ich möchte mein Zimmer schaffen:Wie lade ich einen Level/Raum aus einer Textdatei in Java?

WWWW0WWWWW 
    W  W 
    W  W 
    W  W 
    W  W 
    W  WW 
    W  WW 
    W  WW 
    W  W1 
    WWWWWWWWWW 

Hier sind die Türen, Wand- und Bodenklassen:

public class Door implements ImageTile { 


private Position position; 

public Door(Position position) { 
    this.position = position; 
} 

@Override 
public String getName() { 
    return "Door"; 
} 

@Override 
public Position getPosition() { 
    return position; 
} 

}

public class Floor implements ImageTile { 


private Position position; 

public Floor(Position position) { 
    this.position = position; 
} 

@Override 
public String getName() { 
    return "Floor"; 
} 

@Override 
public Position getPosition() { 
    return position; 
} 

}

public class Wall implements ImageTile { 


private Position position; 

public Wall(Position position) { 
    this.position = position; 
} 

@Override 
public String getName() { 
    return "Wall"; 
} 

@Override 
public Position getPosition() { 
    return position; 
} 

}

Und das ist meine Methode, um Bilder zu meinem Rahmen hinzufügen:

public void newImages(final List<ImageTile> newImages) { 
    if (newImages == null) 
     return; 
    if (newImages.size() == 0) 
     return; 
    for (ImageTile i : newImages) { 
     if (!imageDB.containsKey(i.getName())) { 
      throw new IllegalArgumentException("No such image in DB " + i.getName()); 
     } 
    } 
    images.addAll(newImages); 
    frame.repaint(); 
} 

Wenn ihr mir helfen könnte ich es schätzen würde sehr, dank guys.Her ist das, was ich habe jetzt:

 public class Room { 
     private String[][]room; 

     public Room(){ 
     room = new String[10][10]; } 

    public static Room fromFile(File file){  
    if(file.exists()){ 
     Scanner sc = null;  
     Room room = new Room(); 
     try { 
      sc = new Scanner(file); 
      while(sc.hasNextLine()){ 
       if(sc.nextLine().startsWith("#")) 
        sc.nextLine(); 
       else{ 
        String[] s0 = sc.nextLine().split(""); 
       //Here is where my trouble is, i dont know how to add the content of this String s0 to the String s 
        if(s0.length==10){ 
         for(int x = 0; x < 10; x++){ 
           for(int y = 0; y < 10; y++){ 
            String[x][y] s= String[x] s0; 
       }   
      } 
     } catch (FileNotFoundException e) { 
      System.out.println("Ficheiro "+file.getAbsolutePath()+ 
        " não existe. ");   } 
     finally{ 
      if(sc!=null)sc.close(); 
     } 
    } 
    else 
     System.out.println("Ficheiro "+file.getAbsolutePath()+ 
       " não existe. ");  
    return null;   
} 
+0

Willkommen bei Stack Overflow! "... _Ich dachte, der beste Weg, den Raum zu erstellen, besteht darin, eine Methode zu erstellen, die eine Datei empfängt und sie liest und ihre" Informationen "in einen String [10] [10] legt und dann eine andere Methode ... erstellt erhält den String [10] [10] erstellt und erstellt den Raum ...aber ich habe ein paar Schwierigkeiten, die Datei zu lesen, wenn ihr mir mit diesem Teil helfen könnt ... "Was für Code ihr zur Verfügung gestellt habt, ist interessant, hat aber fast nichts mit eurem Problem zu tun. Ihr müsst zumindest versuchen, Code zu schreiben zum Lesen einer Datei in einen String [10] [10], bevor Sie hier um Hilfe bitten. – AJNeufeld

+0

Ich habe ein paar, ich werde es jetzt hinzufügen. Danke. – GamerGirl

Antwort

0

Jeder Anruf an sc.nextLine() liest eine andere Zeile aus Ihrer Datei. Sie müssen die Zeile in eine temporäre Variable speichern und dann auf dieses temporäre verweisen.

Pflegen Sie einen Zähler der Linien, die Sie verarbeitet haben, so dass Sie die entsprechende Zeile in Ihrer s[][] Matrix ausfüllen können.

Sie müssen nur Speicher für die 10 Zeilen zuweisen, da das Aufteilen der Zeile, die Sie eingelesen haben, dazu führt, dass ein Array von Strings (die Spalten in einer Zeile) für Sie reserviert werden.

int row = 0; 
String[][] s = new String[10][]; 
while(sc.hasNextLine() && i < 10) { 
    String line = sc.nextLine(); 
    if(!line.startsWith("#")) { 
     String[] s0 = sc.line.split(""); 
     s[row] = s0; 
     row++; 
    }   
} 

BTW, Verwenden String[][] ist übertrieben; da jeder String nur ein Zeichen enthält. Vielleicht könnten Sie in Betracht ziehen, char[][] zu verwenden. Und line.toCharArray() würde die line in eine char[] für Sie aufteilen.


EDIT: (Durch Bearbeiten von Code Ihrer Frage des)

Statt:

if(s0.length==10){ 
    for(int x = 0; x < 10; x++){ 
     for(int y = 0; y < 10; y++){ 
      String[x][y] s= String[x] s0; 
     }   
    } 
} 

Sie wollen:

if(s0.length==10){ 
    for(int y = 0; y < 10; y++){ 
     s[row][y] = s0[y]; 
    } 
    row++; 
} 

Mit row wobei der Zeilenzähler in meinem obigen Code.

+0

Danke für die Hilfe immensily, aber eine Sache, die ich einen Fehler beim Kopieren der gemacht Arbeit ich hatte, anstatt eine Zeichenfolge [] [] si ein Objekt vom Typ Raum haben, ist es auf die gleiche Art und Weise? – GamerGirl

+0

Ich habe bereits den Code geändert, um zu zeigen, wie ich den Raum konstruiere (das ist im Grunde ein String [10] 10] – GamerGirl

+0

Ihre 'Room' Klasse scheint nur ein' String [] [] room' Feld zu haben. Also, ja, stattdessen können Sie 'Room r = new Room();' am oberen Rand Ihrer 'fromFile () 'Funktion, und speichern Sie die Werte als' r.room [Zeile] [y] = s0 [y]; '. – AJNeufeld