2017-01-05 4 views
1

Моя задача - написать небольшую игру под названием «Сокобан». В этой подзадаче я должен позволить программе читать файл.Java BufferedReader Consoleparameter

Когда я не пишу что-то после «java Sokoban», он должен прочитать стандартную карту. Это работает, но он также должен прочитать другой файл, когда я пишу «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, арг [0] не название программы, это первый аргумент командной строки. Ваш код должен быть 'args.length> 0? args [0]: "sokoban.txt" '. – VGR

+0

@VGR Прошу прощения за это. Я неправильно читаю имя программы в качестве аргумента. Я отредактировал ответ. – user2004685

1

У вас есть довольно некоторые проблемы с кодом, представленным здесь:

  1. Вы закрыть BufferedReader после первых унда использования попытайтесь снова читать из него
  2. br = Files.newBufferedReader(Paths.get("sokoban.txt")) ||br = Files.newBufferedReader(Paths.get(args[])); не работает, как вы пропустите выражение для арг , Лучше использовать if, чтобы определить, какой файл использовать.
  3. Вы используете Paths.get("sokoban.txt") несколько раз, что не так уж плохо, но смена кода, например, для чтения другого файла занимает много времени. Может использовать константу для этого определения имени файла

И как уже отправил использование

String defaultMap = "sokoban.txt"; 
String fileName = args.length > 1 ? args[1] : defaultMap; 
BufferedReader br = Files.newBufferedReader(Paths.get(fileName)); 
Смежные вопросы