package tetris;
import java.util.ArrayList;
public class Modle {
private ArrayList<Node> modle = new ArrayList<Node>();
private int dir = DOWN;
private int type = 0; // 每种模型的可变换类型的标记
private char style; // 模式共7种
private boolean isMoved = true; // 是否可以移动
/*
* ooo o o oo o o type=0 type=1 ...
*/
public static final int UP = -1;
public static final int DOWN = 1;
public static final int LEFT = -10;
public static final int RIGHT = 10;
// 格子的宽度
public static final int WIDTH = 20;
public Modle() {
super();
}
// 构建6种形式的模型
public Modle(int type) {
switch (type) {
case 0:
// oooo
getModle().add(new Node(-2 * WIDTH, 0));
getModle().add(new Node(-WIDTH, 0));
getModle().add(new Node(0, 0));
getModle().add(new Node(WIDTH, 0));
moveCenter();
// type = 0;
style = '-';
break;
case 1:
// ooo
// o
getModle().add(new Node(-WIDTH, -WIDTH));
getModle().add(new Node(0, -WIDTH));
getModle().add(new Node(WIDTH, -WIDTH));
getModle().add(new Node(0, 0));
moveCenter();
style = 'T';
break;
case 2:
// oo
// oo
getModle().add(new Node(-WIDTH, -WIDTH));
getModle().add(new Node(0, -WIDTH));
getModle().add(new Node(-WIDTH, 0));
getModle().add(new Node(0, 0));
moveCenter();
style = '口';
break;
case 3:
// oo
// oo
getModle().add(new Node(-WIDTH, -WIDTH));
getModle().add(new Node(0, -WIDTH));
getModle().add(new Node(0, 0));
getModle().add(new Node(WIDTH, 0));
moveCenter();
style = 'Z';
break;
case 4:
// oo
// o
// o
getModle().add(new Node(WIDTH, -2 * WIDTH));
getModle().add(new Node(0, -2 * WIDTH));
getModle().add(new Node(0, -WIDTH));
getModle().add(new Node(0, 0));
moveCenter();
style = 'F';
break;
case 5:
// oo
// o
// o
getModle().add(new Node(-WIDTH, -2 * WIDTH));
getModle().add(new Node(0, -2 * WIDTH));
getModle().add(new Node(0, -WIDTH));
getModle().add(new Node(0, 0));
moveCenter();
style = '7';
break;
case 6:
// oo
// oo
getModle().add(new Node(-WIDTH, 0));
getModle().add(new Node(0, 0));
getModle().add(new Node(0, -WIDTH));
getModle().add(new Node(WIDTH, -WIDTH));
moveCenter();
style = 'S';
break;
default:
break;
}
}
// 将构造的Modle移动到面板中间
private void moveCenter() {
for (int i = 0; i < getModle().size(); i++) {
Node n = getModle().get(i);
n.setX(n.getX() + TetrisDemo.WIDTH / 2);
n.setY(n.getY() - 10);
}
}
// 将模型移动到指定位置
public void moveCenter(Node node) {
for (int i = 0; i < getModle().size(); i++) {
Node n = getModle().get(i);
// System.out.println("1 " + n);
n.setX(n.getX() + node.getX() - TetrisDemo.WIDTH / 2);
n.setY(n.getY() + node.getY() + 10);
// System.out.println("2 " + n);
}
}
public void moveBack(Node node) {
for (int i = 0; i < getModle().size(); i++) {
Node n = getModle().get(i);
// System.out.println("1 " + n);
n.setX(n.getX() - node.getX() + TetrisDemo.WIDTH / 2);
n.setY(n.getY() - node.getY() - 10);
// System.out.println("2 " + n);
}
}
public ArrayList<Node> getModel() {
return getModle();
}
// 按默认方向走一步
public synchronized void step() {
for (Node n : getModle()) {
n.setX(n.getX() + dir / 10 * WIDTH);
n.setY(n.getY() + dir % 10 * WIDTH);
}
this.dir = DOWN;
}
// 按dir方向走一步
public synchronized void step(int dir, Modle fixedModle) {
if (getModle() == null) {
return;
}
if (fixedModle == null) {
for (Node n : getModle()) {
int x = n.getX() + dir / 10 * WIDTH;
int y = n.getY() + dir % 10 * WIDTH;
if (x >= TetrisDemo.WIDTH - TetrisDemo.WIDTH / 4
|| x < TetrisDemo.WIDTH / 4 || y < -50) {
this.dir = DOWN;
return;
}
if (y > TetrisDemo.HIGHT - 50) {
setMoved(false);
this.dir = DOWN;
return;
}
}
}
for (Node n : getModle()) {
int x = n.getX() + dir / 10 * WIDTH;
int y = n.getY() + dir % 10 * WIDTH;
if (fixedModle.contains(new Node(x, y))) {
if (dir != DOWN) {
return;
}
setMoved(false);
return;
}
if (x >= TetrisDemo.WIDTH - TetrisDemo.WIDTH / 4
|| x < TetrisDemo.WIDTH / 4 || y < -50) {
this.dir = DOWN;
return;
}
if (y > TetrisDemo.HIGHT - 50) {
setMoved(false);
this.dir = DOWN;
return;
}
}
this.dir = dir;
step();
}
// 将不能移动的modle添加到fixedNoes
public void add(Modle modle) {
if (modle == null) {
return;
}
for (Node m : modle.getModel()) {
getModel().add(m);
}
}
// 当前modle是否包含节点node
public boolean contains(Node node) {
if (node == null) {
return false;
}
for (Node n : getModle()) {
if (n.equals(node)) {
return true;
}
}
return false;
}
// 检查节点是否在Modle内,是否在面板内
public boolean checked(Node node) {
int x = node.getX();
int y = node.getY();
if (x >= TetrisDemo.WIDTH - TetrisDemo.WIDTH / 4
|| x < TetrisDemo.WIDTH / 4 || y < -50
|| y > TetrisDemo.HIGHT - 50) {
return false;
}
if (contains(node)) {
return false;
}
return true;
}
// 模型的转换
public synchronized void turn(Modle fixedNode) {
Modle m = fixedNode;
if (modle.size() != 4) {
this.dir = 0;
return;
}
int x2 = modle.get(1).getX();
int x3 = modle.get(2).getX();
int x4 = modle.get(3).getX();
int y2 = modle.get(1).getY();
int y3 = modle.get(2).getY();
int y4 = modle.get(3).getY();
if (style == ('-')) {
switch (type) {
case 0:
// System.out.println("1 " + modle);
if (m.checked(new Node(x3, y3 - (2 * WIDTH)))
&& m.checked(new Node(x3, y3 - WIDTH))
&& m.checked(new Node(x3, y3 + WIDTH))) {
modle.set(0, new Node(x3, y3 - (2 * WIDTH)));
modle.set(1, new Node(x3, y3 - WIDTH));
modle.set(3, new Node(x3, y3 + WIDTH));
this.type = 1;
}
// System.out.println("2 " + modle);
break;
case 1:
// System.out.println("3 " + modle);
if (m.checked(new Node(x3 - 2 * WIDTH, y3))
&& m.checked(new Node(x3 - WIDTH, y3))
&& m.checked(new Node(x3 + WIDTH, y3))) {
modle.set(0, new Node(x3 - 2 * WIDTH, y3));
modle.set(1, new Node(x3 - WIDTH, y3));
modle.set(3, new Node(x3 + WIDTH, y3));
this.type = 0;
}
// System.out.println("4 " + modle);
break;
default:
break;
}
}
if (style == ('T')) {
switch (type) {
case 0:
if (m.checked(new Node(x2, y2 - WIDTH))) {
modle.set(0, new Node(x2, y2 - WIDTH));
this.type = 1;
}
break;
case 1:
if (m.checked(new Node(x2 - WIDTH, y2))) {
modle.set(3, new Node(x2 - WIDTH, y2));
type = 2;
}
break;
case 2:
if (m.checked(new Node(x2, y2 + WIDTH))) {
modle.set(2, new Node(x2, y2 + WIDTH));
type = 3;
}
break;
case 3:
if (m.checked(new Node(x4, y4))
&& m.checked(new Node(x2 + WIDTH, y2))
&& m.checked(new Node(x3, y3))) {
modle.set(0, new Node(x4, y4));
modle.set(2, new Node(x2 + WIDTH, y2));
modle.set(3, new Node(x3, y3));
type = 0;
}
break;
default:
break;
}
}
if (style == ('口')) {
this.dir = 0;
return;
}
if (style == ('Z')) {
switch (type) {
case 0:
if (m.checked(new Node(x4, y4 - 2 * WIDTH))
&& m.checked(new Node(x4, y4 - WIDTH))
&& m.checked(new Node(x4, y4 - WIDTH))) {
modle.set(0, new Node(x4, y4 - 2 * WIDTH));
modle.set(3, new Node(x4, y4 - WIDTH));
type = 1;
}
break;
case 1:
if (m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x4, y4 + WIDTH))) {
modle.set(0, new Node(x2 - WIDTH, y2));
modle.set(3, new Node(x4, y4 + WIDTH));
type = 0;
}
break;
default:
break;
}
}
if (style == 'F') {
switch (type) {
case 0:
if (m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x2 + WIDTH, y2))
&& m.checked(new Node(x2 - WIDTH, y2 - WIDTH))) {
modle.set(0, new Node(x2 - WIDTH, y2));
modle.set(2, new Node(x2 + WIDTH, y2));
modle.set(3, new Node(x2 - WIDTH, y2 - WIDTH));
type = 1;
}
break;
case 1:
if (m.checked(new Node(x2, y2 + WIDTH))
&& m.checked(new Node(x2, y2 - WIDTH))
&& m.checked(new Node(x2 - WIDTH, y2 + WIDTH))) {
modle.set(0, new Node(x2, y2 + WIDTH));
modle.set(2, new Node(x2, y2 - WIDTH));
modle.set(3, new Node(x2 - WIDTH, y2 + WIDTH));
type = 2;
}
break;
case 2:
if (m.checked(new Node(x2 + WIDTH, y2))
&& m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x2 + WIDTH, y2 + WIDTH))) {
modle.set(0, new Node(x2 + WIDTH, y2));
modle.set(2, new Node(x2 - WIDTH, y2));
modle.set(3, new Node(x2 + WIDTH, y2 + WIDTH));
type = 3;
}
break;
case 3:
if (m.checked(new Node(x2, y2 - WIDTH))
&& m.checked(new Node(x2, y2 + WIDTH))
&& m.checked(new Node(x2 + WIDTH, y2 - WIDTH))) {
modle.set(0, new Node(x2, y2 - WIDTH));
modle.set(2, new Node(x2, y2 + WIDTH));
modle.set(3, new Node(x2 + WIDTH, y2 - WIDTH));
type = 0;
}
break;
default:
break;
}
}
if (style == '7') {
switch (type) {
case 0:
if (m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x2 + WIDTH, y2))
&& m.checked(new Node(x2 - WIDTH, y2 + WIDTH))) {
modle.set(0, new Node(x2 - WIDTH, y2));
modle.set(2, new Node(x2 + WIDTH, y2));
modle.set(3, new Node(x2 - WIDTH, y2 + WIDTH));
type = 1;
}
break;
case 1:
if (m.checked(new Node(x2, y2 + WIDTH))
&& m.checked(new Node(x2, y2 - WIDTH))
&& m.checked(new Node(x2 + WIDTH, y2 + WIDTH))) {
modle.set(0, new Node(x2, y2 + WIDTH));
modle.set(2, new Node(x2, y2 - WIDTH));
modle.set(3, new Node(x2 + WIDTH, y2 + WIDTH));
type = 2;
}
break;
case 2:
if (m.checked(new Node(x2 + WIDTH, y2))
&& m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x2 + WIDTH, y2 - WIDTH))) {
modle.set(0, new Node(x2 + WIDTH, y2));
modle.set(2, new Node(x2 - WIDTH, y2));
modle.set(3, new Node(x2 + WIDTH, y2 - WIDTH));
type = 3;
}
break;
case 3:
if (m.checked(new Node(x2, y2 - WIDTH))
&& m.checked(new Node(x2, y2 + WIDTH))
&& m.checked(new Node(x2 - WIDTH, y2 - WIDTH))) {
modle.set(0, new Node(x2, y2 - WIDTH));
modle.set(2, new Node(x2, y2 + WIDTH));
modle.set(3, new Node(x2 - WIDTH, y2 - WIDTH));
type = 0;
}
break;
default:
break;
}
}
if (style == 'S') {
switch (type) {
case 0:
if (m.checked(new Node(x2, y2 + WIDTH))
&& m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x2 - WIDTH, y2 - WIDTH))) {
modle.set(0, new Node(x2, y2 + WIDTH));
modle.set(2, new Node(x2 - WIDTH, y2));
modle.set(3, new Node(x2 - WIDTH, y2 - WIDTH));
type = 1;
}
break;
case 1:
if (m.checked(new Node(x2 - WIDTH, y2))
&& m.checked(new Node(x2, y2 - WIDTH))
&& m.checked(new Node(x2 + WIDTH, y2 - WIDTH))) {
modle.set(0, new Node(x2 - WIDTH, y2));
modle.set(2, new Node(x2, y2 - WIDTH));
modle.set(3, new Node(x2 + WIDTH, y2 - WIDTH));
type = 0;
}
break;
default:
break;
}
}
this.dir = 0;
return;
}
public boolean isMoved() {
return isMoved;
}
public void setMoved(boolean isMoved) {
this.isMoved = isMoved;
}
public int getDir() {
return dir;
}
public void setDir(int dir) {
this.dir = dir;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public char getStyle() {
return style;
}
public void setStyle(char style) {
this.style = style;
}
@Override
public String toString() {
return "Modle [model=" + getModle().toString() + ", dir=" + dir
+ ", isMoved=" + isMoved + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + dir;
result = prime * result + (isMoved ? 1231 : 1237);
result = prime * result
+ ((getModle() == null) ? 0 : getModle().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Modle other = (Modle) obj;
if (dir != other.dir)
return false;
if (isMoved != other.isMoved)
return false;
if (getModle() == null) {
if (other.getModle() != null)
return false;
} else if (!getModle().equals(other.getModle()))
return false;
return true;
}
public ArrayList<Node> getModle() {
return modle;
}
public void setModle(ArrayList<Node> modle) {
this.modle = modle;
}
}
最近下载更多
ClydeSon LV5
2023年12月27日
微信网友_6699076084797440 LV7
2023年10月30日
林间听风 LV10
2022年5月26日
WuYonJun LV1
2021年9月25日
qsyqa0 LV6
2021年9月4日
1450747406 LV9
2021年8月15日
chance_jcpasd LV2
2021年6月6日
dengge123 LV14
2021年6月3日
ly1091471466 LV2
2020年10月29日
nicomaki LV1
2020年5月30日
最近浏览更多
vincemokea LV9
8月26日
y1214435276 LV9
1月23日
源123123 LV1
2024年12月25日
ClydeSon LV5
2023年12月27日
1112WHQ LV7
2023年11月3日
微信网友_6699076084797440 LV7
2023年10月30日
jiemomo LV12
2023年10月19日
wty1234 LV2
2023年6月20日
小安同学 LV7
2023年5月11日
微信网友_6448323394179072
2023年4月25日
暂无贡献等级

