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日
微信网友_6448323394179072
2023年4月25日
暂无贡献等级
微信网友_5992582549164032 LV6
2023年2月21日
3174233007
2022年12月19日
暂无贡献等级
FXX123456 LV2
2022年12月7日