2013-05-02 78 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对每列进行排序。