这篇文章主要是代码分享,俄罗斯方块的游戏功能代码部分以及简单解析。
对代码哪里不理解的,欢迎找我讨论哈。
和上篇代码结构不一样的地方是多文件和分模块,使得工程更加有条理。
目录
一、游戏小功能的补充
图形运动部分在上一篇文章中已经讲解完了,让我们通过这篇文章把剩于的部分,补充完毕。
1.满行的检测与消除
通过操纵图形运动,我们很快就能某一行给填满了。根据游戏规则,这个时候我们是需要把这一行给消除掉,然后把上边累积的小方块整体向下挪一行。
那么首先我们要做的就是先找到需要消除的这一行。根据之前的思路,直接在去读这一行有没有空的位置就行了。先就这么干吧。
void fun(void)
{
uint8_t temp = 0;
for(uint8_t Line = 0;Line < GameHight;Line)
{
for(uint32_t i = 0;i < GameWidth;i ++)
{
temp += Game_SquareRead((Game_PointTypedef){
i,Line});
}
if(temp == GameWidth){
}//这里检测到了某一行是被小方块填满的
}
}
等等,怎么感觉还是有些不对呢?按照正常逻辑就是从第一行开始检测啊,可这个游戏如果在正常情况下,即使有些结束了,第一行也不会检测到是满的呀,所以应该从下往上检测,应该跟符合玩家的感受,改起来。
void Game_FullLineCheckAndMoveDown(void)
{
uint8_t temp,Line = GameHight - 1;
do{
temp = 0;
for(uint32_t i = 0;i < GameWidth;i ++)
{
temp += Game_SquareRead((Game_PointTypedef){
i,Line});
}
if(temp == GameWidth)//清除这一行,并把上方的图像往下挪一行
{
}
else
{
Line --;
}
}while(temp != 0);
}
到这里我们确实检测到了满行,接下来就是消除这一行,并把上边所有的图像都往下挪一行。
我这都往下挪了,是不是说上边的一行就把这行覆盖掉了,那也就是说,消除这个动作就是可以不要了。
开干!直接在上边哪个函数里补充就完了。
void Game_FullLineCheckAndMoveDown(void)
{
uint8_t temp,Line = GameHight - 1;
do{
temp = 0;
for(uint32_t i = 0;i < GameWidth;i ++)
{
temp += Game_SquareRead((Game_PointTypedef){
i,Line});
}
if(temp == GameWidth)