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

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

    博客分类:
  • CPP
 
阅读更多

上次我们解决了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

 

分享到:
评论

相关推荐

    俄罗斯方块游戏09_处理游戏边界问题

    在开发俄罗斯方块游戏中,处理游戏边界问题是至关重要的一步,这直接影响到游戏的稳定性和玩家体验。本节我们将深入探讨如何在毕业设计中解决这个问题。 首先,了解游戏的基本原理是必要的。俄罗斯方块是一个经典的...

    python基于pygame的俄罗斯方块小游戏源码.zip

    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#顶下俄罗斯方块 c#俄罗斯方块 c#俄罗斯方块 c#

    LABVIEW做的俄罗斯方块

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

    俄罗斯方块C++源代码

    在编程领域,经典游戏俄罗斯方块是一个极好的学习案例,它涉及到了基础的图形界面设计、事件处理、数据结构和算法等多个知识点。本篇文章将对“俄罗斯方块C++源代码”进行深入剖析,帮助读者理解并学习其中的关键...

    C#俄罗斯方块(winform)

    C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)

    MFC编写的俄罗斯方块

    在构建俄罗斯方块游戏中,MFC提供了一系列基础类,如CWinApp、CWnd、CDialog等,用于处理窗口创建、消息循环、事件处理等任务。开发者通过继承这些类并重写相应的方法,可以实现游戏的主循环、窗口事件响应等功能。 ...

    java编的俄罗斯方块

    好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏java编的俄罗斯方块好游戏...

    基于强化学习的AI俄罗斯方块

    基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI俄罗斯方块基于强化学习的AI...

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

    7. **碰撞检测**:当方块移动或旋转时,需要检查是否与其他方块或游戏边界发生碰撞,这涉及到坐标系统的理解和简单的数学计算。 8. **状态机**:游戏有多种状态(如游戏开始、暂停、游戏结束),开发者需要设计一个...

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

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

    VC可视化俄罗斯方块源码

    俄罗斯方块是我大学一年级刚学VC++时的课程设计,当时的课程设计有三种,单文档、多文档和俄罗斯方块。我选择俄罗斯方块,就是因为它是游戏。 之前我是玩过俄罗斯方块的,一种是单人的(单人版),一种是两人对战的...

    java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+数据库+讲解视频).zip

    java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——俄罗斯方块项目(论文+答辩PPT+源代码+...

    PSP俄罗斯方块.iso

    PSP俄罗斯方块.iso

    flash俄罗斯方块源代码

    《深入解析Flash俄罗斯方块源代码》 在游戏开发领域,经典的俄罗斯方块以其独特的玩法和无尽的挑战性,始终吸引着众多开发者去实现。本篇将详细探讨一款使用Flash技术编写的俄罗斯方块源代码,帮助你理解并学习...

    俄罗斯方块游戏-JAVA实现(含双人联机对战).zip

    俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块...

    SCRATCH版3D俄罗斯方块

    使用SCRATCH开发的3D版俄罗斯方块

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

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

Global site tag (gtag.js) - Google Analytics