2012-02-22 257 views
1

我正在製作一個類似於着名遊戲「俄羅斯方塊」的程序,並且在旋轉塊時遇到了一些問題。2D陣列中的旋轉塊

我知道你可以通過使用「x = -y」和「y = x」在座標系中旋轉數字,但問題是因爲我使用整數數組來表示塊非常困難。

我的數組是這樣的:

int[][] space = new int[20][10]; 

如果座標包含一個塊的值是1,否則是0。

所以,我怎麼可以旋轉在空間中的塊沒有得到麻煩負號碼?

+1

如果值爲0或1,爲什麼不使用布爾值? – Hedja 2012-02-22 23:50:39

+2

找出問題的最佳方法是,如果您拿起一支鉛筆和一張紙,並在其中繪製一個網格和一個形狀,然後觀察旋轉它時發生了什麼。我知道這不是一個答案,而是相信我,你會從這個方面學到更多東西。 – biziclop 2012-02-22 23:51:19

+0

由於您使用的是二維數組,因此我認爲您可以更方便地使用方矩陣來達到此目的。這是因爲,在矩形矩陣中,如果需要旋轉,您將不會遇到交換行/列大小的問題。 – noMAD 2012-02-22 23:51:22

回答

2

這裏是一個樣片(重用你INT [] []用0和1的,這很可能會成爲使用布爾數組完成):

private static final int[][] piece = new int[][] { 
     { 0, 1, 0, }, 
     { 1, 1, 1, }, 
}; 

您可以旋轉一塊這樣做:

private static int[][] rotate(final int[][] piece) { 
    final int[][] res = new int[piece[0].length][piece.length]; 
    for (int x = 0; x < piece.length; x++) { 
     for (int y = 0; y < piece[0].length; y++) { 
      res[(res.length-1)-y][x] = piece[x][y]; 
     } 
    } 
    return res; 
} 

起始片:

010 
111 

這裏的旋轉(件)

01 
11 
01 

這裏的旋轉(旋轉(件))

111 
010 

而這裏的旋轉(旋轉(旋轉(件)))

10 
11 
10 
0

如果我正確地理解了這一點,可以通過將固定偏移量應用於座標來實現。偏移量是要旋轉的中心。

int oldSpace[][] = new int[20][10]; 
int newSpace[][] = new int[20][10]; 
int offX = 10; 
int offY = 5; 
for(int x = -5; x < 5; x++) { 
    for(int y = -5; y < 5; y++) { 
    newSpace[offX+x][offY+y] = oldSpace[offX-y][offY+x]; 
    } 
} 

我假設20是X尺寸和10是Y尺寸。這會圍繞座標(10,5)旋轉10x10塊。請注意,我只在中間旋轉了10x10塊,因爲這是兩個空間之間的重疊。也許你正在將[20] [10]陣列複製到[10] [20]陣列,並且在這種情況下,您可以增加y的範圍,使其從-10運行到9.

編輯:如果你有一個不同形狀的輸出數組,那麼你也需要一組不同的偏移量,因爲(10,5)將不再位於中心。但你應該能夠弄清楚這一點。