📄 ersblocksgame.java
字号:
/**
* File: ErsBlocksGame.java
* User: Administrator
* Describe: 俄罗斯方块的 Java 实现
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 游戏主类,继承自JFrame类,负责游戏的全局控制。
* 内含
* 1, 一个GameCanvas画布类的实例引用,
* 2, 一个保存当前活动块(ErsBlock)实例的引用,
* 3, 一个保存当前控制面板(ControlPanel)实例的引用
* @author 郎利斌
* @version 2.0
*/
public class ErsBlocksGame extends JFrame
{
/**
* 每填满一行计多少分
*/
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;
/**
* 默认级数是5
*/
public final static int DEFAULT_LEVEL = 5;
private GameCanvas canvas;//画布类对象
private ErsBlock block; //块类对象
private boolean playing = false;//是否正在玩
private ControlPanel ctrlPanel;//控制面板对象
private AboutDialog aboutdialog=new AboutDialog();
Color newFrontColor=Color.black;
private JMenuBar bar = new JMenuBar();//菜单栏
private JMenu//菜单项
mGame = new JMenu("Game"),
mControl = new JMenu("Control"),
mWindowStyle = new JMenu("WindowStyle"),
mGuanyu = new JMenu("关于");
private JMenuItem//子菜单
miNewGame = new JMenuItem("New Game"),
miSetBlockColor = new JMenuItem("Set Block Color ..."),
miSetBackColor = new JMenuItem("Set Background Color ..."),
miTurnHarder = new JMenuItem("Turn up the level"),
miTurnEasier = new JMenuItem("Turn down the level"),
miExit = new JMenuItem("Eixt"),
miPlay = new JMenuItem("Play"),
miPause = new JMenuItem("Pause"),
miResume = new JMenuItem("Resume"),
miStop = new JMenuItem("Stop"),
mguanyu=new JMenuItem("关于"),
minfo=new JMenuItem("简介");
private JCheckBoxMenuItem//单选项菜单
miAsWindows = new JCheckBoxMenuItem("Windows"),
miAsMotif = new JCheckBoxMenuItem("Motif"),
miAsMetal = new JCheckBoxMenuItem("Metal", true);
/**
* 主游戏类的构造函数
* @param title String,窗口标题
*/
public ErsBlocksGame(String title)
{
setTitle(title);
setSize(400, 400);//窗口大小
//利用屏幕和主窗体的大小差值,使窗口居中
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);
createMenu();
Container container = getContentPane();
//container.setLayout(new BorderLayout(3, 0));//????????????????????????????????
canvas = new GameCanvas(20, 12);//设置画布区域有20行,12列
ctrlPanel = new ControlPanel(this);//初始化设置控制面板区
ctrlPanel.setPause(false);
ctrlPanel.setStop(false);
container.add(canvas, BorderLayout.CENTER);//框架默认布局是边界布局
container.add(ctrlPanel, BorderLayout.EAST);
//添加窗口适配器
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
stopGame();
System.exit(0);
}
});
//添加组件适配器
addComponentListener(new ComponentAdapter() {// 注意注意他的使用
public void componentResized(ComponentEvent ce) {
canvas.fanning();
}
});
show();
canvas.fanning();//根据窗口的大小,自动调整方格的尺寸
}
/**
* 让游戏“复位”
*/
public void reset()
{
ctrlPanel.reset();//控制面板复位
canvas.reset();//画布复位
}
/**
* 判断游戏是否还在进行
* @return boolean, true-还在运行,false-已经停止
*/
public boolean isPlaying() {
return playing;
}
/**
* 得到当前活动的块
* @return ErsBlock, 当前活动块的引用
*/
public ErsBlock getCurBlock() {
return block;
//block是ErsBlock的对象,block是游戏开始后
//,即run()开始后,新创建的ErsBloc类 的对象
}
/**
* 得到当前画布
* @return GameCanvas, 当前画布的引用
*/
public GameCanvas getCanvas() {
return canvas;
}
/**
* 开始游戏
*/
public void playGame()
{
play();
ctrlPanel.setPlayButtonEnable(false);
ctrlPanel.setPause(true);
ctrlPanel.setStop(true);
miPlay.setEnabled(false);
miPause.setEnabled(true);
miStop.setEnabled(true);
miSetBlockColor.setEnabled(false);
miSetBackColor.setEnabled(false);
miTurnEasier.setEnabled(false);
miTurnHarder.setEnabled(false);
ctrlPanel.setTurnLeveldown(false);
ctrlPanel.setTurnLevelUp(false);
ctrlPanel.requestFocus();//??????????????????????????????????
}
/**
* 游戏暂停
*/
public void pauseGame()
{
if (block != null) block.pauseMove();
ctrlPanel.setPauseButtonLabel(false);
miPause.setEnabled(false);
miResume.setEnabled(true);
miSetBlockColor.setEnabled(true);
miSetBackColor.setEnabled(true);
}
/**
* 让暂停中的游戏继续
*/
public void resumeGame()
{
if (block != null) block.resumeMove();
ctrlPanel.setPauseButtonLabel(true);
miPause.setEnabled(true);
miResume.setEnabled(false);
miSetBlockColor.setEnabled(false);
miSetBackColor.setEnabled(false);
ctrlPanel.requestFocus();
}
/**
* 用户停止游戏
*/
public void stopGame()
{
playing = false;
if (block != null) block.stopMove();//块类对象
miPlay.setEnabled(true); ctrlPanel.setPlayButtonEnable(true);
miPause.setEnabled(false); ctrlPanel.setPauseButtonLabel(true);
miStop.setEnabled(false);
miResume.setEnabled(false);
miTurnEasier.setEnabled(true);
miTurnHarder.setEnabled(true);
miSetBlockColor.setEnabled(true);
miSetBackColor.setEnabled(true);
ctrlPanel.setTurnLeveldown(true);
ctrlPanel.setTurnLevelUp(true);
ctrlPanel.setPause(false);
ctrlPanel.setStop(false);
reset();
}
/**
* 得到当前游戏者设置的游戏难度
* @return int, 游戏难度1-MAX_LEVEL
*/
public int getLevel()
{
return ctrlPanel.getLevel();
}
/**
* 让用户设置游戏难度
* @param level int, 游戏难度1-MAX_LEVEL
*/
public void setLevel(int level)
{
if (level < 11 && level > 0)
ctrlPanel.setLevel(level);
}
/**
* 得到游戏积分
* @return int, 积分。
*/
public int getScore()
{
if (canvas != null)
return canvas.getScore();
return 0;
}
/**
* 得到自上次升级以来的游戏积分,升级以后,此积分清零
* @return int, 积分。
*/
public int getScoreForLevelUpdate()
{
if (canvas != null) return canvas.getScoreForLevelUpdate();
return 0;
}
/**
* 当分数累计到一定的数量时,升一次级
* @return boolean, ture-update successufl, false-update fail
*/
public boolean levelUpdate()
{
int curLevel = getLevel();
if (curLevel < MAX_LEVEL)
{
setLevel(curLevel + 1);
canvas.resetScoreForLevelUpdate();
return true;
}
return false;
}
/**
* 游戏开始
*/
private void play()
{
reset();
playing = true;
Thread thread = new Thread(new Game());
thread.start();
}
/**
* 报告游戏结束了
*/
private void reportGameOver()
{
JOptionPane.showMessageDialog(this, "Game over!");
stopGame();
reset();
}
/**
* 建立并设置窗口菜单
*/
private void createMenu()
{
//添加菜单项
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -