改进 1. 方块旋转修改
2. 实现没达到一个成绩等级进行加速并且保持速度直到下一次加速(使用两个定时器)
3. 实现两个人分别暂停
4. 界面优化
图片大家网上自己搜索一下
--------------------------------------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.awt.event.KeyListener;
import java.awt.p_w_picpath.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;
import javax.p_w_picpathio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 俄罗斯方块的游戏执行类,继承于JPanel实现绘制
*
* @author soft01
*
*/
public class Tetris extends JPanel {
/** 版本号*/
private static final long serialVersionUID = 1L;
/** 玩家p1和玩家p2的分数,行数,游戏的墙,生成的方块,下一个方块
* 游戏结束和暂停提示,定时器*/
private int scores_p1;
private int lines_p1;
private int scores_p2;
private int lines_p2;
public Cell[][] walls_p1 = new Cell[20][10];
public Cell[][] walls_p2 = new Cell[20][10];
private Tetromino tetromino_p1;
private Tetromino tetromino_p2;
private Tetromino nextOne_p1;
private Tetromino nextOne_p2;
private boolean pause_p1;
private boolean pause_p2;
private boolean gameOver_p1;
private boolean gameOver_p2;
private Timer timer_p1;
private Timer timer_p2;
/** 行数*/
private static final int ROWS = 20;
/** 列数*/
private static final int COLS = 10;
/** 字体颜色,设置为与方块界面相同的颜色*/
public static final Color FONT_COLOR = new Color(0x667799);
/** 字体大小,设置为25号*/
public static final int FONT_SIZE = 25;
/** 格子的像素,26*/
public static final int CELL_SIZE = 26;
/** 方块下落时间间隔,通过设置定时器的间隔时间实现*/
public static final int INTEVAL = 600;
/** 用于加速的时间间隔值*/
public static final int INTEVALDOWN = 50;
/** 消除行数对应的分数,设置为1 3 9 27*/
public static final int[] SCORE_TABLE = {0, 1, 3, 9, 27};
/** 将程序需要的数据用常量表示,增加代码可读性*/
/** 使用白色作为说明文字的背景颜色*/
public static final Color COLOR_FONTBACKGROUND = new Color(0xffffff);// 白色
/** 窗口框架的宽度和高度*/
public static final int FRAME_WIDTH = 1015;
public static final int FRAME_HEIGHT = 570;
/** 定义一个boolean数组,用于实现成绩分段,速度不同*/
private boolean[] flags_p1 = new boolean[15];
/** 定义一个boolean数组,用于实现成绩分段,速度不同*/
private boolean[] flags_p2 = new boolean[15];
/** 定义为静态的缓冲图片,可以被静态代码块调用加载*/
public static BufferedImage background;
public static BufferedImage gameOverImage;
public static BufferedImage T;
public static BufferedImage S;
public static BufferedImage Z;
public static BufferedImage L;
public static BufferedImage J;
public static BufferedImage I;
public static BufferedImage O;
/** 静态代码块,用于加载一次性资源,主要是,图片*/
static {
try {
ImageIO.read(Tetris.class.getResource("tetris.png"));
gameOverImage = ImageIO.read(Tetris.class.getResource("game-over.png"));
I = ImageIO.read(Tetris.class.getResource("I.png"));
T = ImageIO.read(Tetris.class.getResource("T.png"));
S = ImageIO.read(Tetris.class.getResource("S.png"));
Z = ImageIO.read(Tetris.class.getResource("Z.png"));
L = ImageIO.read(Tetris.class.getResource("L.png"));
J = ImageIO.read(Tetris.class.getResource("J.png"));
O = ImageIO.read(Tetris.class.getResource("O.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
/** 程序的入口main方法,构建JFrame框架*/
public static void main(String[] args) {
/** 创建Tetris的对象,用于将程序装入JFrame中*/
Tetris tetris = new Tetris();
/** 新建窗口对象并且设置标题为TETRIS*/
JFrame frame = new JFrame("TETRIS");
/** 将画板添加到新建的窗口中*/
frame.add(tetris);
/** 设置窗口的宽度,高度*/
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
/** 窗口关闭(叉)时结束程序*/
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/** 窗口居中*/
frame.setLocationRelativeTo(null);
/** 设置窗口可见(默认的时候是不可见的)*/
frame.setVisible(true);
/** 执行tetris对象的action方法,静态方法不能直接调用非静态
* 方法*/
tetris.action();
}
/** 程序执行的主要方法,设置键盘监听*/
private void action() {
startAction();
repaint();
/** 通过匿名内部类创建键盘监听*/
KeyListener l = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ESCAPE) {
System.exit(0);// 结束java进程
}
if (gameOver_p1 || gameOver_p2) {
// 游戏结束后,按enter回车重新开始
if (key == KeyEvent.VK_ENTER) {
startAction();
repaint();
}
return;
}
if (pause_p1 || pause_p2) {
// 暂停游戏之后,可以继续游戏
if (key == KeyEvent.VK_S) {
continueActionForP1();
}
if (key == KeyEvent.VK_LEFT) {
continueActionForP2();
}
return;
}
switch (key) {
case KeyEvent.VK_2:// 玩家2的向下
softDropActionForP2();
break;
case KeyEvent.VK_K:// 玩家1的向下
softDropActionForP1();
break;
case KeyEvent.VK_1:// 玩家2的向左
moveLeftAction(tetromino_p2, walls_p2);
break;
case KeyEvent.VK_J:// 玩家1的向左
moveLeftAction(tetromino_p1, walls_p1);
break;
case KeyEvent.VK_3:// 玩家2的向右
moveRightAction(tetromino_p2, walls_p2);
break;
case KeyEvent.VK_L:// 玩家1的向右
moveRightAction(tetromino_p1, walls_p1);
break;
case KeyEvent.VK_5:// 玩家2的旋转
rotateAction(tetromino_p2, wal