java双人俄罗斯方块_双人版俄罗斯方块

改进 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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值