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  LV13 2021年6月3日
ly1091471466  LV2 2020年10月29日
nicomaki  LV1 2020年5月30日
最近浏览更多
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日
暂无贡献等级
微信网友_5992582549164032  LV6 2023年2月21日
3174233007 2022年12月19日
暂无贡献等级
FXX123456  LV2 2022年12月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友