/**
* File: ErsBlocksGame.java
* User: Administrator
* Date: Dec 15, 2003
* Describe: 俄罗斯方块的 Java 实现
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 游戏主类,继承JFrame类,负责游戏的全局控制。
* 内含
* 1, 一个GameCanvas画布类的实例引用,
* 2, 一个保存当前活动块(ErsBlock)实例的引用,
* 3, 一个保存当前控制面板(ControlPanel)实例的引用;
*/
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;
//一个GameCanvas画布类的实例引用,
private GameCanvas canvas;
// 一个保存当前活动块(ErsBlock)实例的引用,
private ErsBlock block;
// 一个保存当前控制面板(ControlPanel)实例的引用;
private ControlPanel ctrlPanel;
private boolean playing = false;
private JMenuBar bar = new JMenuBar();
//菜单条包含4个菜单
private JMenu
mGame = new JMenu("游戏"),
mControl = new JMenu("控制"),
mWindowStyle = new JMenu("窗口风格"),
mInfo = new JMenu("帮助");
//4个菜单中分别包含的菜单项
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("停止"),
miAuthor = new JMenuItem("作者 : Java游戏设计组"),
miSourceInfo = new JMenuItem("版本:1.0");
//设置窗口风格的菜单
private JCheckBoxMenuItem
miAsWindows = new JCheckBoxMenuItem("Windows"),
miAsMotif = new JCheckBoxMenuItem("Motif"),
miAsMetal = new JCheckBoxMenuItem("Metal", true);
/**
* 主游戏类的构造函数
* @param title String,窗口标题
*/
public ErsBlocksGame(String title) {
super(title);
//初始窗口的大小,用户可调控
setSize(315, 392);
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
//将游戏窗口置于屏幕中央
setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);
//创建菜单
createMenu();
Container container = getContentPane();
// 布局的水平构件之间有6个象素的距离
container.setLayout(new BorderLayout(6, 0));
// 建立20个方块高,12个方块宽的游戏画布
canvas = new GameCanvas(20, 12);
//建立一个控制面板
ctrlPanel = new ControlPanel(this);
//游戏画布和控制面板之间左右摆放
container.add(canvas, BorderLayout.CENTER);
container.add(ctrlPanel, BorderLayout.EAST);
//增加窗口监听器
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
stopGame();
System.exit(0);
}
});
//增加构件的适配器,一旦构件改变大小,就调用
//fanning()方法,自动调整方格的尺寸
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent ce) {
canvas.fanning();
}
});
setVisible(true); //setVisiable
// 根据窗口的大小,自动调整方格的尺寸
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;
}
/**
* 得到当前画布
* @return GameCanvas, 当前画布的引用
*/
public GameCanvas getCanvas() {
return canvas;
}
/**
* 开始游戏
*/
public void playGame() {
play();
ctrlPanel.setPlayButtonEnable(false);
miPlay.setEnabled(false);
ctrlPanel.requestFocus();
}
/**
* 游戏暂停
*/
public void pauseGame() {
if (block != null) block.pauseMove();
ctrlPanel.setPauseButtonLabel(false);
miPause.setEnabled(false);
miResume.setEnabled(true);
}
/**
* 让暂停中的游戏继续
*/
public void resumeGame() {
if (block != null) block.resumeMove();
ctrlPanel.setPauseButtonLabel(true);
miPause.setEnabled(true);
miResume.setEnabled(false);
ctrlPanel.requestFocus();
}
/**
* 用户停止游戏
*/
public void stopGame() {
playing = false;
if (block != null) block.stopMove();
miPlay.setEnabled(true);
miPause.setEnabled(true);
miResume.setEnabled(false);
ctrlPanel.setPlayButtonEnable(true);
ctrlPanel.setPauseButtonLabel(true);
}
/**
* 得到当前游戏者设置的游戏难度
* @return int, 游戏难度1-MAX_LEVEL=10
*/
public int getLevel() {
return ctrlPanel.getLevel();
}
/**
* 让用户设置游戏难度系数
* @param level int, 游戏难度系数为1-MAX_LEVEL=10
*/
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-更新成功, false-更新失败
*/
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, "游戏结束!");
}
/**
* 建立并设置窗口菜单
*/
private void createMenu() {
bar.add(mGame);
bar.add(mControl);
bar.add(mWindowStyle);
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);
mControl.add(miPause);
mControl.add(miResume);
mControl.add(miStop);
mWindowStyle.add(miAsWindows);
mWindowStyle.add(miAsMotif);
mWindowStyle.add(miAsMetal);
mInfo.add(miAuthor);
mInfo.add(miSourceInfo);
setJMenuBar(bar);
miPause.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK));
miResume.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
miNewGame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
stopGame();
reset();
setLevel(DEFAULT_LEVEL);
}
});
//JColorChooser类提供一个标准的Gui构件,让用户选择色彩
//使用JColorChooser的方法选择方块的颜色
miSetBlockColor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
Color newFrontColor =
JColorChooser.showDialog(ErsBlocksGame.this,
"设置方块颜色", canvas.getBlockColor());
if (newFrontColor != null)
canvas.setBlockColor(newFrontColor);
}
});
//使用JColorChooser的方法选择游戏面板的背景颜色
miSetBackColor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
Color newBackColor =
JColorChooser.showDialog(ErsBlocksGame.this,
"设置背景颜色",
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
《Java项目开发实训教程》源代码(每章的案例源代码)详细版 (414个子文件)
ErsBlocksGame.java.bak 11KB
GameMenu.java.bak 6KB
GameControlkeySet.java.bak 5KB
ErsBlock.java.bak 5KB
ErsMenu.java.bak 5KB
FreeDownPlusControl.java.bak 4KB
ErsMenu.java.bak 3KB
GameHardSet.java.bak 2KB
GameExitSet.java.bak 2KB
SimErsBlock.java.bak 2KB
SimErsBlock.java.bak 2KB
Length.java.bak 854B
ClassA.java.bak 788B
A.java.bak 688B
ClassC.java.bak 447B
Hello.java.bak 117B
execute.bat 68B
execute.bat 64B
execute.bat 63B
execute.bat 62B
execute.bat 62B
execute.bat 61B
execute.bat 60B
execute.bat 58B
execute.bat 58B
execute.bat 57B
execute.bat 56B
execute.bat 54B
execute.bat 52B
execute.bat 51B
execute.bat 51B
execute.bat 48B
execute.bat 48B
execute.bat 48B
execute.bat 47B
execute.bat 46B
ErsBlocksGame.class 8KB
ShowErsControl.class 6KB
ShowMenuFunction.class 5KB
ShowWindowStyle.class 5KB
ControlPanel.class 4KB
TestCheckFullLine.class 4KB
ShowControlPanel.class 4KB
ShowData.class 4KB
GameServerSocketSet.class 4KB
GameClienSocketSet.class 4KB
ErsBlock.class 3KB
GetDataNumber.class 3KB
ShowConnection.class 3KB
ControlPanel.class 3KB
CustomizeColor.class 3KB
ErsBlock.class 3KB
ErsBlock.class 3KB
ErsBlock.class 3KB
ErsMenu.class 3KB
ErsMenu.class 3KB
GameCanvas.class 3KB
ErsBlock.class 3KB
ErsBlock.class 3KB
ErsBlock.class 3KB
CustomizeSize.class 3KB
DeliverData.class 3KB
ShowShortCutKey.class 2KB
ShowTipPanel.class 2KB
TestEarse.class 2KB
GameCanvas.class 2KB
GameCanvas.class 2KB
GameCanvas.class 2KB
DeliverData$Game.class 2KB
ErsBlocksGame$Game.class 2KB
ShowErsControl$Game.class 2KB
TestDisplay.class 2KB
ShowBlocks.class 2KB
ShowControlPanel.class 2KB
GameCanvas.class 2KB
GameCanvas.class 2KB
ErsBlock.class 2KB
ErsBlock.class 2KB
ShowMenuFunction$Game.class 2KB
FreeDownPlusControl.class 2KB
ShowOther.class 2KB
UseJColorChooser.class 2KB
GetDataNumber$Game.class 2KB
GameExitSet.class 2KB
FreeDownPlusControl$Game.class 2KB
GameCanvas.class 2KB
GameCanvas.class 2KB
ShowData$Game.class 2KB
GameExitSet.class 2KB
FreeDown$Game.class 2KB
ConfirmDialog.class 2KB
ShowColumn.class 2KB
FallToDie.class 2KB
FreeDown.class 2KB
ShowOther$Game.class 2KB
ControlPanel$TipPanel.class 2KB
GameCanvas.class 2KB
GameCanvas.class 2KB
GameCanvas.class 2KB
CustomizeColor$TipPanel.class 2KB
共 414 条
- 1
- 2
- 3
- 4
- 5
资源评论
- wangchujie02012-11-16挺好用的!不过确实有些包里面试空的
- bruce_geo2012-11-07感觉还不错,有些包里边竟然是空的。
chenyulancn
- 粉丝: 389
- 资源: 79
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功