`
桔红糕
  • 浏览: 41397 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

俄罗斯方块(十)处理边界

    博客分类:
  • CPP
阅读更多

当俄罗斯方块移动的时候,需要判断边界,来确定是不是可以移动。

判断边界有两个因素要考虑: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_处理游戏边界问题。。。。。。。

    传智播客_俄罗斯方块游戏09_处理游戏边界问题

    传智播客_俄罗斯方块游戏09_处理游戏边界问题.rar 传智播客_俄罗斯方块游戏09_处理游戏边界问题.rar 传智播客_俄罗斯方块游戏09_处理游戏边界问题.rar

    传智播客_俄罗斯方块游戏程序与API包

    编写Controler类与实现图形定时下落的事件监听 06_编写对各个类进行测试的程序代码 07_图形的数据结构设计与图形的创建 08_完成图形的移动与显示 09_处理图形碰到游戏区边界的问题 10_将图形变成障碍...

    俄罗斯方块源代码

    编写俄罗斯方块游戏中的各个类的主体框架性代码 编写Controler类与实现图形定时下落的事件监听 编写对各个类进行测试的程序代码 图形的数据结构设计与图形的创建 完成图形的移动与显示 处理图形碰到游戏区边界的问题...

    传智播客_俄罗斯方块游戏02_面向对象设计

    俄罗斯方块游戏开发视频包括13小节: 01_游戏功能演示与说明 02_游戏中的面向对象分析与设计 03_使用传智播客提供的API类组装俄罗斯方块游戏 04_编写俄罗斯方块游戏中的各个类的主体框架性代码 ...

    C#俄罗斯方块程序设计与简单实现

    C#俄罗斯方块程序设计与简单实现 效果演示:https://www.cnblogs.com/JiYF/p/9632821.html可以到这里查看效果,当然有部分bug还需要解决 相信90后或者80后都玩过这款小游戏,一直想干一票,琢磨一下,但又不太懂,...

    俄罗斯方块游戏(学习测试版)

    设计Brick类:没有组合方块,都是一个方块作为一个对象处理。 类功能: 接口函数: 1.加载方块位图 2.在坐标(x,y)显示方块的不同类型 3.设定方块水平与垂直方向的运动速度 4.顺时针旋转函数 5.检测某一行是否已经...

    Java代码实现俄罗斯方块(简单版)

    Java代码实现俄罗斯方块(简单版),实现思路: 1、生成游戏窗口与面板: 创建一个基于Swing的程序包含一个画布或面板作为游戏的主要区域,用于绘制方块和游戏背景。设置适当的大小和布局,确保游戏窗口可调整大小,...

    Tetris:一个简单易用的俄罗斯方块模块

    一个简单易用的俄罗斯方块模块 在Windows控制台上运行: MSP430 Launchpad + PuTTY(超级终端也可, 波特率115200, MCU工作于16MHz): 注: 通迅波特率为115200, lanuchpad自带的USB转串口波特率达不到, 为了保证通迅正常...

    基于C语言实现的一个简单易用的俄罗斯方块游戏【100012272】

    游戏运行的相关逻辑如新方块产生, 地图维护, 边界检测等全部都被封装在模块内部, 使用回调函数与外部交互. 你所要做的, 就是自己编写UI与按键处理还有分数计算相关函数, 然后在模块初始化时注册模块所需要的回调函数...

    基于Pierre Dellacherie算法实现俄罗斯方块的人工智能.zip

    人工智能的发展不断改变着我们的生活方式,从工作场景到日常生活,智能化正以前所未有的方式提升生产力、便捷性和生活质量,同时也在挑战伦理边界与社会规则,促使我们重新审视人与技术的关系及其长远影响。

    matlab大津法二值化代码-EE586:EE586

    游戏部分:用非常简单的AI获得了俄罗斯方块游戏的Matlab代码。 尝试设计一种新的AI并弄清游戏的核心功能。 第八周: 目标:实现RGB2YCrCb,YCrCb2RGB,并在计算机屏幕和投影仪上显示720 * 480图像。 在AI中添加第二...

    java自学之道

    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 网络主机线程...

Global site tag (gtag.js) - Google Analytics