2013-05-02 56 views
0

我遇到一對夫婦在俄羅斯方塊清算行奇怪的事情......的Java俄羅斯方塊 - 奇怪的行結算問題

如果我把我的板的寬度和高度是相同的(10和10):

board = new Board(10, 10, 35); 

其通過以下方式確定:

public Board(int w, int h, int ts) { 
    width = w; 
    height = h; 
    tilesize = ts; 
    grid = new Tile[width][height]; 
... 
} 

public int getWidth() { 
     return width * tilesize; 
} 

public int getHeight() { 
     return height * tilesize; 
} 

行清算似乎工作正常(雖然我不知道爲什麼有一個隱藏的行其下......不應該是完全適合的JFrame? ):

enter image description hereenter image description here

但是,如果我把我的寬度和高度不同(這裏是10和12),該行不會明確。

board = new Board(10, 12, 35); 

enter image description here

行結算:

public void checkBottomFull() { 
    System.out.println(grid.length); 
    int lines = 0; 
    for(int row = grid.length-1; row >= 0; row--) { 
     while (isFull(row)) {  
      lines++; 
      clearRow(row); 
     } 
    } 
} 

public boolean isFull(int row) { 
    for (int col = 0; col <= grid[row].length-1; col++) { 
     while(grid[col][row] == null) { 
      return false; 
     } 
    } 
    return true; 
} 

public void clearRow(int rowToClear) { 
    for(int row = rowToClear; row > 0; row--) { 
     for(int col = 0; col < grid[row].length; col++) { 
      grid[col][row] = grid[col][row-1]; 
     } 
    } 
} 

任何思考爲什麼有相同的尺寸允許行以清除?爲什麼要這麼做?

謝謝!


我想我找到了問題,但是當我試圖解決它時,它現在會引發錯誤。

之前,我不得不checkBottomFull()通過grid.length-1,這等於10(for(int row = grid.length-1; row >= 0; row--) {)循環但是我把高度(行)爲12 gameBoard = new Board(10, 12, 35);,所以應通過12行被循環,而不是10。而我應該通過每行10列...被循環

所以我硬編碼在12行和列在低於10 ...

//loop through all rows (12 rows) 
public void checkBottomFull() { 
    System.out.println(grid.length); 
    for(int row = 12; row > 0; row--) { 
     while (isFull(row)) {  
      clearRow(row); 
     } 
    } 
} 
//loop through all columns in that row (10 columns) 
public boolean isFull(int row) { 
    System.out.println(grid[row].length); 
    for (int col = 0; col <= 10; col++) { 
     if(grid[col][row] == null) { 
      return false; 
     } 
    } 
    return true; 
} 

但它拋出一個異常IndexOutOfBounds ...

不知道爲什麼

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-05-02 16:17:07

+0

你幾乎可以肯定地將'col'和'row'交換到你不應該在的數組索引中。 – durron597 2013-05-02 16:21:14

+0

annnnnnnnd我正在唱俄羅斯方塊歌曲。謝謝 – 2013-05-02 16:22:12

回答

1

有一兩件事我注意到的是:

for (int col = 0; col <= grid[row].length-1; col++) { 
    while(grid[col][row] == null) { 

你有grid[row]但隨後grid[col][row]。這導致我認爲它應該是grid[col]或者網格[row] [col]`

+0

我每次都在'row'中傳遞給isFull(它通過一個基於該行的列循環),每次checkBottomFull遍歷一行 – Growler 2013-05-02 16:26:31

+0

我做了上面的編輯。我認爲我發現了這個問題,但不知道如何解決錯誤 – Growler 2013-05-02 16:45:29

1

您可能已將網格/列最大值替換爲您的循環的某處。它在正方形時正常工作,因爲它們會相同。如果它不是正方形的(即行/列最大值不同),那麼對於一邊它不會處理整個行/列,而另一邊會溢出。

無關,但isFull(...)方法中的while(grid[col][row] == null)循環有什麼意義?這是否應該是if

+0

是的,我不小心把它留在那裏,因爲我最初有'if(isFull(row)){',所以我需要'while'在'isFull )'。但後來改了'if(isFull(row)){'to'while(isFull(row)){' – Growler 2013-05-02 16:28:48

+0

我上面做了編輯。我想我找到了問題,但不知道如何解決錯誤 – Growler 2013-05-02 16:44:51

+0

您仍然有索引交換。在你最近的'isFull(...)'你有'grid [col] [row] = ...'。不應該是'格[行] [列]'嗎?二維數組是一個「數組數組」,所以如果'grid.length'指的是行數(這是基於checkBottomFull()方法的結果),那麼'grid [x]'是行X ,而不是第X列。 – sehrope 2013-05-02 18:03:23