这是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;