📄 blockgroup.java
字号:
/******************************************************************
* 超级俄罗斯方块-- 方格组控件(1.0版最多支持4个小方块)
*版本: 1.0
*作者:金永哲
*最后修改日期:2005-9-18
*
*说明:无界面,集中管理一组小方块(Block类),
*当方格组收到移动命令后,向组中小方块转发命令,使组内小
*方块同时移动,或变形
*
******************************************************************/
import java.awt.*;
public class BlockGroup implements Cloneable
{
//方格组位置
private int left;
private int top;
private int right;
private int bottom;
private int type; //方块组类型 1~4
private int subType; //方块组子类型, 根据type决定
private Block[] members = null; //方块成员
//得到方格组最下边的y位置
public int getBottom()
{
return bottom;
}
//构造函数,确定方格组位置=====================================
public BlockGroup(int left, int top, Block[] bs, int type,
int subType) throws BlockException
{
this.left = left;
this.top = top;
allocMembers(bs, type, subType);
}
//为方格组分配成员,即4个小方块===============================
//初始化各成员位置
private void allocMembers(Block[] bs, int type, int subType)
throws BlockException
{
//参数检查:方格组成员个数为 4--------------------------
if(bs.length > 4 || bs.length < 0)
throw new BlockException(BETable.getMessage(0) );
/*方格组类型范围1~4,
*
*方格组子类型:根据方格组类型判断
* 方格组0: 子类型范围 0~3
* 方格组1: 子类型范围 0~1
* 方格组2: 子类型范围 0~1
* 方格组3: 子类型范围 0
* 方格组4: 子类型范围 0~3
*/
members = bs;
this.type = type;
this.subType = subType;
int mw = members[0].getWidth(); //成员方块宽度
//int mh = members[0].getSize().height; //成员方块高度
if(type == 0)
{
if(subType == 0)
{
members[0].setLocation(left, top + mw);
members[1].setLocation(left + mw, top + mw);
members[2].setLocation(left + 2 * mw, top + mw);
members[3].setLocation(left + mw, top);
right = left + 3 * mw;
bottom = top + 2 * mw;
}
else if(subType == 1)
{
members[0].setLocation(left, top);
members[1].setLocation(left, top + mw);
members[2].setLocation(left, top + 2 * mw);
members[3].setLocation(left + mw, top + mw);
right = left + 2 * mw;
bottom = top + 3 * mw;
}
else if(subType == 2)
{
members[0].setLocation(left + 2 * mw, top);
members[1].setLocation(left + mw, top);
members[2].setLocation(left, top);
members[3].setLocation(left + mw, top + mw);
right = left + 3 * mw;
bottom = top + 2 * mw;
}
else if(subType == 3)
{
members[0].setLocation(left + mw, top + 2 * mw);
members[1].setLocation(left + mw, top + mw);
members[2].setLocation(left + mw, top);
members[3].setLocation(left, top + mw);
right = left + 2 * mw;
bottom = top + 3 * mw;
}
else
throw new BlockException(BETable.getMessage(2));
}
else if(type == 1)
{
if(subType == 0)
{
members[0].setLocation(left, top + mw);
members[1].setLocation(left + mw, top + mw);
members[2].setLocation(left + mw, top);
members[3].setLocation(left + 2 * mw, top);
right = left + 3 * mw;
bottom = top + 2 * mw;
}
else if(subType == 1)
{
members[0].setLocation(left, top);
members[1].setLocation(left, top + mw);
members[2].setLocation(left + mw, top + mw);
members[3].setLocation(left + mw, top + 2 * mw);
right = left + 2 * mw;
bottom = top + 3 * mw;
}
else
throw new BlockException(BETable.getMessage(2));
}
else if(type == 2)
{
if(subType == 0)
{
members[0].setLocation(left, top);
members[1].setLocation(left + mw, top);
members[2].setLocation(left + 2 * mw, top);
members[3].setLocation(left + 3 * mw, top);
right = left + 4 * mw;
bottom = top + mw;
}
else if(subType == 1)
{
members[0].setLocation(left, top);
members[1].setLocation(left, top + mw);
members[2].setLocation(left, top + 2 * mw);
members[3].setLocation(left, top + 3 * mw);
right = left + mw;
bottom = top + 4 * mw;
}
else
throw new BlockException(BETable.getMessage(2));
}
else if(type == 3)
{
if(subType == 0)
{
members[0].setLocation(left, top);
members[1].setLocation(left + mw, top);
members[2].setLocation(left, top + mw);
members[3].setLocation(left + mw, top + mw);
right = left + 2 * mw;
bottom = top + 2 * mw;
}
else
throw new BlockException(BETable.getMessage(2));
}
else if(type == 4)
{
if(subType == 0)
{
members[0].setLocation(left, top);
members[1].setLocation(left, top + mw);
members[2].setLocation(left, top + 2*mw);
members[3].setLocation(left + mw, top + 2*mw);
right = left + 2 * mw;
bottom = top + 3 * mw;
}
else if(subType == 1)
{
members[0].setLocation(left + 2 * mw, top);
members[1].setLocation(left + mw, top);
members[2].setLocation(left, top);
members[3].setLocation(left, top + mw);
right = left + 3 * mw;
bottom = top + 2 * mw;
}
else if(subType == 2)
{
members[0].setLocation(left + mw, top + 2 * mw);
members[1].setLocation(left + mw, top + mw);
members[2].setLocation(left + mw, top);
members[3].setLocation(left, top);
right = left + 2 * mw;
bottom = 3 * mw;
}
else if(subType == 3)
{
members[0].setLocation(left, top + mw);
members[1].setLocation(left + mw, top + mw);
members[2].setLocation(left + 2 * mw, top + mw);
members[3].setLocation(left + 2 * mw, top);
right = left + 3 * mw;
bottom = top + 2 * mw;
}
else
throw new BlockException(BETable.getMessage(2));
}
else
throw new BlockException(BETable.getMessage(1));
}
//方格组变形================================================
public void translate() throws BlockException
{
//检查方格成员是否存在
if(members == null)
throw new BlockException(BETable.getMessage(3) );
if(members.length <= 0)
throw new BlockException(BETable.getMessage(3) );
int mw = members[0].getSize().width; //成员方块宽度
if(type == 0)
{
if(subType == 0)
{
members[0].moveRUp(1);
members[2].moveLDown(1);
members[3].moveRDown(1);
left -= mw;
bottom += mw;
subType = 1;
}
else if(subType == 1)
{
members[0].moveRDown(1);
members[2].moveLUp(1);
members[3].moveLDown(1);
left += mw;
top -= mw;
bottom += mw;
subType = 2;
}
else if(subType == 2)
{
members[0].moveLDown(1);
members[2].moveRUp(1);
members[3].moveLUp(1);
top += mw;
right -= mw;
subType = 3;
}
else if(subType == 3)
{
members[0].moveLUp(1);
members[2].moveRDown(1);
members[3].moveRUp(1);
bottom -= mw;
subType = 0;
}
else
throw new BlockException(BETable.getMessage(1));
}
else if(type == 1)
{
if(subType == 0)
{
members[0].moveUp(2);
members[1].moveLUp(1);
members[3].moveLDown(1);
top += mw;
right -= mw;
bottom += mw;
subType = 1;
}
else if(subType == 1)
{
members[0].moveDown(2);
members[1].moveRDown(1);
members[3].moveRUp(1);
top -= mw;
right += mw;
bottom -= mw;
subType = 0;
}
else
throw new BlockException(BETable.getMessage(1));
}
else if(type == 2)
{
if(subType == 0)
{
members[0].moveRUp(1);
members[2].moveLDown(1);
members[3].moveLDown(2);
left -= mw;
top += mw;
right -= mw * 2;
bottom += mw * 2;
subType = 1;
}
else if(subType == 1)
{
members[0].moveLDown(1);
members[2].moveRUp(1);
members[3].moveRUp(2);
left += mw;
top -= mw;
right += mw * 2;
bottom -= mw * 2;
subType = 0;
}
else
throw new BlockException(BETable.getMessage(1));
}
else if(type == 3)
{
}
else if(type == 4)
{
if(subType == 0)
{
members[0].moveRDown(1);
members[0].moveRight(1);
members[1].moveRight(1);
members[2].moveUp(1);
members[3].moveLeft(1);
top += mw;
right += mw;
subType = 1;
}
else if(subType == 1)
{
members[0].moveLDown(1);
members[2].moveRUp(1);
members[3].moveUp(2);
top -= mw;
right -= mw;
subType = 2;
}
else if(subType == 2)
{
members[0].moveLUp(1);
members[2].moveRDown(1);
members[3].moveRight(2);
right += mw;
bottom -= mw;
subType = 3;
}
else if(subType == 3)
{
members[0].moveRUp(1);
members[2].moveLDown(1);
members[3].moveDown(2);
left += mw;
bottom += mw;
subType = 0;
}
else
throw new BlockException(BETable.getMessage(1));
}
else
throw new BlockException(BETable.getMessage(1));
}
//左移方块组=================================================
public void moveLeft() throws BlockException
{
if(members == null)
throw new BlockException(BETable.getMessage(3) );
for(int i=0; i<members.length; i++)
{
members[i].moveLeft(1);
}
left += members[0].getSize().width;
}
//右移方块组=================================================
public void moveRight() throws BlockException
{
if(members == null)
throw new BlockException(BETable.getMessage(3) );
for(int i=0; i<members.length; i++)
{
members[i].moveRight(1);
}
right += members[0].getSize().width;
}
//下移方块组=================================================
public void moveDown(boolean fast) throws BlockException
{
if(members == null)
throw new BlockException(BETable.getMessage(3) );
for(int i=0; i<members.length; i++)
{
if(fast)
members[i].moveDown(2);
else
members[i].moveDown(1);
}
if(fast)
bottom += 2 * members[0].getWidth();
else
bottom += members[0].getWidth();
}
//得到方块组中的某个小方块===================================
public Block get(int i) throws BlockException
{
if(i < 0 || i>= members.length)
throw new BlockException(BETable.getMessage(5) );
return members[i];
}
//得到方格组成员个数==========================================
public int getCount()
{
return members.length;
}
public Object clone() throws CloneNotSupportedException
{
BlockGroup bg = (BlockGroup)super.clone();
Block[] blocks = new Block[members.length];
for(int i=0; i<blocks.length; i++)
{
int w = members[i].getWidth();
int x = members[i].getLocation().x;
int y = members[i].getLocation().y;
Color clr = members[i].getColor();
blocks[i] = new Block(w, clr);
blocks[i].setLocation(x, y);
}
bg.members = blocks;
return bg;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -