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日
暂无贡献等级
微信网友_5992582549164032  LV6 2023年2月21日
3174233007 2022年12月19日
暂无贡献等级
FXX123456  LV2 2022年12月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友