📄 活动方块与建筑体关系.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 + -