最后,我们来处理一下游戏结束。
先在Panel中增加一个游戏结束标志
class Panel : public CWnd
{
private:
bool gameover;
构造函数的时候设定他为true;
Panel::Panel()
{
...
gameover = true;
}
游戏开始时,设定他为false;
void Panel::start()
{
....
gameover = false;
然后游戏开始正常运行。那什么时候游戏结束呢?看上去应该是障碍块累计到Panel的顶上。再仔细一想,应该是没有办法再增加新的方块的时候,游戏就结束了。
这样,我们需要在新的方块产生的时候,查看一下是否可以产生,也就是产生的方块是不是到边际或者遇到障碍块了。如果是这样则游戏结束。
void Panel::randomCreate()
{
srand(time(NULL));
int i = rand() % 4;
if(i == 0)
element = new Bar(getWidth()/2,0, this);
if(i == 1)
element = new Square(getWidth()/2,0, this);
if(i == 2)
element = new ShapeL(getWidth()/2,0, this);
if(i == 3)
element = new ShapeT(getWidth()/2,0, this);
if (element->ifOccupied(element->body))
{
gameover =true;
KillTimer(ID_TIMER);
}
}
注意这里除了设置gameover标志外,还使用KillTimer系统函数关闭计数器。既然游戏结束了,我们确实没有必要每0.1秒运行俄罗斯方块往下掉一格的事情了。
好吧,让我们从Panel上可视的了解到游戏结束了。游戏结束时,我们简单的在界面上显示Gameover字样好了。
void Panel::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
this->GetClientRect(rect);
CBrush brushbg( RGB(125,125,125) );
if(gameover)
{
CString str("game over");
dc.DrawText( str,rect, DT_CENTER);
}
else
{
...
现在运行一下,我们应该可以看到一个相对完整的俄罗斯方块了。俄罗斯方块的C++演示也就到这章结束了。希望大家能够顺利完成自己的俄罗斯方块,并增加自己的内容。取得好分数。