首先我们先贴上代码
bool checkErasing(TetrisManager *manager, TetrisControl *control)
{
char count = 0;
char k = 0, y = manager->y + 3; // 从下往上检测
do {
if (y < ROW_END && manager->pool[y] == 0xFFFFU) // 有效区域内且一行已填满
{
++count;
// 消除一行方块
memmove(manager->pool + 1, manager->pool, sizeof(unsigned short) * y);
}
else
{
--y;
++k;
}
} while (y >= manager->y && k < 4);
manager->erasedTotal += count; // 消行总数
manager->score += (1*count);
if (count > 0)
{
++manager->erasedCount[count - 1]; // 消行
}
giveTetris(manager); // 给下一个方块
return (count > 0);
}
主要实现的难点在于我们如何判断游戏池中是否为满行,其实就是判断每个格子是否为F,然后对其清除,下面是清除函数
void removeTetris(TetrisManager *manager)
{
// 当前方块
unsigned short tetris = gs_uTetrisTable[manager->type[0]][manager->orientation[0]];
// 当前方块每4位取出,按位取反后位与到游戏池相应位置,即完成移除方块
manager->pool[manager->y + 0] &=
~(((tetris >> 0x0) & 0x000F) << manager->x);
manager->pool[manager->y + 1] &=
~(((tetris >> 0x4) & 0x000F) << manager->x);
manager->pool[manager->y + 2] &=
~(((tetris >> 0x8) & 0x000F) << manager->x);
manager->pool[manager->y + 3] &=
~(((tetris >> 0xC) & 0x000F) << manager->x);
}
对每个位置进行&清除,由于我们俄罗斯方块是4x4,所以要继续4位往上移。
以下是俄罗斯方块游戏工程的连接:
3218

被折叠的 条评论
为什么被折叠?



