package tetris; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.Set; import javax.swing.JPanel; public class TetrisPanel extends JPanel { private Modle modle; private Modle fixedNode = new Modle(); private int score = 0; private MoveListener m = new MoveListener(); private Service s = new Service(); Random random = new Random(); private Modle next; public TetrisPanel() { modle = new Modle(random.nextInt(7)); // modle = new Modle(0); addKeyListener(m); fixedNode.setMoved(false); s.start(); } public void paint(Graphics g) { super.paint(g); // 黑边 g.setColor(Color.black); g.fill3DRect(0, 0, TetrisDemo.WIDTH / 4, TetrisDemo.HIGHT, false); g.fill3DRect(TetrisDemo.WIDTH - TetrisDemo.WIDTH / 4, 0, TetrisDemo.WIDTH / 4, TetrisDemo.HIGHT, false); // 画提示线 g.setColor(Color.pink); g.drawLine(TetrisDemo.WIDTH / 4 + 1, 0, TetrisDemo.WIDTH / 4 + 1, TetrisDemo.HIGHT); for (int i = TetrisDemo.WIDTH / 4; i <= TetrisDemo.WIDTH * 3 / 4; i++) { if (i % Modle.WIDTH == 0) { g.drawLine(i, 0, i, TetrisDemo.HIGHT); } } // 分数 g.setColor(Color.blue); g.setFont(new Font(TOOL_TIP_TEXT_KEY, ERROR, 20)); g.drawString("您的分数是:", 50, 180); g.clearRect(50, 200, TetrisDemo.WIDTH / 8, 50); g.setColor(Color.red); score = getScore(); // System.out.println("分数 == " + score); g.drawString("" + score, 70, 230); // 下一个上一个 // 下一个 g.setColor(Color.blue); g.setFont(new Font(TOOL_TIP_TEXT_KEY, ERROR, 20)); g.drawString("下一个:", TetrisDemo.WIDTH * 3 / 4 + 50, TetrisDemo.HIGHT / 2 - 200); g.clearRect(TetrisDemo.WIDTH * 3 / 4 + 60 - Modle.WIDTH, 130 - Modle.WIDTH, TetrisDemo.WIDTH / 8 + 2 * Modle.WIDTH, 100 + 2 * Modle.WIDTH); // 不能移动的模型放到集合fixedNode中 if (!modle.isMoved()) { fixedNode.add(modle); modle = clone(next); next = new Modle(random.nextInt(7)); // next = new Modle(0); next.setMoved(false); next.moveCenter(new Node(TetrisDemo.WIDTH * 3 / 4 + 100, 185)); // System.out.println("next " + next); // 随机产生一个模型 } if (next == null) { next = new Modle(random.nextInt(7)); // next = new Modle(0); next.moveCenter(new Node(TetrisDemo.WIDTH * 3 / 4 + 100, 185)); next.setMoved(false); } g.setColor(Color.orange); paintModle(next, g); // 当前 g.setColor(Color.red); g.drawString("当 前:", TetrisDemo.WIDTH * 3 / 4 + 50, TetrisDemo.HIGHT / 2); g.clearRect(TetrisDemo.WIDTH * 3 / 4 + 50 - Modle.WIDTH, 200 + 130 - Modle.WIDTH, TetrisDemo.WIDTH / 8 + 2 * Modle.WIDTH, 100 + 2 * Modle.WIDTH); // 构造当前模型 Modle current = clone(modle); // System.out.println("current == " + current); // System.out.println("node = " + new Node(TetrisDemo.WIDTH * 3 / 4 + // 50, 200 + 130)); current.moveCenter(new Node(TetrisDemo.WIDTH * 3 / 4 + 90, 200 + 185)); g.setColor(Color.green); paintModle(current, g); // 画可移动模型 // System.out.println("将要画的modle = " + modle); // g.setColor(Color.green); // for (Node n : modle.getModel()) { // if (fixedNode.contains(n)) { // s.stop(); // paintEnd(g); // return; // } paintModle(modle, g); // } // 画不可移动模型 // System.out.println("将要画的fixedNode的长度 = " + // fixedNode.getModel().size()); g.setColor(Color.cyan); paintModle(fixedNode, g); } // 结束界面 public void paintEnd(Graphics g) { g.setColor(Color.red); g.setFont(new Font(TOOL_TIP_TEXT_KEY, ERROR, 30)); g.clearRect(0, 150, 550, 100); g.setColor(Color.BLUE); g.fillRect(0, 150, 550, 100); g.clearRect(150, 180, 200, 40); g.setColor(Color.red); g.drawString(" Game Over!", 150, 210); Service.interrupted(); // removeKeyListener(listener); } // 复制模型m public Modle clone(Modle m) { if (m == null) { return null; } Modle current = new Modle(); char[] chars = new char[] { '-', 'T', '口', 'Z', 'F', '7', 'S' }; for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (m.getStyle() == c) { current = new Modle(i); break; } } return current; } // 计算分数 public int getScore() { // 填充满的行数 int line = 0; if (fixedNode == null) { return score; } // 将fixNode中Node的y统计出现的次数map<y ,次数> Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Node n : fixedNode.getModel()) { int y = n.getY(); int count = 1; if (map.keySet().contains(y)) { count = map.get(y) + 1; map.put(y, count); continue; } map.put(y, 1); } // 迭代y 删除每行不够20个格子 Iterator<Entry<Integer, Integer>> ite = map.entrySet().iterator(); while (ite.hasNext()) { int key = ite.next().getKey(); int count = map.get(key); // System.out.println("key : value = " + key + ":" + count); if (count == 20) { line++; map.put(key, 0); continue; } ite.remove(); } // 迭代fixedNode 并修改需要移动行数count deleteLine(fixedNode, map.keySet()); TetrisPanel.this.repaint(); return line * 10 + score; } public void deleteLine(Modle m, Set<Integer> yy) { ArrayList<Node> nodes = m.getModel(); Iterator<Integer> i = yy.iterator(); while (i.hasNext()) { int y = i.next(); Iterator<Node> nod = nodes.iterator(); while (nod.hasNext()) { Node n = nod.next(); if (y == n.getY()) { nod.remove(); continue; } if (n.getY() < y) { n.setY(n.getY() + Modle.WIDTH); } } } } // 画模型 public void paintModle(Modle m, Graphics g) { if (m == null) { return; } // g.setColor(Color.cyan); for (Node n : m.getModel()) { g.fill3DRect(n.getX(), n.getY(), Modle.WIDTH, Modle.WIDTH, false); } } // 监听器 class MoveListener extends KeyAdapter { int dir; public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: // Modle mod = modle; modle.setDir(0); // System.out.println("start " + modle); modle.turn(fixedNode); // System.out.println("end " + modle); modle.setDir(0); break; case KeyEvent.VK_DOWN: dir = Modle.DOWN; break; case KeyEvent.VK_LEFT: dir = Modle.LEFT; break; case KeyEvent.VK_RIGHT: dir = Modle.RIGHT; break; default: break; } // System.out.println("你按下的是: " + e.getKeyChar()); // System.out.println("dir = " + dir); // System.out.println("当前模型 = " + modle); // System.out.println("判断 " + modle); if (modle.isMoved() && modle.getDir() != 0) { modle.step(dir, fixedNode); // System.out.println("移动后的模型 = " + modle); } modle.setDir(Modle.DOWN); // System.out.println("重绘之前 " + modle); TetrisPanel.this.repaint(); } } // 移动线程 class Service extends Thread { public void run() { while (true) { try { Thread.sleep(500); if (modle.isMoved() && modle.getDir() != 0) { modle.step(Modle.DOWN, fixedNode); } // System.out.println(modle.getModel()); TetrisPanel.this.repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public Modle modle() { return 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日