我正在製作一個類似於着名遊戲「俄羅斯方塊」的程序,並且在旋轉塊時遇到了一些問題。2D陣列中的旋轉塊
我知道你可以通過使用「x = -y」和「y = x」在座標系中旋轉數字,但問題是因爲我使用整數數組來表示塊非常困難。
我的數組是這樣的:
int[][] space = new int[20][10];
如果座標包含一個塊的值是1,否則是0。
所以,我怎麼可以旋轉在空間中的塊沒有得到麻煩負號碼?
我正在製作一個類似於着名遊戲「俄羅斯方塊」的程序,並且在旋轉塊時遇到了一些問題。2D陣列中的旋轉塊
我知道你可以通過使用「x = -y」和「y = x」在座標系中旋轉數字,但問題是因爲我使用整數數組來表示塊非常困難。
我的數組是這樣的:
int[][] space = new int[20][10];
如果座標包含一個塊的值是1,否則是0。
所以,我怎麼可以旋轉在空間中的塊沒有得到麻煩負號碼?
這裏是一個樣片(重用你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
如果我正確地理解了這一點,可以通過將固定偏移量應用於座標來實現。偏移量是要旋轉的中心。
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)將不再位於中心。但你應該能夠弄清楚這一點。
如果值爲0或1,爲什麼不使用布爾值? – Hedja 2012-02-22 23:50:39
找出問題的最佳方法是,如果您拿起一支鉛筆和一張紙,並在其中繪製一個網格和一個形狀,然後觀察旋轉它時發生了什麼。我知道這不是一個答案,而是相信我,你會從這個方面學到更多東西。 – biziclop 2012-02-22 23:51:19
由於您使用的是二維數組,因此我認爲您可以更方便地使用方矩陣來達到此目的。這是因爲,在矩形矩陣中,如果需要旋轉,您將不會遇到交換行/列大小的問題。 – noMAD 2012-02-22 23:51:22