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 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日
暂无贡献等级

