在Proteus软件仿真STM32F103寄存器玩俄罗斯方块之第四篇

这篇文章主要是代码分享,俄罗斯方块的游戏功能代码部分以及简单解析。
对代码哪里不理解的,欢迎找我讨论哈。
和上篇代码结构不一样的地方是多文件和分模块,使得工程更加有条理。

一、游戏小功能的补充

图形运动部分在上一篇文章中已经讲解完了,让我们通过这篇文章把剩于的部分,补充完毕。

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值