当俄罗斯方块移动的时候,需要判断边界,来确定是不是可以移动。
判断边界有两个因素要考虑:1)是不是超过Panel边线,包括最大值和最小值。2)是不是有障碍块。
因为Panel边线和障碍块都是Panel的属性,也就是Panel的成员变量,所以,我们可以把确定边界的函数写成Panel的成员函数。
bool Panel::isUnavailable(int w, int h)
{
if (w<0 || h<0) return true;
if (w>=getWidth() || h >= getHeight()) return true;
return body[h][w];
}
在每次俄罗斯方块移动的时候我们需要做这几件事:1)确立要移动到的位置。2)判断新的位置是否可用。3)如果可用则用新的位置替代旧的位置。
比如在moveDown的时候我们可以这样写
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);
}
//如果新的位置可用
if (!ifOccupied(newBody))
{
//用新的位置替代旧的位置
for(int i = 0; i < 4; i++)
body[i] = newBody[i];
}
}
而其中判断位置是否可用,则是把body的几个点都用Panel的isUnavailable进行判断
bool Element::ifOccupied(Box * newBody)
{
for(int i = 0; i < 4; i++)
{
if (myPanel->isUnavailable(newBody[i].getX(), newBody[i].getY()))
return true;
}
return false;
}
当然啦,为了使Element类可以调用到Panel的成员函数,Element需要持有Panel的一个指针或引用。
class Element
{
private:
Panel * myPanel;
那什么时候对这个myPanel赋值呢?既然是Panel构造了Element,那可以在Element的构造函数中获取Panel的指针。
Element(Panel * panel):myPanel(panel){}
我们在修改代码的时候,最麻烦的就是修改基类,或者是修改接口。因为基于基类的实现类或者基于接口的实现类都可能需要改变。这里也是一样,一旦Element的构造函数改掉了,那么基于Element的四种形状的构造函数都需要修改。
Bar::Bar(int a,int b, Panel * panel):Element(panel)
{
...
ShapeL::ShapeL(int a,int b, Panel * panel):Element(panel)
{
...
ShapeT::ShapeT(int a,int b, Panel * panel):Element(panel)
{
...
Square::Square(int a,int b, Panel * panel):Element(panel)
{
...
好。现在只要在构造这些ELement的时候,把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);
}
现在,我们类之间的关系是这样的。(红色是这一章节我们增加的关系)
- 大小: 14.4 KB
分享到:
相关推荐
传智播客_俄罗斯方块游戏09_处理游戏边界问题。。。。。。。
传智播客_俄罗斯方块游戏09_处理游戏边界问题.rar 传智播客_俄罗斯方块游戏09_处理游戏边界问题.rar 传智播客_俄罗斯方块游戏09_处理游戏边界问题.rar
编写Controler类与实现图形定时下落的事件监听 06_编写对各个类进行测试的程序代码 07_图形的数据结构设计与图形的创建 08_完成图形的移动与显示 09_处理图形碰到游戏区边界的问题 10_将图形变成障碍...
编写俄罗斯方块游戏中的各个类的主体框架性代码 编写Controler类与实现图形定时下落的事件监听 编写对各个类进行测试的程序代码 图形的数据结构设计与图形的创建 完成图形的移动与显示 处理图形碰到游戏区边界的问题...
俄罗斯方块游戏开发视频包括13小节: 01_游戏功能演示与说明 02_游戏中的面向对象分析与设计 03_使用传智播客提供的API类组装俄罗斯方块游戏 04_编写俄罗斯方块游戏中的各个类的主体框架性代码 ...
C#俄罗斯方块程序设计与简单实现 效果演示:https://www.cnblogs.com/JiYF/p/9632821.html可以到这里查看效果,当然有部分bug还需要解决 相信90后或者80后都玩过这款小游戏,一直想干一票,琢磨一下,但又不太懂,...
设计Brick类:没有组合方块,都是一个方块作为一个对象处理。 类功能: 接口函数: 1.加载方块位图 2.在坐标(x,y)显示方块的不同类型 3.设定方块水平与垂直方向的运动速度 4.顺时针旋转函数 5.检测某一行是否已经...
Java代码实现俄罗斯方块(简单版),实现思路: 1、生成游戏窗口与面板: 创建一个基于Swing的程序包含一个画布或面板作为游戏的主要区域,用于绘制方块和游戏背景。设置适当的大小和布局,确保游戏窗口可调整大小,...
一个简单易用的俄罗斯方块模块 在Windows控制台上运行: MSP430 Launchpad + PuTTY(超级终端也可, 波特率115200, MCU工作于16MHz): 注: 通迅波特率为115200, lanuchpad自带的USB转串口波特率达不到, 为了保证通迅正常...
游戏运行的相关逻辑如新方块产生, 地图维护, 边界检测等全部都被封装在模块内部, 使用回调函数与外部交互. 你所要做的, 就是自己编写UI与按键处理还有分数计算相关函数, 然后在模块初始化时注册模块所需要的回调函数...
人工智能的发展不断改变着我们的生活方式,从工作场景到日常生活,智能化正以前所未有的方式提升生产力、便捷性和生活质量,同时也在挑战伦理边界与社会规则,促使我们重新审视人与技术的关系及其长远影响。
游戏部分:用非常简单的AI获得了俄罗斯方块游戏的Matlab代码。 尝试设计一种新的AI并弄清游戏的核心功能。 第八周: 目标:实现RGB2YCrCb,YCrCb2RGB,并在计算机屏幕和投影仪上显示720 * 480图像。 在AI中添加第二...
6.1 俄罗斯方块 6.2 连连看游戏 6.3 迷宫 6.4 模拟闪电 6.5 扫雷 6.6 贪食蛇 6.7 围棋 6.8 五子棋 6.9 人机猜拳游戏 第三篇 实战篇 第7章 项目开发 7.1 开发自己的浏览器 7.2 开发自己的象棋游戏 7.3 网络主机线程...