俄罗斯方块(十三)销行

方块沉底后,如果能整齐的垒满一整行,则这行就可以被消除。

 

那我们把销行的代码写在哪里呢?我想应该在每次加上障碍块的时候看看是不是满行了。

void Panel::ElementDead()
{
	for (int i=0; i<4; i++)
	{
		body[element->body[i].getY()][element->body[i].getX()] = true;
	}
	delete (element);

	//销行

	randomCreate();
}

 

好吧,那我们开始销行。由于我们用的是stl的容器类vector,所以可以用标准的STL算法remove,只要在最后一个函数指明要消除的行是所有点都是true,也就是布满障碍块的行。

vector<vector<bool>>::reverse_iterator end = remove(body.rbegin(), body.rend(), vector<bool>(getWidth(), true));

 

为什么要用reverse_iterator呢?因为remove会把原有内容除去指定内容后"收缩"起来,拷贝在指定iterator头的地方。而俄罗斯方块要求的是往下“收缩”,也就是消除行的下方是不动的,上方的行下沉。所以我们希望remove能反向操作,也就是用reverse_iterator来实现。

 

消除行后,空出来的行我们还是要填成空的

fill(end, body.rend(), vector<bool>(getWidth(), false));

 

这样销行就完成了。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值