相对简单,粗陋,希望大家给点指点。 这算是督促自己发布源码的一个地方,虽然菜鸟,但也得养成好习惯,嘿嘿~
package game; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class GameFace extends JFrame { /** * */ private static final long serialVersionUID = 1L; // 相关参数设定:所有全局变量初始化 private ImageIcon[][] Blocks = new ImageIcon[12][22];// 定位 private final int panelWidth = 384 + 32 * 5;// 宽 12*32 private final int panelHight = 672;// 高 22*32 private int x = 192, y = 0;// 初始坐标 private int DELAY = 800;// 延迟和单位图像大小 private final int IMAGE_SIZE = 32; private Timer timer = new Timer(DELAY, new Down());// 计时器 private ImageIcon Block, Earth;// 元方块 private int score = 0;// 得分 private ImageIcon background; private Fangkuai[] F = new Fangkuai[2]; // 内部类:方块 public class Fangkuai { private int xingzhuang[][] = new int[5][5]; public int pengzhuang() { int i, j; for (i = 4; i > 0; i--) for (j = 4; j > 0; j--) { if (xingzhuang[i][j] != 0) if ((Blocks[x / 32 + i][y / 32 + j + 1] != null)) return 1; } return 0; } public void set_xingzhuang(int xx) { for (int m = 0; m < 5; m++) for (int n = 0; n < 5; n++) xingzhuang[m][n] = 0; switch (xx) { case 1: xingzhuang[1][1] = 1; xingzhuang[2][1] = 1; xingzhuang[1][2] = 1; xingzhuang[2][2] = 1; break; case 2: xingzhuang[1][1] = 1; xingzhuang[2][1] = 1; xingzhuang[2][2] = 1; xingzhuang[2][3] = 1; break; case 3: xingzhuang[2][1] = 1; xingzhuang[3][1] = 1; xingzhuang[1][2] = 1; xingzhuang[2][2] = 1; break; case 4: xingzhuang[2][1] = 1; xingzhuang[2][2] = 1; xingzhuang[3][2] = 1; xingzhuang[4][2] = 1; break; case 5: xingzhuang[2][1] = 1; xingzhuang[1][2] = 1; xingzhuang[3][1] = 1; xingzhuang[2][2] = 1; break; case 6: xingzhuang[2][1] = 1; xingzhuang[1][2] = 1; xingzhuang[2][2] = 1; xingzhuang[3][2] = 1; break; case 0: xingzhuang[2][1] = 1; xingzhuang[2][2] = 1; xingzhuang[2][3] = 1; xingzhuang[2][4] = 1; break; default: break; } } // 旋转方法:理解动态过程;图像模拟; public void xuanzhuan() { outer: for (int k = 0; k < 3; k++) for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (x / 32 + j > 11 || x / 32 + j < 0) break outer; if (xingzhuang[i][j] != 0 && xingzhuang[j][4 - i] == 0 && xingzhuang[i][j] != 2) { xingzhuang[i][j] = 0; xingzhuang[j][4 - i] = 2; } } for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (xingzhuang[i][j] == 2) xingzhuang[i][j] = 1; } } public Fangkuai(int xxx) { x = 192; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) xingzhuang[i][j] = 0; set_xingzhuang(xxx); } }// 方块类 // GAMEFACE主类构造函数 public GameFace() { // 初始化数据 background = new ImageIcon("images/3.gif"); this.setTitle("" + score); Block = new ImageIcon("images/1.gif"); Earth = new ImageIcon("images/2.gif"); for (int i = 0; i < 12; i++) Blocks[i][21] = Earth; for (int i = 0; i < 2; i++) { F[i] = new Fangkuai(new Random().nextInt(7)); } GameArea game = new GameArea(); this.add(game); this.addKeyListener(new Control()); timer.start(); } // 内部类GameArea:游戏进行区域 private class GameArea extends JPanel { /** * */ private static final long serialVersionUID = 1L; public GameArea() { setPreferredSize(new Dimension(panelWidth, panelHight)); setBackground(Color.BLACK); } // 绘制 public void paintComponent(Graphics page) { super.paintComponent(page); setTitle("" + score); background.paintIcon(this, page, 0, 0); // 显示下一个方块 for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (F[1].xingzhuang[i][j] != 0) { Block.paintIcon(this, page, 384 + i * 32, j * 32); } // 降落中的方块 for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (F[0].xingzhuang[i][j] != 0) { Block.paintIcon(this, page, x + i * 32, y + j * 32); } // 落地的方块 for (int i = 0; i < 12; i++) for (int j = 0; j < 22; j++) { if (Blocks[i][j] != null) Blocks[i][j].paintIcon(this, page, i * 32, j * 32); } } } // 内部类:下降 public class Down implements ActionListener { public void actionPerformed(ActionEvent e) { // 下降速度 if (F[0].pengzhuang() == 0) y += IMAGE_SIZE; // 落地判断:碰撞; else { timer.stop(); for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (F[0].xingzhuang[i][j] != 0) Blocks[x / 32 + i][y / 32 + j] = Block; } y = 0; F[0] = F[1]; F[1] = new Fangkuai(new Random().nextInt(7)); timer = new Timer(DELAY, new Down()); timer.start(); // 消除方块 for (int j = 21; j > 0; j--) { int k = 1; for (int i = 0; i < 12; i++) { if (Blocks[i][j] == Block) k *= 1; else k *= 0; } if (k == 1) { score += 100; for (int l = 0; l < 12; l++) Blocks[l][j] = null; for (int p = j; p > 0; p--) for (int q = 0; q < 12; q++) Blocks[q][p] = Blocks[q][p - 1]; } } } repaint(); } } // 内部类:键盘控制 public class Control implements KeyListener { public void keyPressed(KeyEvent e) { int test; if (e.getKeyCode() == KeyEvent.VK_LEFT&&F[0].pengzhuang()==0) { test = 1; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (F[0].xingzhuang[i][j] != 0 && (x + i * 32 - 32) < 0) test = 0; } if (test == 1) { x -= IMAGE_SIZE; repaint(); } } if (e.getKeyCode() == KeyEvent.VK_RIGHT&&F[0].pengzhuang()==0) { test = 1; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { if (F[0].xingzhuang[i][j] != 0 && (i * 32 + x + 32) >= (32 * 12)) test = 0; } if (test == 1) { x += IMAGE_SIZE; repaint(); } } if (e.getKeyCode() == KeyEvent.VK_DOWN) { timer.stop(); timer = new Timer(50, new Down()); timer.start(); } if (e.getKeyCode() == KeyEvent.VK_UP&&F[0].pengzhuang()==0) { F[0].xuanzhuan(); repaint(); } } public void keyTyped(KeyEvent e) { ; } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } } }