上次我们解决了moveDown的边界处理。这次我们可以依样画葫芦,把moveLeft,moveRight的边界处理都完成。
每次边界处理也同样是3步:1)确定新的位置。2)查看新位置是否可行。3)如果可行,把新的位置替代旧的位置。
void Element::moveLeft()
{
Box newBody[4];
for (int i=0; i<4; i++)
{
newBody[i].setX(body[i].getX()-1);
newBody[i].setY(body[i].getY());
}
if (!ifOccupied(newBody))
copyBody(newBody);
}
void Element::moveRight()
{
Box newBody[4];
for (int i=0; i<4; i++)
{
newBody[i].setX(body[i].getX()+1);
newBody[i].setY(body[i].getY());
}
if (!ifOccupied(newBody))
copyBody(newBody);
}
最后,还要进行边界判断的还有旋转。如果旋转出了边界,或者遇到了障碍块,那得阻止旋转。
和其他不同的是,左移右移,下落是每种方块行为都一致,所以在父类Element中实现。而旋转时不同形状的方块行为不同,所以旋转是在子类中实现的。现在为了加上边界处理,我们不得不在每个子类的旋转实现中都进行修改。比如在Bar的旋转我们修改如下:
void Bar::rotate()
{
//确定新的位置
Box newBody[4];
if(body[0].getX() == body[1].getX())
{
newBody[0].setX(body[0].getX() + 2);
newBody[0].setY(body[0].getY() + 2);
newBody[1].setX(body[1].getX() + 1);
newBody[1].setY(body[1].getY() + 1);
newBody[3].setX(body[3].getX() - 1);
newBody[3].setY(body[3].getY() - 1);
newBody[2]=body[2];
}
else
{
newBody[0].setX(body[0].getX() - 2);
newBody[0].setY(body[0].getY() - 2);
newBody[1].setX(body[1].getX() - 1);
newBody[1].setY(body[1].getY() - 1);
newBody[3].setX(body[3].getX() + 1);
newBody[3].setY(body[3].getY() + 1);
newBody[2]=body[2];
}
//如果新的位置可行
if (!ifOccupied(newBody))
//用新的位置代替旧的位置
copyBody(newBody);
}
鉴于篇幅,其他几种形状的旋转代码就省略了。
到现在为止,我们已经写了很多遍相同代码
if (!ifOccupied(newBody))
//用新的位置代替旧的位置
copyBody(newBody);
虽然只有两行代码,但是出现了那么多次,我们还是可以把他重构成一个单独的函数
bool Element::move(Box * newBody)
{
bool flag = ifOccupied(newBody);
if (!flag)
//用新的位置代替旧的位置
copyBody(newBody);
return !flag;
}
这样无论在父类的移动或下降函数,或者子类的旋转中,我们只需要关心移动或旋转的规则,然后调用move函数就可以了。
void Element::moveDown()
{
Box newBody[4];
for (int i=0; i<4; i++)
{
newBody[i].setX(body[i].getX());
newBody[i].setY(body[i].getY()+1);
}
move(newBody);
}
void Element::moveLeft()
{
Box newBody[4];
for (int i=0; i<4; i++)
{
newBody[i].setX(body[i].getX()-1);
newBody[i].setY(body[i].getY());
}
move(newBody);
}
void Element::moveRight()
{
Box newBody[4];
for (int i=0; i<4; i++)
{
newBody[i].setX(body[i].getX()+1);
newBody[i].setY(body[i].getY());
}
move(newBody);
}
void Bar::rotate()
{
Box newBody[4];
if(body[0].getX() == body[1].getX())
{
newBody[0].setX(body[0].getX() + 2);
newBody[0].setY(body[0].getY() + 2);
newBody[1].setX(body[1].getX() + 1);
newBody[1].setY(body[1].getY() + 1);
newBody[3].setX(body[3].getX() - 1);
newBody[3].setY(body[3].getY() - 1);
newBody[2]=body[2];
}
else
{
newBody[0].setX(body[0].getX() - 2);
newBody[0].setY(body[0].getY() - 2);
newBody[1].setX(body[1].getX() - 1);
newBody[1].setY(body[1].getY() - 1);
newBody[3].setX(body[3].getX() + 1);
newBody[3].setY(body[3].getY() + 1);
newBody[2]=body[2];
}
move(newBody);
}
这样我们的边界处理算是圆满完成了。最后还要提醒一句,为了让move函数可以被子类调用,而不被其他类使用,move函数必须声明成protected
分享到:
相关推荐
在开发俄罗斯方块游戏中,处理游戏边界问题是至关重要的一步,这直接影响到游戏的稳定性和玩家体验。本节我们将深入探讨如何在毕业设计中解决这个问题。 首先,了解游戏的基本原理是必要的。俄罗斯方块是一个经典的...
python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。...
【俄罗斯方块(C语言版) 俄罗斯方块】是一个基于C语言实现的经典游戏项目,它将编程技术与游戏设计巧妙结合,展示了C语言在创建交互式程序方面的潜力。在这个项目中,开发者利用C语言的基本结构,如循环、条件语句...
c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言...
顶下俄罗斯方块 c#俄罗斯方块 c#俄罗斯方块 c#顶下俄罗斯方块 c#俄罗斯方块 c#俄罗斯方块 c#顶下俄罗斯方块 c#俄罗斯方块 c#俄罗斯方块 c#顶下俄罗斯方块 c#俄罗斯方块 c#俄罗斯方块 c#
《使用LABVIEW构建的俄罗斯方块游戏详解》 在编程世界中,各种工具和语言都有其独特的魅力和应用领域。其中,LABVIEW(Laboratory Virtual Instrument Engineering Workbench)以其图形化编程界面和强大的数据处理...
在编程领域,经典游戏俄罗斯方块是一个极好的学习案例,它涉及到了基础的图形界面设计、事件处理、数据结构和算法等多个知识点。本篇文章将对“俄罗斯方块C++源代码”进行深入剖析,帮助读者理解并学习其中的关键...
C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)
在构建俄罗斯方块游戏中,MFC提供了一系列基础类,如CWinApp、CWnd、CDialog等,用于处理窗口创建、消息循环、事件处理等任务。开发者通过继承这些类并重写相应的方法,可以实现游戏的主循环、窗口事件响应等功能。 ...
好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏...
基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI...
7. **碰撞检测**:当方块移动或旋转时,需要检查是否与其他方块或游戏边界发生碰撞,这涉及到坐标系统的理解和简单的数学计算。 8. **状态机**:游戏有多种状态(如游戏开始、暂停、游戏结束),开发者需要设计一个...
总的来说,“C#俄罗斯方块(多国语言完美版)”项目展示了C#在游戏开发中的应用,尤其是对于UI设计和多语言支持的处理。开发者通过巧妙的编程技巧,将一个经典的街机游戏以现代化的方式呈现,既保留了游戏的原有魅力,...
俄罗斯方块是我大学一年级刚学VC++时的课程设计,当时的课程设计有三种,单文档、多文档和俄罗斯方块。我选择俄罗斯方块,就是因为它是游戏。 之前我是玩过俄罗斯方块的,一种是单人的(单人版),一种是两人对战的...
java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+...
《深入解析Flash俄罗斯方块源代码》 在游戏开发领域,经典的俄罗斯方块以其独特的玩法和无尽的挑战性,始终吸引着众多开发者去实现。本篇将详细探讨一款使用Flash技术编写的俄罗斯方块源代码,帮助你理解并学习...
俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块...
使用SCRATCH开发的3D版俄罗斯方块
在俄罗斯方块中,我们需要处理以下主要逻辑: 1. 方块生成:随机生成一个新的方块形状,并将其放置在游戏区的顶部。 2. 方块移动:根据用户输入或时间间隔,使方块沿着屏幕垂直方向自动下落。 3. 方块旋转:允许...
《基于FPGA的Verilog实现俄罗斯方块游戏详解》 在现代数字系统设计中,FPGA(Field-Programmable Gate Array)因其可重构性和高速处理能力被广泛应用。结合高级硬件描述语言如Verilog,我们可以实现复杂的功能,...