|
|
|
@ -0,0 +1,305 @@
|
|
|
|
|
package model;
|
|
|
|
|
|
|
|
|
|
import java.util.TimerTask;
|
|
|
|
|
import java.util.Timer;
|
|
|
|
|
|
|
|
|
|
import util.Constant;
|
|
|
|
|
import view.GameCanvas;
|
|
|
|
|
import view.MyFrame;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 由 4 * 4 个方格(Box)构成一个块, 控制块的移动、下落、变形等
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
public class Block {
|
|
|
|
|
|
|
|
|
|
private GameCanvas gc;//画布
|
|
|
|
|
private Box[][] boxs = new Box[4][4];
|
|
|
|
|
// public static int[][] yinying=new int[4][4];
|
|
|
|
|
public int y, x;
|
|
|
|
|
public int style;
|
|
|
|
|
public int newH = 0;
|
|
|
|
|
public int newL = 0;
|
|
|
|
|
private static int st = 7;//默认属于初级
|
|
|
|
|
public boolean isAlive = false;//判断方块是否存活
|
|
|
|
|
public boolean pausing = false;//暂停为假
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置方块数量
|
|
|
|
|
*/
|
|
|
|
|
public static void set_addl(int a) {
|
|
|
|
|
Block.st = a;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取方块数量
|
|
|
|
|
*/
|
|
|
|
|
public static int get_addl() {
|
|
|
|
|
return st;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 空构造函数
|
|
|
|
|
*/
|
|
|
|
|
public Block() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构造函数,产生一个特定的块
|
|
|
|
|
*
|
|
|
|
|
* @param style
|
|
|
|
|
* 块的样式,对应STYLES的28个值中的一个
|
|
|
|
|
* @param y
|
|
|
|
|
* 起始位置,左上角在canvas中的坐标行
|
|
|
|
|
* @param x
|
|
|
|
|
* 起始位置,左上角在canvas中的坐标列
|
|
|
|
|
* @param level
|
|
|
|
|
* 游戏等级,控制块的下落速度
|
|
|
|
|
* @param canvas
|
|
|
|
|
* 画板
|
|
|
|
|
*/
|
|
|
|
|
public Block(int style, int y, int x, GameCanvas gc) {
|
|
|
|
|
this.style = style;
|
|
|
|
|
this.y = y;
|
|
|
|
|
this.x = x;
|
|
|
|
|
this.gc = gc;
|
|
|
|
|
// this.high=high;
|
|
|
|
|
int key = 0x8000;// 匹配器
|
|
|
|
|
// 获得一种方块
|
|
|
|
|
for (int i = 0; i < boxs.length; i++) {
|
|
|
|
|
for (int j = 0; j < boxs[i].length; j++) {
|
|
|
|
|
boolean isColor = ((style & key) != 0);
|
|
|
|
|
boxs[i][j] = new Box(isColor);
|
|
|
|
|
key >>= 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
display();// 调用显示函数
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将当前块从画布的对应位置移除,要等到下次重画画布时才能反映出来
|
|
|
|
|
*/
|
|
|
|
|
public void earse() {
|
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
|
|
if (boxs[i][j].isColorBox()) {
|
|
|
|
|
Box box = gc.getBox(i + y, j + x);
|
|
|
|
|
if (box == null)
|
|
|
|
|
continue;
|
|
|
|
|
box.setColor(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 让当前块放置在画布的对应位置上,要等到下次重画画布时才能看见
|
|
|
|
|
*/
|
|
|
|
|
public void display() {
|
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
|
|
if (boxs[i][j].isColorBox()) {
|
|
|
|
|
Box box = gc.getBox(y + i, x + j);// 获得在游戏界面的位置
|
|
|
|
|
if (box == null)
|
|
|
|
|
continue;
|
|
|
|
|
else
|
|
|
|
|
box.setColor(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 左移方法
|
|
|
|
|
*/
|
|
|
|
|
public void moveLeft() {
|
|
|
|
|
|
|
|
|
|
newL = x - 1;
|
|
|
|
|
newH = y;
|
|
|
|
|
if (isMoveAble(newH, newL) && !pausing) {
|
|
|
|
|
earse();
|
|
|
|
|
x--;
|
|
|
|
|
display();
|
|
|
|
|
gc.repaint();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 右移方法
|
|
|
|
|
*/
|
|
|
|
|
public void moveRight() {
|
|
|
|
|
|
|
|
|
|
newL = x + 1;
|
|
|
|
|
newH = y;
|
|
|
|
|
if (isMoveAble(newH, newL) && !pausing) {
|
|
|
|
|
earse();
|
|
|
|
|
x++;
|
|
|
|
|
display();
|
|
|
|
|
gc.repaint();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 向下加速
|
|
|
|
|
*/
|
|
|
|
|
public void moveDown() {
|
|
|
|
|
newL = x;
|
|
|
|
|
newH = y + 1;
|
|
|
|
|
if (pausing == true)
|
|
|
|
|
return;
|
|
|
|
|
if (isMoveAble(newH, newL)) {
|
|
|
|
|
earse();
|
|
|
|
|
y++;
|
|
|
|
|
display();
|
|
|
|
|
gc.repaint();
|
|
|
|
|
} else {
|
|
|
|
|
isAlive = false;
|
|
|
|
|
// mytask.cancel();
|
|
|
|
|
}// 取消定时器任务
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 瞬间到达底部
|
|
|
|
|
*/
|
|
|
|
|
public void quickDown() {
|
|
|
|
|
newL = x;
|
|
|
|
|
newH = y + 1;
|
|
|
|
|
while (isMoveAble(newH, newL)) {
|
|
|
|
|
earse();
|
|
|
|
|
y++;
|
|
|
|
|
display();
|
|
|
|
|
gc.repaint();
|
|
|
|
|
newL = x;
|
|
|
|
|
newH = y + 1;
|
|
|
|
|
}
|
|
|
|
|
isAlive = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* *//**
|
|
|
|
|
* 阴影实现
|
|
|
|
|
*//*
|
|
|
|
|
public void yy() {
|
|
|
|
|
int yy = y;
|
|
|
|
|
newL = x;
|
|
|
|
|
newH = yy + 1;
|
|
|
|
|
|
|
|
|
|
while (isMoveAble(newH, newL)) {
|
|
|
|
|
earse();
|
|
|
|
|
yy++;
|
|
|
|
|
display();
|
|
|
|
|
newL = x;
|
|
|
|
|
newH = yy + 1;
|
|
|
|
|
}
|
|
|
|
|
earse();
|
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
|
|
if (boxs[i][j].isColorBox() == true)
|
|
|
|
|
yinying[i][j]=yy+j;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
/**
|
|
|
|
|
* 旋转功能的实现
|
|
|
|
|
*/
|
|
|
|
|
public void moveUp() {
|
|
|
|
|
earse();
|
|
|
|
|
if (pausing == true)
|
|
|
|
|
return;
|
|
|
|
|
if (isChangeAble()) {
|
|
|
|
|
// 获取下一形态
|
|
|
|
|
int key = 0x8000;
|
|
|
|
|
for (int a = 0; a < 4; a++) {
|
|
|
|
|
for (int b = 0; b < 4; b++) {
|
|
|
|
|
boolean isColor = ((this.style & key) != 0);
|
|
|
|
|
boxs[a][b].setColor(isColor);
|
|
|
|
|
key >>= 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
display();
|
|
|
|
|
gc.repaint();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* 判断是否可以移动 获取下个位置是否为空,或者已经是有颜色的
|
|
|
|
|
*/
|
|
|
|
|
public boolean isMoveAble(int newH, int newL) {
|
|
|
|
|
earse();
|
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
|
|
if (boxs[i][j].isColorBox()) {
|
|
|
|
|
Box box = gc.getBox(newH + i, newL + j);
|
|
|
|
|
if (box == null || (box.isColorBox())) {
|
|
|
|
|
display();// 显示原先的位置
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
display();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断是否可以进行变形
|
|
|
|
|
*/
|
|
|
|
|
private boolean isChangeAble() {
|
|
|
|
|
int key = 0x8000;
|
|
|
|
|
int newStyle = 0;
|
|
|
|
|
earse();
|
|
|
|
|
for (int i = 0; i < st; i++) {
|
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
|
|
if (Constant.STYLES[i][j] == this.style) {
|
|
|
|
|
newStyle = Constant.STYLES[i][(j + 1) % 4];// 取得下一个状态
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// display();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 判断此状态在游戏界面上显示是否有障碍
|
|
|
|
|
for (int a = 0; a < boxs.length; a++) {
|
|
|
|
|
for (int b = 0; b < boxs[a].length; b++) {
|
|
|
|
|
if ((newStyle & key) != 0) {
|
|
|
|
|
Box box = gc.getBox(y + a, x + b);
|
|
|
|
|
if (box == null || box.isColorBox()) {
|
|
|
|
|
// display();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
key >>= 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.style = newStyle;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 暂停
|
|
|
|
|
*/
|
|
|
|
|
public void pause() {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
if (MyFrame.playing == true) {
|
|
|
|
|
pausing = true;
|
|
|
|
|
// isMoveAble(newH, newL);
|
|
|
|
|
gc.pau = true;
|
|
|
|
|
gc.repaint();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 继续
|
|
|
|
|
*/
|
|
|
|
|
public void jixu() {
|
|
|
|
|
if (MyFrame.playing == true) {
|
|
|
|
|
pausing = false;
|
|
|
|
|
gc.pau = false;
|
|
|
|
|
gc.repaint();
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|