Java Swing 俄罗斯方块游戏源码实现

方予
方予
发布时间:2026-10-13 | 4人浏览过
原创

本实例展示了如何使用 Java Swing 框架构建经典的俄罗斯方块游戏。项目涵盖界面布局、键盘事件监听、核心游戏逻辑(移动、旋转、消行)以及多线程控制,提供完整的可运行源码。

最终效果预览

核心功能需求

游戏需满足以下基础规则与交互逻辑:

  1. 基本机制:在二维平面中随机产生不同形状的方块堆积,当某一行被完全填满时自动消除并得分;若方块堆积至顶部则判定游戏结束。
  2. 操作控制:支持方向键控制方块左右移动、旋转以及加速直落。
  3. 视觉反馈:活动中的方块显示为蓝色,落地固定后变为粉色(紫红色),以便区分状态。
  4. 计分系统:根据消除的行数累加分数,分数实时显示在界面上。
  5. 游戏流程:包含开始、重新开始、调整速度(级数)、暂停/继续及退出游戏等功能按钮。

程序实现详解

第1步:初始化主窗口与布局

目的:构建游戏的主界面框架,包含左侧游戏画布和右侧控制面板。
入口:Block 类的 init() 方法及 main() 方法。
动作:继承 JPanel 并实现 ActionListener 和 KeyListener。创建 JFrame 作为主窗口,设置菜单项(新游戏、退出、关于)。使用绝对布局 null 精确控制按钮、标签的位置。
参数:窗口大小设置为 565x501,不可调整大小。
完成状态:界面渲染完毕,所有控件可见且位置固定。

public void init() {
    setLayout(null);
    // 初始化按钮
    for(int i = 0; i < 6; i++) {
        but[i] = new Button(butLab[i]);
        add(but[i]);
        but[i].addActionListener(this);
        but[i].setBounds(360, (240 + 30 * i), 160, 25);
    }
    // 添加分数、级数等Label
    add(scoreLab); scoreLab.setBounds(320,15,30,20);
    // ... 其他组件布局 ...
    num_csh_game();
    rand_block();
}

第2步:实现随机方块生成

目的:在游戏开始时及每次消行后,随机生成一个新的 Tetris 方块。
入口:rand_block() 方法。
动作:生成 1-7 的随机整数,对应不同的方块形状(I, O, T, S, Z, J, L)。调用具体的 blockN() 方法将方块数据写入全局二维数组 game_body。
参数:19行10列的二维数组,其中 1 代表当前活动方块,2 代表已落地方块,0 为空。
完成状态:棋盘上方出现新的初始方块坐标。

public void rand_block() {
    int num = (int)(Math.random() * 6) + 1;
    blockNumber = num;
    switch(blockNumber) {
        case 1: block1(); break; // I型长条
        case 2: block2(); break; // O型方块
        // ... 其他类型 ...
    }
}

第3步:处理键盘事件与移动逻辑

目的:响应用户的按键输入,实现方块的左移、右移、下落和旋转。
入口:keyPressed(KeyEvent e) 方法。
动作:检测键码 VK_LEFT, VK_RIGHT, VK_DOWN, VK_UP。对于每个动作,先检查边界碰撞和是否与其他方块重叠,若合法则更新数组坐标并重绘界面。
重要参数:downSign 标记当前方块是否已停止移动(用于防止在空中旋转或多次触发落底逻辑)。r />完成状态:方块按用户指令改变位置或形状。

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_DOWN && startSign == 1)
        this.down();
    else if(e.getKeyCode() == KeyEvent.VK_UP && startSign == 1)
        this.change_body(blockNumber);
    // 左右移动类似... 
}

第4步:核心线程控制下落速度

目的:控制方块自动下落的节奏,实现难度递增。
入口:MyTimer 线程的 run() 方法。
动作:使用 sleep() 方法暂停线程,休眠时间由 speedMark(级数)决定。级数越高,休眠时间越短,下落越快。
参数:休眠时间计算公式 (10 - speedMark + 1) * 100 毫秒。
完成状态:方块每隔一定时间自动向下移动一格。

class MyTimer extends Thread {
    public void run() {
        while(myBlock.startSign == 1) {
            try {
                sleep((10 - myBlock.speedMark + 1) * 100);
                myBlock.down();
            } catch(InterruptedException e) {}
        }
    }
}

第5步:消行判断与计分

目的:检测满行并进行消除,同时计算得分。
入口:getScore() 方法,通常在方块落地(downSign=true)后调用。
动作:遍历每一行,如果该行的所有格子都是 2(已落地),则视为满行。从该行向上覆盖下一行的数据,实现“掉落”视觉效果。增加总分 gameScore += 100。
注意:原文代码中 num_csh_game() 函数主要用于在变换形状前清除当前活动方块在数组中的临时标记,而非清除整个游戏板,实际消行逻辑在 getScore 中直接操作数组移位。

public void getScore() {
    for(int i = 0; i < 19; i++) {
        int sign = 0;
        for(int j = 0; j < 10; j++) {
            if(game_body[i][j] == 2) sign++;
        }
        if(sign == 10) { // 满行
            gameScore += 100;
            // 向上叠加数据
            for(int j = i; j >= 1; j--) {
                for(int k = 0; k < 10; k++) {
                    game_body[j][k] = game_body[j - 1][k];
                }
            }
        }
    }
}

总结

该 Java 俄罗斯方块示例通过简洁的 Swing 组件和多线程技术,实现了经典游戏的核心闭环。开发者可以在此基础上扩展音效、保存最高分记录或使用更复杂的图形渲染引擎。

以上就是Java实现俄罗斯方块小游戏源码的详细讲解,更多关于Java GUI开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表