⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 活动方块与建筑体关系.java

📁 为移动电话写的俄罗斯方块游戏,没什么特别的,模块化设计是本程序的特色,也是我至今保留着它的原因,当时让我兴奋不已,得益于模块化设计,该程序的编写和改动都非常快捷,我只用了几个小时就完成编写和后期改动,
💻 JAVA
字号:
//package 方块;
/**
活动方块与建筑体关系.java
功能:处理活动方块与建筑体之间的位置关系,如:是否允许下移,是否允许形变等等
@author Joedan hongguangming@sohu.com
*/
class 活动方块与建筑体关系
{
	private 建筑体 建筑;//建筑体对象的引用
	private 活动方块 当前方块;//活动方块对象的引用

	public 活动方块与建筑体关系(活动方块 当前方块, 建筑体 建筑)
	{
		this.建筑 = 建筑;
		this.当前方块 = 当前方块;
	}//方块()
	/**
	算法说明:方块当前坐标为(x, y)
		for (int i = 0; i <= 最大行列编号; i++)//遍历方块所有行
			if (获取某行最左非空位(i) != -1)//如果方块在该行有数据
				//判断该行在建筑体中对应位置的左边是否为空,如不为空就不能左移
				if (面板(x + i, y + 获取某行最左非空位(i) - 1)不为空)
					该行不允许左移;//某一行不允许左移,整个方块就不能左移
		所有行都允许左移所以允许左移;
	*/
	public boolean 允许左移()
	{
		for (int i = 0; i < 方块.方块高度; i++)//遍历方块所有行
		{
			int 最左非空位 = 获取某行最左非空位(i);
			if (最左非空位 != -1)//如果方块在该行有数据
				//判断该行在建筑体中对应位置的左边是否为空,如不为空就不能左移
				if (建筑.取得位置状态(当前方块.取得y坐标() + i, 当前方块.取得x坐标() + 最左非空位 - 1) ||
				    当前方块.取得x坐标() == 0)//方块已到左边沿也不允许左移
					return false;
		}
		return true;//所有行都允许左移所以允许左移
	}//
	/**
	算法说明:参考允许左移()的算法说明
	*/
	public boolean 允许右移()
	{
		for (int i = 0; i < 方块.方块高度; i++)//遍历方块所有行
		{
			int 最右非空位 = 获取某行最右非空位(i);
			if (最右非空位 != -1)//如果方块在该行有数据
				//判断该行在建筑体中对应位置的右边是否为空,如不为空就不能右移
				if (建筑.取得位置状态(当前方块.取得y坐标() + i, 当前方块.取得x坐标() + 最右非空位 + 1) ||
				    当前方块.取得x坐标() + 最右非空位 == 建筑体.建筑物宽 - 1)//方块已到左边沿也不允许左移
					return false;
		}
		return true;//所有行都允许左移所以允许左移
	}//
	/**
	算法说明:参考允许左移()的算法说明
	*/
	public boolean 允许下移()
	{
		for (int i = 0; i < 方块.方块长度; i++)//遍历方块所有列
		{
			int 最下非空位 = 获取某列最下非空位(i);
			if (最下非空位 != -1)//如果方块在该列有数据
				//判断该列在建筑体中对应位置的下边是否为空,如不为空就不能下移
				if (建筑.取得位置状态(当前方块.取得y坐标() + 最下非空位 + 1, 当前方块.取得x坐标() + i) ||
				    当前方块.取得y坐标() + 最下非空位 == 建筑体.建筑物长 - 1)//方块已到下边沿也不允许下移
					return false;
		}
		return true;//所有列都允许下移所以允许下移
	}//
	/**
	算法说明:
	n = 行/列的最远非空位
	当建筑体中以当前方块的坐标为左上角的n*n矩阵都为空时,返回true
	*/
	public boolean 允许变形()
	{
		int n = 0;
		for (int i = 0; i < 方块.方块高度; i++)//遍历方块所有行
		{
			int 最右非空位 = 获取某行最右非空位(i);
			if (最右非空位 > n)
				n = 最右非空位;
		}
		for (int i = 0; i < 方块.方块长度; i++)//遍历方块所有列
		{
			int 最下非空位 = 获取某列最下非空位(i);
			if (最下非空位 > n)
				n = 最下非空位;
		}
		//n = 行/列的最远非空位
		//当建筑体中以当前方块的坐标为左上角的n*n矩阵不都为空时,返回false
		for (int i = 0; i <= n; i++)
			for (int j = 0; j <= n; j++)
				if (建筑.取得位置状态(当前方块.取得y坐标() + i, 当前方块.取得x坐标() + j))
					return false;
		//当旋转区域超出建筑体时也不能变形
		if (当前方块.取得x坐标() + n > 建筑体.建筑物宽 - 1 ||
		    当前方块.取得y坐标() + n > 建筑体.建筑物长 - 1)
			return false;
		return true;
	}//
	/**
	算法说明:
		建筑体中有下一方块的生成-空间时,返回false
	*/
	public boolean 结束了吗()
	{
		//获取当前方块的形状数据
		二维布尔型数组 形状数据 = 当前方块.取得当前形状序列();
		//遍历整个方块,对有块的位置判断建筑体中相应位置是否可用
		for (int i = 0; i < 方块.方块高度; i++)
			for (int j = 0; j < 方块.方块长度; j++)
				//如果需要画当前方块的块的位置,建筑体不为空,就不能画入新方块,游戏结束
				if (形状数据.取得元素(i, j) && 
				    建筑.取得位置状态(i, 当前方块.取得x坐标() + j))
					return true;
		return false;
	}//结束了吗()
	/**
	前提条件:当前方块存在;行编号合法
	操作结果:返回行编号的行中最左边的非空块位置,全为空时返回-1
	算法说明:
		遍历该行所有列,不为空时返回位置
	*/
	private int 获取某行最左非空位(int 行编号)
	{
		//获取当前方块的形状数据
		二维布尔型数组 形状数据 = 当前方块.取得当前形状序列();
		for (int i = 0; i < 方块.方块长度; i++)//遍历该行所有列
			if (形状数据.取得元素(行编号, i))//不为空时返回位置
				return i;
		return -1;//该列所有列都没有数据,该行没有数据
	}//
	private int 获取某行最右非空位(int 行编号)
	{
		//获取当前方块的形状数据
		二维布尔型数组 形状数据 = 当前方块.取得当前形状序列();
		for (int i = 方块.方块长度 - 1; i >= 0; i--)//遍历该行所有列
			if (形状数据.取得元素(行编号, i))//不为空时返回位置
				return i;
		return -1;//该列所有列都没有数据,该行没有数据
	}//
	private int 获取某列最下非空位(int 列编号)
	{
		//获取当前方块的形状数据
		二维布尔型数组 形状数据 = 当前方块.取得当前形状序列();
		for (int i = 方块.方块高度 - 1; i >= 0; i--)//遍历该行所有行
			if (形状数据.取得元素(i, 列编号))//不为空时返回位置
				return i;
		return -1;//该列所有行都没有数据,该列没有数据
	}//
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -