2017-01-05 61 views
1

我的任務是寫一個名爲「推箱子」的小遊戲。在這個子任務中,我必須讓程序讀取一個文件。Java BufferedReader Consoleparameter

當我在「java推箱子」之後沒有寫東西時,它應該讀取標準地圖。 這可以工作,但是當我將「java Sokoban example.txt」寫入控制檯時,它也應該讀取其他文件。

我對緩衝讀者代碼:

public class Sokoban { 

public static void main(String[]args) throws IOException {  
    BufferedReader br = Files.newBufferedReader(Paths.get("sokoban.txt")); 
    String line = null; 
    int spielfeldbreite = 0; 
    int spielfeldhoehe = 0; 
    while ((line = br.readLine()) != null) {          
     spielfeldbreite = line.length(); 
     spielfeldhoehe++;              
    } 
    br.close(); 
    Scanner scan = new Scanner(System.in); 
    String eingabe; 
    int playerX = 0; 
    int playerY = 0; 
    boolean exit = false; 
    char[][] room = new char[spielfeldbreite][spielfeldhoehe];     
    br = Files.newBufferedReader(Paths.get("sokoban.txt")) 
     ||br = Files.newBufferedReader(Paths.get(args[])); 
    line = null; 
    int zeile = 0; 
    int zielfeld = 0; 
    int kiste = 0; 
    int kisteaufziel = 0; 
    int spieler = 0; 
    int hashtag = 0; 
    int leer = 0; 

    while ((line = br.readLine()) != null) { 
     for (int spalte = 0; spalte < spielfeldbreite; spalte++) { 
      room[spalte][zeile] = line.charAt(spalte);       
      switch (room[spalte][zeile]) { 
       case '@': 
        playerX = spalte;           
        playerY = zeile;            
        spieler++;          
        break; 

       case '.': 
        zielfeld++;             
        break; 

       case '+': 
        playerX = spalte;           
        playerY = zeile;            
        zielfeld++;             
        spieler++; 
        break; 

       case '*': 
        zielfeld++;             
        kiste++;              

        kisteaufziel++;            
        break; 

       case '$': 
        kiste++;              
        break; 

       case '#': 
        hashtag++; 
        break; 

       case ' ': 
        leer++; 
        break; 


        default: 
        System.out.println("Illegal symbol!"); 
        line = null; 
        break; 
      } 
     } 
     zeile++;                 
    } 
    br.close(); 

我希望一切是可以理解的。預先感謝您

回答

2

如果我正確理解您的問題,那麼您所要做的就是修改BufferReader獲得fileName的代碼段。

換句話說,您將不得不在運行應用程序時檢查是否傳遞任何參數,然後根據您選擇的參數數量fileName

這裏是代碼片段:

String fileName = args.length > 0 ? args[0] : "sokoban.txt"; 
BufferedReader br = Files.newBufferedReader(Paths.get(fileName)); 

第一行會檢查您是否已通過任何參數。如果你已經傳遞了一個參數,那麼它會將第一個參數作爲fileName,如果不是,那麼它將默認爲你的標準文件。

+0

Java是不同C.在Java中,ARGS [0]是不是程序名稱,它是第一個命令行參數。你的代碼應該是'args.length> 0? args [0]:「sokoban.txt」。 – VGR

+0

@VGR我很抱歉忽略它。我誤解了程序名稱作爲參數。我編輯了答案。 – user2004685

1

你有相當一些問題,這裏提供的代碼:

  1. 您第一次使用UND後關閉的BufferedReader試圖從它再次讀取
  2. 因爲你錯過了ARGS表達
  3. br = Files.newBufferedReader(Paths.get("sokoban.txt")) ||br = Files.newBufferedReader(Paths.get(args[]));不起作用。 更好地使用if來確定要使用的文件。
  4. 您正在使用Paths.get("sokoban.txt")多次這不是很糟糕,但改變代碼,例如讀取另一個文件是耗時的。 也許使用常量爲定義文件名

而作爲已發佈使用

String defaultMap = "sokoban.txt"; 
String fileName = args.length > 1 ? args[1] : defaultMap; 
BufferedReader br = Files.newBufferedReader(Paths.get(fileName));