2013-05-02 79 views
-2

這裏是一個演示圖像:最好的算法,模擬塊掉落

enter image description here

有與它的一些隨機的紅色塊8×8塊。當用戶選擇它們時,它們上面的所有塊都會掉落。我想找到一個最簡單的方法來模擬這種複雜性。

for (int i = 0; i < 8; i++) 
    for (int j = 0; j < 8; j++) { 
    if (currentBlock == blank) { 
     while((currentBlock.pos.x - 8) >= 0) { 
      aboveBlock = (currentBlock.pos.x - 8); 
      replace(currentBlock,aboveBlock); 
     } 
    } 

但我認爲這不是一個完美的算法。誰能幫我?請。非常感謝你。

+0

請添加相關語言,因爲答案可能依賴於他們。 – 2013-05-02 08:52:40

+0

@Koushik那麼,他正在尋找一種通用算法,僅此而已。他可以很容易地將其翻譯成他選擇的語言。如果一個答案使用了一種他不懂的語言,或者其概念沒有轉化爲他選擇的語言,那麼這將是縮小搜索範圍的時候。順便問一下,你確定這是* C *,does * C *是否允許在循環頭文件中使用變量聲明(可能不確定)? – 2013-05-02 11:00:44

+0

@ChristianRau是c99及以上允許這種聲明。這就是爲什麼我這麼問他(以爲他可能用同樣的語言)。以及C++也是一個匹配(不知道Java),並且每個人都有可能獲得更好的解決方案,所以爲什麼建議,也有更多的人可以訪問這個問題。但你是對的,他要求一個算法。如果他覺得沒有必要,我會去掉標籤。 – 2013-05-02 12:37:07

回答

0

如果您可以繼續移除所有塊的位置,則可以避免遍歷所有遊戲區域以找到需要放置的位置。

此外,您可以實現一個遞歸方法,該方法調用自己的位置直到它碰到頂端。

//Called on an empty block 
Drop(int x, int y) { 
    if (y > 0) { 
     aboveBlock = (currentBlock.pos.x - 8) 
     replace(currentBlock,aboveBlock); 
     Drop(x,y-1); 
    } 
} 

只需撥打玩家清除最底部possitions Drop()移動

0

1)低水平的做法用盡可能少動地?
保留一個讀指針和一個寫指針。僅當存在空白元素時纔將數據從讀取移動到寫入。 (如果需要,反轉索引[y] [x] vs [x] [y]的順序)。

Y = 0; // index for reading 
y = 0; // index for writing 
while (Y < height) { 
    if (block[x][Y] == blank) { Y++; continue; } 
    if (Y > y) block[x][y] = block[x][Y]; 
    Y++; y++; 
} 
// At this point the source ptr/index 'y' can lag behind -- clear the rest 
while (y < height) block[x][y++] = blank; 

1b)中,這可以通過保持跟蹤的最小索引的刪除數據塊的「Y」的和/或跳過uneffected列來提高比特。

2)高級方法:用qsort對每列進行排序。