Java: FileRead вопрос - PullRequest
       5

Java: FileRead вопрос

0 голосов
/ 23 февраля 2010

Как бы вы написали этот код?

Этот конкретный вопрос касается игры-лабиринта, в которой есть множество игроков, среди которых Исследователи (вы), Монстры (вас коснутся) и Сокровища. В игре используются блоки квадратных объектов, в которых проживают эти обитатели. Особо я хочу сделать это для чтения файлов, которые могут экспортировать текущую конфигурацию лабиринта или импортировать их как текстовый файл.

Технические характеристики: Сначала прочитайте строки и столбцы лабиринта, чтобы создать квадрат [] [] соответствующего размера. Затем постройте и прочитайте все квадраты / обитатели.

Для квадратов лабиринт сначала определит, что линия начинается с "квадрата". Затем он будет читать строки и столбцы квадрата и использовать эту информацию для построения объекта квадрата. Наконец, он передаст оставшуюся часть сканера методу toObject, чтобы он мог инициализировать себя.

Для всех остальных обитателей лабиринт определит, какой это тип обитателя, и создаст соответствующий объект, используя конструктор, который берет только лабиринт. Он не будет читать строку или столбец из сканера, а просто передаст сканер методу toObject вновь созданного объекта.

Это мой код, который может быть неправильным:

    public void readMazeFromFile(String fileName) throws IOException, FileNotFoundException, MazeReadException
   {
        Scanner fileSc = new Scanner(new File(fileName));
        String line = fileSc.nextLine(); //whats on the line, will be overwritten
        Scanner lineSc = new Scanner(line);
        String temp;
        lineSc.useDelimiter(",");
        int lineNum = 1; //every time you scan a line out, do lineNum++
        int r1, r2, r3, r4, c1, c2, c3, c4;

        rows = fileSc.nextInt();
        cols = fileSc.nextInt();
        Square hi = new Square(rows, cols);
        line = fileSc.nextLine();
        while ( line != null)
        {
            line = lineSc.nextLine();
            lineSc = new Scanner(line);

            if( lineSc.equals("Square"))
            {
                r1 = lineSc.nextInt();
                c1 = lineSc.nextInt(); 
                hi.toObject(lineSc);
            }
            if (lineSc.equals("Explorer"))
            {

                explorer.toObject(lineSc);
            }
            if (lineSc.equals("Treasure"))
            {
                Treasure.toObject(lineSc);
            }


            lineNum++;
        }

Вот пример вывода:

5,5
Square,0,0,true,false,false,true,true,true
Square,0,1,true,false,true,false,true,true
Square,0,2,true,false,true,false,false,false
Square,0,3,true,false,false,false,false,false
Square,0,4,true,true,false,false,false,false
Square,1,0,false,false,true,true,true,true
Square,1,1,true,false,true,false,false,false
Square,1,2,true,true,false,false,false,false
Square,1,3,false,true,false,true,false,false
Square,1,4,false,true,false,true,false,false
Square,2,0,true,false,false,true,false,false
Square,2,1,true,false,true,false,false,false
Square,2,2,false,true,false,false,false,false
Square,2,3,false,true,false,true,false,false
Square,2,4,false,true,false,true,false,false
Square,3,0,false,true,false,true,false,false
Square,3,1,true,false,false,true,false,false
Square,3,2,false,true,false,false,false,false
Square,3,3,false,true,true,true,false,false
Square,3,4,false,true,false,true,false,false
Square,4,0,false,true,true,true,false,false
Square,4,1,false,true,true,true,false,false
Square,4,2,false,false,true,true,false,false
Square,4,3,true,false,true,false,false,false
Square,4,4,false,true,true,false,false,false
Explorer,0,0,Scary Name
Treasure,4,4,true
Treasure,2,2,false
Monster,4,4
Monster,3,3

Что бы вы написали для этого раздела?

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Это скелет, с которого вы можете начать. Вам действительно не нужно ничего больше, чем Scanner здесь; он может делать все, что вам нужно для сканирования ввода и преобразования, и т. д. Вы хотите использовать его методы next(), nextInt(), nextBoolean() и nextLine().

    Scanner in = new Scanner(new File(filename));
    in.useDelimiter("\\s+|,");

    int rows = in.nextInt();
    int cols = in.nextInt();
    // construct the array

    while (in.hasNext()) {
        String type = in.next();
        int r = in.nextInt();
        int c = in.nextInt();
        // read more depending on type
    }
0 голосов
/ 23 февраля 2010

Используйте FileReader для файла, а затем присоедините к нему StreamTokenizer, гораздо более эффективный:)

http://java.sun.com/j2se/1.4.2/docs/api/java/io/StreamTokenizer.html

http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileReader.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...