`
桔红糕
  • 浏览: 42496 次
  • 性别: 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_处理游戏边界问题

    因此,正确处理边界是避免游戏过早结束的关键。 1. **边界检测**:在游戏设计中,我们需要对每个方块进行边界检测。这意味着在方块移动或旋转时,我们必须检查它是否触碰到游戏区域的边缘或已有方块。一旦发生碰撞...

    LABVIEW做的俄罗斯方块

    《使用LABVIEW构建的俄罗斯方块游戏详解》 在编程世界中,各种工具和语言都有其独特的魅力和应用领域。其中,LABVIEW(Laboratory Virtual Instrument Engineering Workbench)以其图形化编程界面和强大的数据处理...

    Java俄罗斯方块源代码,Java俄罗斯方块源代码

    Java语言实现的俄罗斯方块是一款经典的桌面游戏,它利用了编程的基本概念,如循环、条件判断、对象和类,以及图形用户界面(GUI)的设计。在这个项目中,开发者需要理解以下核心知识点: 1. **Java基础**:Java是...

    C#俄罗斯方块(多国语言完美版)

    总的来说,“C#俄罗斯方块(多国语言完美版)”项目展示了C#在游戏开发中的应用,尤其是对于UI设计和多语言支持的处理。开发者通过巧妙的编程技巧,将一个经典的街机游戏以现代化的方式呈现,既保留了游戏的原有魅力,...

    C++、Win32 API开发的俄罗斯方块

    在俄罗斯方块中,我们需要处理以下主要逻辑: 1. 方块生成:随机生成一个新的方块形状,并将其放置在游戏区的顶部。 2. 方块移动:根据用户输入或时间间隔,使方块沿着屏幕垂直方向自动下落。 3. 方块旋转:允许...

    LABVIEW俄罗斯方块

    《 LABVIEW俄罗斯方块:深入理解与学习指南》 LabVIEW,全称为Laboratory Virtual Instrument Engineering Workbench(实验室虚拟仪器工程工作台),是一款由美国国家仪器(National Instruments, NI)公司开发的...

    俄罗斯方块源代码加详细注释

    俄罗斯方块的源代码通常会包括游戏循环、游戏状态管理、图形渲染、物理模拟(方块下落和旋转)、用户输入处理、分数计算等模块。每一部分都体现了编程设计原则和数据结构的应用。 游戏循环是游戏程序的核心,它负责...

    用API编写的俄罗斯方块

    《用API编写的俄罗斯方块》是一款基于API技术开发的单机版俄罗斯方块游戏,它摒弃了传统的二维表格实现方式,转而利用API(应用程序接口)进行编程,为玩家带来独特的游戏体验。本文将深入探讨这款游戏中涉及到的API...

    C#俄罗斯方块绘图实现方式

    总的来说,实现C#版的俄罗斯方块绘图涉及到理解图形绘制原理、游戏逻辑设计以及用户交互处理等多个方面。通过这个项目,开发者不仅可以提升C#编程技巧,还能深入了解游戏开发的基本流程。文件"GameTest"可能是游戏的...

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

    在本课程“传智播客_俄罗斯方块游戏09_处理游戏边界问题”中,我们将深入探讨如何在编程中解决经典游戏俄罗斯方块的边界处理问题,这是一门基于Java编程语言的教学课程,旨在强化面向对象编程的基础,并为学习更高级...

    C++ EasyX 俄罗斯方块代码

    《C++ EasyX 俄罗斯方块代码》是一个关于利用C++编程语言和EasyX图形库实现经典游戏"俄罗斯方块"的项目。EasyX是一个轻量级的C++图形库,它为C++程序员提供了简单易用的图形绘制功能,使得开发2D游戏或图形界面变得...

    qq表情俄罗斯方块

    《C#实现QQ表情俄罗斯方块游戏详解》 在编程世界中,利用C#语言开发游戏是一种常见的实践,尤其对于初学者来说,它提供了一条理解游戏编程逻辑的良好途径。本项目“qq表情俄罗斯方块”就是这样一个示例,它巧妙地...

    C# 俄罗斯方块 源码 非常好 学习用

    《C#实现的俄罗斯方块程序:源码学习与解析》 俄罗斯方块,这款经典的电子游戏,自1984年诞生以来,一直是程序员学习算法、游戏开发的经典案例。本资源提供了一套使用C#语言实现的俄罗斯方块源码,对于想要深入理解...

    C#写的简单俄罗斯方块游戏

    总结,这个C#实现的俄罗斯方块游戏展示了如何利用C#的数组操作和事件处理机制来实现基本的游戏逻辑。它是一个很好的实践项目,可以帮助开发者提升编程技巧,理解面向对象编程思想,并对游戏开发有初步的认识。无论你...

    用java写的一个俄罗斯方块的游戏

    【Java编程实现俄罗斯方块游戏】 在编程领域,创建一个经典游戏如俄罗斯方块是一种常见的学习实践,可以加深对编程语言特性和面向对象设计的理解。在这个案例中,我们看到一个用Java实现的俄罗斯方块游戏。Java作为...

    Excel 俄罗斯方块小游戏源代码,基于Excel VBA 宏制作的 俄罗斯方块小游戏源码

    Excel中的俄罗斯方块小游戏是利用VBA(Visual Basic for Applications)宏编程实现的,这是一种内置于Microsoft Office套件中的编程语言,允许用户自定义工作表的功能和交互性。本源代码提供了一个完整的实现,让...

    俄罗斯方块程序_51单片机俄罗斯方块游戏仿真_

    《51单片机俄罗斯方块游戏仿真技术详解》 51单片机,作为微控制器领域的经典之作,因其结构简单、易于上手而被广泛应用于各种电子项目中。本项目聚焦于51单片机上的俄罗斯方块游戏仿真,通过深入解析代码和Proteus...

    全新版vue.js俄罗斯方块

    在这个"全新版vue.js俄罗斯方块"项目中,开发者利用Vue.js的强大功能,结合算法,创建了一个完整的俄罗斯方块游戏。让我们深入探讨这个项目中的关键知识点。 1. **Vue.js组件化开发**: - Vue.js的核心理念是组件...

    c++课程设计----俄罗斯方块源码

    总的来说,C++课程设计的俄罗斯方块项目是一个综合性的实践,它涵盖了C++语言基础、MFC应用开发、图形界面设计、游戏逻辑实现、事件处理等多个方面。通过这个项目,开发者不仅可以深入理解C++和MFC,还能提升解决...

    qt写的俄罗斯方块完整代码

    【Qt编写的俄罗斯方块游戏详解】 在编程领域,Qt是一个强大的跨平台应用程序开发框架,由C++编写,广泛应用于GUI(图形用户界面)程序的开发。本项目名为"qt写的俄罗斯方块完整代码",它是一个使用Qt库实现的经典...

Global site tag (gtag.js) - Google Analytics