2014-02-12 53 views
-1

我正在用Java創建一個基於文本的掃雷遊戲。如果用戶創建了一個遊戲板一個完美的正方形遊戲工作正常,但是如果他們進入兩個不同的值,我得到在點一個例外,我添加了礦山的二維數組:索引超出使用二維數組時的界限

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 19 
    at Grid.addMines(Grid.java:77) 

添加礦山(77行是if語句):

public void addMines() 
    { 
     Random generator = new Random(); 
     int count = 0; 

     while (count < numMines) 
     { 
      int x = generator.nextInt(rows); 
      int y = generator.nextInt(columns); 

      if (grid[x][y].minePresent == false) 
      { 
       grid[x][y].setCurrent("*"); 
       grid[x][y].minePresent = true; 
       count++; 
      } 
      else 
       continue; 
     } 

    } 

回答

2

問題就出在你的遊戲的訪問領域

if (grid[x][y].minePresent == false) 
     { 
      grid[x][y].setCurrent("*"); 
      grid[x][y].minePresent = true; 
      count++; 
     } 

這裏你應該訪問它們以相反的順序:

grid[y][x].setCurrent("*"); // and so on 

的,因爲你創造了2D-方式陣列。

+0

事實證明這是正確的,因爲當我創建2d數組時,我已經在第一個for循環中定義了列,在第二個循環中定義了其他地方的列。謝謝 – rambossa

+0

沒錯。很高興我能幫上忙。乾杯! – Dropout

+0

@Mrambo:你真的需要制定出一致的術語即可。它的罰款決定是在訪問數組時把行號第一或列數第一,但瞭解自己在做什麼。也許它會更清晰,如果你使用'column'和'row'來代替'x'和'y'。我會編輯我的答案。 –

6

這看起來可疑的對我說:

int x = generator.nextInt(rows); 
int y = generator.nextInt(columns); 

假設一個x值指定通常一列,我懷疑你想:

int x = generator.nextInt(columns); 
int y = generator.nextInt(rows); 

或者更清晰依然:

int column = generator.nextInt(columns); 
int row = generator.nextInt(rows); 

然後一貫要麼使用:

Foo[][] grid = new Foo[rows][columns]; 
... 
grid[row][column] = ...; 

或:

Foo[][] grid = new Foo[columns][rows]; 
... 
grid[column][row] = ...; 

無論那些是好的,但是你會得到錯誤的順序,因爲你已經從「列/行」模型更改爲「x/y」模型不一致。

值得回顧一下如何診斷未來的類似問題。如果兩個值相同(本例中爲行和列)時有效,當它們不同時失敗,則通常爲,這意味着您正在使用其中一個值而不是其他值。因此,請仔細從錯誤點追蹤您的代碼,找出使用這些值的任何地方並檢查它們。

+4

我同意你的第二款,將這樣做,但是我相信X代表通常行和Y列。 – rambossa

+2

@Mrambo:沒有,真的沒有。 X值水平變化 - 就像列值一樣。 Y值垂直變化,就像行值一樣。如果一個表或網格具有5行,則對於任何細胞中的Y值將在範圍0-4或1-5個典型。如果它有20列,則任何單元格的X值將在0-19或1​​-20的範圍內。 –

-2

給出的答案從喬恩上述同樣,根據文檔http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28%29

所有2^32個可能的INT值的生成(大致)相同的概率。

例如,負面信息也會被返回。您必須使用Math.abs並執行int x = Math.abs(generator.nextInt(columns));

+0

他用'nextInt(INT N)',它的範圍在[0返回一個值,X)。 –

+0

返回一個僞隨機數,在0(含)和指定的值(不含)之間均勻分佈的int值。 – kai

+0

不需要nextInt(int n)根據java文檔生成0(含)和n獨佔。請修改以上E.g.負面聲明。 – Sanjeev

0

難道是網格的尺寸小於[行] [列]?

您可以檢查通過做這樣的事情:

System.out.println(grid.length+"/"+rows); 
System.out.println(grid[0].length+"/"+columns); 

如果任何左值比右值,那麼你有你的罪魁禍首小。如果您意外地提供了更小的數字,請查看網格的初始化。