1

所以我正在为我的游戏设计课布置一个 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包中的读取器逐行读取的,然后用于填充二维数组,我想我可以使用循环来指定使用带有数据的绘制类打印图像的位置在数组中。

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

(我的代码格式被这里需要的缩进弄乱了一点,我也是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]);
}

}
4

2 回答 2

2

您正在创建一个对于循环来说太小的数组。即:new char[28][31];仅允许最大索引为 27 和 30。您的 for 循环是:

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

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

于 2012-01-27T22:17:11.490 回答
1

三个建议:

  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();
        }
    }
}
于 2012-01-27T22:26:54.207 回答