本文代码来源于B站:尚学堂
博主也在此基础上有些改动,添加了一点提示标签和窗口
本文实现的功能有:
1、初始化游戏窗口
2、初始化游戏的界面
3、初始化游戏的说明面板
4、随机生成下落方块
5、方块下落速度变化
6、判断方块是否可以下落
7、移除某一行方块上面的方块后让上面的方块掉落
8、刷新移除某一行方块后的界面
9、清除方块
10、绘制方块
11、键盘控制方块的移动、变形和快速下落
12、游戏的暂停功能
13、游戏结束后,弹出窗口提示并显示最终分数
三小时纯手工打造,具体实现代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class start extends JFrame implements KeyListener {
public static void main(String[] args) throws Exception {
// SwingUtilities.invokeLater(start::initWindow);
start t=new start();
t.game_begin();
}
//游戏的行数为26,列数为12
private static final int game_x=26;
private static final int game_y=12;
//文本域数组
JTextArea[][] text;
//二维数组
int [][] data;
//显示游戏状态的标签
JLabel Label1;
//显示游戏分数的标签
JLabel Label;
//提示暂停键的标签
JLabel label;
//用于判断游戏是否结束
boolean isrunning;
//用于存储所有方块的数组
int [] allRect;
//用于存储当前方块的变量
int rect;
//线程的休眠时间
int time=1000;
//表示方块坐标
int x,y;
//该变量用于计算得分
int score=0;
//定义一个标志变量,判断游戏是否暂停
boolean game_pause=false;
//定义一个变量,用于记录按下暂停的次数
int pause=0;
public void initWindow(){
//设置窗口大小
this.setSize(600,850);
//设置窗口是否可见
this.setVisible(true);
//设置窗口居中
this.setLocationRelativeTo(null);
//设置释放窗体
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体大小不可变
this.setResizable(false);
//设置标题
this.setTitle("俄罗斯方块");
}
public start(){
text=new JTextArea[game_x][game_y];
data=new int[game_x][game_y];
//初始化游戏状态的标签
Label1 =new JLabel("游戏状态:正在游戏中!");
//初始化游戏分数的标签
Label=new JLabel("游戏得分:0");
//初始化提示标签
label=new JLabel("按下s键,即可暂停游戏!");
initGamePanel();
initExplainPanel();
initWindow();
//初始化游戏开始的标志
isrunning=true;
//初始化存放方块的数组
allRect =new int[]{0x00cc,0x8888,0x000f,0x888f,0xf888,0xf111,0x111f,0x0eee,0xffff,0x0008
,0x0888,0x000e,0x0088,0x000c,0x08c8,0x00e4,0x04c4,0x004e,0x08c4,0x006c,0x04c8,0x00c6};
}
//初始化游戏界面
public void initGamePanel(){
JPanel game_main=new JPanel();
game_main.setLayout(new GridLayout(game_x,game_y,1,1));
for (int i = 0; i < text.length; i++) {
for (int j = 0; j < text[i].length; j++) {
//设置文本域的行列数
text[i][j]=new JTextArea(game_x,game_y);
//设置文本域的背景颜色
text[i][j].setBackground(Color.WHITE);//白色
//添加键盘监听事件
text[i][j].addKeyListener(this);
//初始化游戏边界
if(j==0 || j==text[i].length-1 || i==text.length-1){
text[i][j].setBackground(Color.BLACK);//设置为黑色,这里看个人喜好设置
data[i][j]=1;//表示这里有方块
}
//设置文本域不可编辑
text[i][j].setEditable(false);