用java写的俄罗斯方块小程序

这是一篇关于使用Java编程实现俄罗斯方块小游戏的课程设计分享。博主作为初学者,参考了一些技术博客完成该项目,并提供了完整工程文件、说明文档和可运行jar的下载链接,旨在与社区进行学习交流。
摘要由CSDN通过智能技术生成

这是java课最后做的课程设计,由于java是初学的,所以做的时候有参考一些技术大牛的博客,在此表示感谢。

发在这里跟大家交流学习一下。

如需要完整工程文件、说明文档以及可运行jar文件,下载地址:点击打开链接


RussianBlocksGame.java

package RussiaBlocksGame;


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;


/**
 * 游戏主类,继承自JFrame类,负责游戏的全局控制。 内含: 1.一个GameCanvas画布类的实例对象,
 * 2.一个保存当前活动块(RussiaBlock)实例的对象; 3.一个保存当前控制面板(ControlPanel)实例的对象;
 */
public class RussiaBlocksGame extends JFrame {


private static final long serialVersionUID = -7332245439279674749L;
/**
     * 每填满一行计多少分
     */
    public final static int PER_LINE_SCORE = 100;
    /**
     * 积多少分以后能升级
     */
    public final static int PER_LEVEL_SCORE = PER_LINE_SCORE * 20;
    /**
     * 最大级数是10级
     */
    public final static int MAX_LEVEL = 10;
    /**
     * 默认级数是2
     */
    public final static int DEFAULT_LEVEL = 2;
    private GameCanvas canvas;
    private ErsBlock block;
    private boolean playing = false;
    private ControlPanel ctrlPanel;
    //初始化菜单栏
    private JMenuBar bar = new JMenuBar();
    private JMenu mGame = new JMenu(" 游戏"),
            mControl = new JMenu(" 控制"),
            mInfo = new JMenu("帮助");
    private JMenuItem miNewGame = new JMenuItem("新游戏"),
            miSetBlockColor = new JMenuItem("设置方块颜色..."),
            miSetBackColor = new JMenuItem("设置背景颜色..."),
            miTurnHarder = new JMenuItem("升高游戏难度"),
            miTurnEasier = new JMenuItem("降低游戏难度"),
            miExit = new JMenuItem("退出"),
            miPlay = new JMenuItem("开始"),
            miPause = new JMenuItem("暂停"),
            miResume = new JMenuItem("恢复"),
            miStop = new JMenuItem("终止游戏"),
            miRule = new JMenuItem("游戏规则"),
            miAuthor = new JMenuItem("关于本游戏");
    
    
    /**
     * 建立并设置窗口菜单
     */
    private void creatMenu() {
        bar.add(mGame);
        bar.add(mControl);
        bar.add(mInfo);
        mGame.add(miNewGame);
        mGame.addSeparator();//在菜单中加水平分割线
        mGame.add(miSetBlockColor);
        mGame.add(miSetBackColor);
        mGame.addSeparator();//在菜单中加水平分割线
        mGame.add(miTurnHarder);
        mGame.add(miTurnEasier);
        mGame.addSeparator();//在菜单中加水平分割线
        mGame.add(miExit);
        mControl.add(miPlay);
        miPlay.setEnabled(true);
        mControl.add(miPause);
        miPause.setEnabled(false);
        mControl.add(miResume);
        miResume.setEnabled(false);
        mControl.add(miStop);
        miStop.setEnabled(false);
        mInfo.add(miRule);
        mInfo.add(miAuthor);
        setJMenuBar(bar);


        miNewGame.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                stopGame();
                reset();
                setLevel(DEFAULT_LEVEL);
            }
        });
        
        //设置方块颜色
        miSetBlockColor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Color newFrontColor =
                        JColorChooser.showDialog(RussiaBlocksGame.this, "设置方块颜色", canvas.getBlockColor());
                if (newFrontColor != null) {
                    canvas.setBlockColor(newFrontColor);
                }
            }
        });
        
        //设置背景颜色
        miSetBackColor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Color newBackColor =
                        JColorChooser.showDialog(RussiaBlocksGame.this, "设置背景颜色", canvas.getBackgroundColor());
                if (newBackColor != null) {
                    canvas.setBackgroundColor(newBackColor);
                }
            }
        });
        
        //定义菜单栏"关于"的功能,弹出确认框。
        miAuthor.addActionListener(new ActionListener() {                        
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "软件工程(4)班\n3115005372\n杨宇杰\n©一切解释权归杨宇杰所有", "关于俄罗斯方块 - 2016", 1);
            }
        });
        
        //游戏规则说明
        miRule.addActionListener(new ActionListener() {                        
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "由小方块组成的不同形状的板块陆续从屏幕上方落下来,\n玩家通过调整板块的位置和方向,使它们在屏幕底部拼\n出完整的一条或几条。这些完整的横条会随即消失,给新\n落下来的板块腾出空间,与此同时,玩家得到分数奖励。\n没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,\n玩家便告输,游戏结束。", "游戏规则", 1);
            }
        });
        
        //增加难度
        miTurnHarder.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int curLevel = getLevel();
                if (!playing && curLevel < MAX_LEVEL) {
                    setLevel(curLevel + 1);
                }
            }
        });
        
        //减少难度
        miTurnEasier.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int curLevel = getLevel();
                if (!playing && curLevel > 1) {
                    setLevel(curLevel - 1);
                }
            }
        });
        
        //退出按钮动作响应
        miExit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });


    }
    
    /**
     * 主游戏类的构造方法
     *
     * @param title String ,窗口标题
     */
    public RussiaBlocksGame(String title) {
        super(title);                                          //设置标题
        setSize(500, 600);                                     //设置窗口大小                  
        setLocationRelativeTo(null);                             //设置窗口居中


        creatMenu();
        Container container = getContentPane();  //创建菜单栏
        container.setLayout(new BorderLayout(6, 0));              //设置窗口的布局管理器
        canvas = new GameCanvas(20, 15);                          //新建游戏画布
        ctrlPanel = new ControlPanel(this);                        //新建控制面板
        container.add(canvas, BorderLayout.CENTER);                //左边加上画布
        container.add(ctrlPanel, BorderLayout.EAST);               //右边加上控制面板


        //注册窗口事件。当点击关闭按钮时,结束游戏,系统退出。
        addWindowListener(new WindowAdapter() {                    
            @Override
            public void windowClosing(WindowEvent we) {
                stopGame();
                System.exit(0);
            }
        });
        
        //根据窗口大小,自动调节方格的尺寸
        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent ce) {
                canvas.adjust();
            }
        });


        setVisible(true);
        canvas.adjust();
    }


    /**
     * 让游戏复位
     */
    public void reset() {                            //画布复位,控制面板复位
        ctrlPanel.setPlayButtonEnable(true);
        ctrlPanel.setPauseButtonEnable(false);
        ctrlPanel.setPauseButtonLabel(true);
        ctrlPanel.setStopButtonEnable(false);
        ctrlPanel.setTurnLevelDownButtonEnable(true);
        ctrlPanel.setTurnLevelUpButtonEnable(true);
        miPlay.setEnabled(true);
        miPause.setEnabled(false);
        miResume.setEnabled(false);
        miStop.setEnabled(false);
        ctrlPanel.reset();
        canvas.reset();
    }


    /**
     * 判断游戏是否还在进行
     *
     * @return boolean,true -还在运行,false-已经停止
     */
    public boolean isPlaying() {
        return playing;
    }


    /**
     * 得到当前活动的块
     *
     * @return ErsBlock,当前活动块的引用
     */
    public ErsBlock getCurBlock() {
        return block;
    }


    /**
     * 得到当前画布
     *
     * @return GameCanvas,当前画布的引用
     */
    public GameCanvas getCanvas() {
        return canvas;
   
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值