2012-01-27 128 views
1

因此,我正在爲我的遊戲設計類創建一個pacman克隆,它將在整個學期中完成一項任務。Java IO,從文件讀取並打印到2d字符陣列

目前我有一個文本文件,它是吃豆子迷宮

見下圖:

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讀取器讀取,一行行包,然後用來填充一個二維數組,我想我可以使用一個循環來指定使用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]); 
} 

} 
+4

打印所有'Exception's被抓到的'e.printStackTrace();'。例外情況一般不會被忽略。他們解釋出了什麼問題,例如在你的繪畫方法中。 – 2012-01-27 21:18:15

+1

我不明白你爲什麼認爲你的繪畫方法會畫。你沒有調用任何實際繪製的方法。你只是讀一個文件並填充一個數組。你需要展示更多。 – AHungerArtist 2012-01-27 21:18:51

+0

你們倆似乎都誤解了我的問題。 我很清楚,這段代碼不會打印任何東西,我只是試圖將數據從文本文件移動到當前的2d字符數組中。一旦我設法做到這一點,我可以繼續工作。 – Eogcloud 2012-01-27 21:25:56

回答

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

嘿,謝謝你的回覆,你幫了很大忙。我不想複製和粘貼這個,因爲我覺得我什麼都不會學,所以我修改了我的一些內容,以便使用上面的方法。 獨立功能是一個好主意,我很想找到問題,但我甚至沒有考慮到這個問題! 它的工作原理,我仍然不完全確定爲什麼我的工作沒有工作!感謝您的幫助,但史蒂夫! – Eogcloud 2012-01-27 22:51:23

2

您正在爲循環創建一個太小的數組。即:new char[28][31];將只允許27和30。您的循環的最大指標是:

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

使用i<31y<28,或增加您的陣列是[29][32]。其中任何一個都可以解決您當前的問題。

+0

我必須在弄亂它之後才能粘貼代碼,它們原本是正確的,但我一直在玩代碼,嘗試了一些不同的東西,在我的錯誤之前溜走了! 我嘗試了[1000] [1000]的二維數組並且問題依然存在:/ 謝謝您的回覆! – Eogcloud 2012-01-27 22:32:25