Java IO,从文件读取并打印到2d字符数组

时间:2012-01-27 21:12:53

标签: java arrays io pacman

所以我正在为我的游戏设计课做一个任务来构建一个pacman克隆,它将在整个学期中完成。

目前我有一个文本文件是pacman迷宫

见下文:

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数组,我想我可以使用循环来指定使用paint类打印图像的位置与数组中的数据。

我目前的问题是绘画方法,它似乎根本不起作用,但我现在无法找到它的错误。有人能指出我正确的方向吗?

(我的代码格式化已经因为这里需要缩进而搞得一团糟,我也是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 个答案:

答案 0 :(得分:2)

您正在创建一个太小而不适合循环的数组。即:new char[28][31];仅允许最大索引为27和30.您的for循环为:

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

使用i<31y<28,或将您的数组增加到[29][32]。其中任何一个都可以解决您当前的问题。

答案 1 :(得分:1)

三点建议:

  1. 将您的职能分开,一次只做一份工作可能会少一些误导。因此应该有一个函数来读取文件,然后另一个函数来绘制结果。
  2. 在尝试调试时,在代码中添加更多System.out.println()个语句。这是检查每个部件是否符合您的意图的好方法。例如,在阅读后打印line变量至少会让您知道您是否正确阅读了该文件。
  3. 始终打印出您的例外情况。他们会告诉你出了什么问题以及在哪里。
  4. 那就是说,这段代码会加载并打印你的迷宫:

    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();
            }
        }
    }