Java IO, чтение из файла и печать в двумерный массив символов - PullRequest
1 голос
/ 28 января 2012

Итак, я работаю над заданием для своего класса игрового дизайна по созданию клона pacman, это будет продолжаться в течение всего семестра.

В настоящее время у меня есть текстовый файл, который представляет собой pacman maze

, см. Ниже:

WWWWWWWWWWWWWWWWWWWWWWWWWWWW
W............WW............W
W.WWWW.WWWWW.WW.WWWWW.WWWW.W
W*WWWW.WWWWW.WW.WWWWW.WWWW*W
W.WWWW.WWWWW.WW.WWWWW.WWWW.W
W..........................W
W.WWWW.WW.WWWWWWWW.WW.WWWW.W
W.WWWW.WW.WWWWWWWW.WW.WWWW.W
W......WW....WW....WW......W
WWWWWW.WWWWW.WW.WWWWW.WWWWWW
WWWWWW.WWWWW.WW.WWWWW.WWWWWW
WWWWWW.WW..........WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
..........WWWWWWWW..........
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW..........WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
W............WW............W
W.WWWW.WWWWW.WW.WWWWW.WWWW.W
W*WWWW.WWWWW.WW.WWWWW.WWWW*W
W...WW................WW...W
WWW.WW.WW.WWWWWWWW.WW.WW.WWW
WWW.WW.WW.WWWWWWWW.WW.WW.WWW
W......WW....WW....WW......W
W.WWWWWWWWWW.WW.WWWWWWWWWW.W
W.WWWWWWWWWW.WW.WWWWWWWWWW.W
W..........................W
WWWWWWWWWWWWWWWWWWWWWWWWWWWW 

Идея состоит в том, что это читается построчносчитыватель из пакета java io, а затем используемый для заполнения 2d-массива, я думаю, что затем я могу использовать цикл, чтобы указать, где печатать изображения, используя класс рисования с данными в массиве.

Моя проблема в настоящее времяэто метод рисования, он, кажется, не работает вообще, но я не могу найти, что с ним не так в данный момент.Кто-нибудь может указать мне правильное направление?

(Форматирование моих кодов было испорчено небольшим отступом, который требуется здесь, я также новичок в пакете Java IO, впервые я увидел обработку исключений!)

Заранее спасибо за любую помощь!

//imports
import java.awt.*;
import java.io.*;
import javax.swing.*;


public class Maze extends JFrame
{

//V.Decleration
private static final Dimension WindowSize = new Dimension (600,600);
static char[][] Amaze = new char[28][31];


//default constructor
public Maze()
{
this.setTitle("Pacman");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screensize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int x = screensize.width/2 - WindowSize.width/2;
int y = screensize.height/2 - WindowSize.height/2;
setBounds(x, y, WindowSize.width, WindowSize.height);
setVisible(true);
}

public void paint (Graphics g)
{

String line = null;

try
  { 
     BufferedReader reader = new BufferedReader(new FileReader("G:\\Game       Design\\Pacman\\src\\Maze.txt"));


  for (int i=0; i<=31; i++)
 {   
do
 {
    try
    {

    line=reader.readLine();
     for (int y=0; y<=28; y++)
     {

      Amaze[y][i]=line.charAt(y); 
     }

   }catch (IOException e) { }
 }

while (line!= null);
    try
      {
       reader.close();
      } catch (IOException e) { }
    }
 } catch (FileNotFoundException e) {}

 }

//main
public static void main (String [] args)
{
 Maze maze = new Maze();

 for (int i=0;i<=28;i++)
 System.out.print(Amaze[i][31]);
}

}

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Вы создаете массив, который слишком мал для цикла. А именно: new char[28][31]; допускает максимальный индекс только 27 и 30. Ваши циклы for:

for (int i=0; i<=31; i++)
for (int y=0; y<=28; y++)

Используйте i<31 и y<28 или увеличьте массив до [29][32]. Любой из них должен решить вашу текущую проблему.

1 голос
/ 28 января 2012

Три предложения:

  1. Может быть менее обманчиво разделять ваши функции, чтобы выполнять только одну работу за раз.Таким образом, должна быть функция для чтения файла, а затем другая для рисования результатов.
  2. Поместите больше операторов System.out.println() в ваш код при попытке отладки.Это хороший способ проверить, каждая ли часть выполнила то, что вы хотели.Например, печать переменной line после ее чтения, по крайней мере, даст вам знать, правильно ли вы читали файл.
  3. Всегда распечатывайте свои исключения.Они скажут вам, что пошло не так и где.

Тем не менее, этот код загрузит и напечатает ваш лабиринт:

import java.io.*;

public class Read2DArray {
    private final int WIDTH = 28;
    private final int HEIGHT = 31;

    private char[][] maze = new char[WIDTH][HEIGHT];

    public static void main(String[] args) {
        Read2DArray array = new Read2DArray();
        array.loadFile("maze.txt");
        array.printArray();
    }

    public void loadFile(String fname) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(fname));

            String line;
            int col = 0, row = 0;
            while((line = reader.readLine()) != null && row < HEIGHT) {
                for(col = 0; col < line.length() && col < WIDTH; col++) {
                    maze[col][row] = line.charAt(col);
                }
                row++;
            }
            reader.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }

    public void printArray() {
        for(int row = 0; row < HEIGHT; row++) {
            for(int col = 0; col < WIDTH; col++) {
                System.out.print(maze[col][row]);
            }
            System.out.println();
        }
    }
}
...