?? ersblocksgame.java
字號:
/**
* File: ErsBlocksGame.java
* User:
* Describe: 俄羅斯方塊的 Java 實現(xiàn)
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 游戲主類,繼承自JFrame類,負責游戲的全局控制。
* 內(nèi)含
* 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;
/**
* 最大級數(shù)是10級
*/
public final static int MAX_LEVEL = 10;
/**
* 默認級數(shù)是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("關(guān)于");
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("關(guān)于"),
minfo=new JMenuItem("簡介");
private JCheckBoxMenuItem//單選項菜單
miAsWindows = new JCheckBoxMenuItem("Windows"),
miAsMotif = new JCheckBoxMenuItem("Motif"),
miAsMetal = new JCheckBoxMenuItem("Metal", true);
/**
* 主游戲類的構(gòu)造函數(shù)
* @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);//設(shè)置畫布區(qū)域有20行,12列
ctrlPanel = new ControlPanel(this);//初始化設(shè)置控制面板區(qū)
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();//根據(jù)窗口的大小,自動調(diào)整方格的尺寸
}
/**
* 讓游戲“復位”
*/
public void reset()
{
ctrlPanel.reset();//控制面板復位
canvas.reset();//畫布復位
}
/**
* 判斷游戲是否還在進行
* @return boolean, true-還在運行,false-已經(jīng)停止
*/
public boolean isPlaying() {
return playing;
}
/**
* 得到當前活動的塊
* @return ErsBlock, 當前活動塊的引用
*/
public ErsBlock getCurBlock() {
return block;
//block是ErsBlock的對象,block是游戲開始后
//,即run()開始后,新創(chuàng)建的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);
}
/**
* 讓暫停中的游戲繼續(xù)
*/
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();
}
/**
* 得到當前游戲者設(shè)置的游戲難度
* @return int, 游戲難度1-MAX_LEVEL
*/
public int getLevel()
{
return ctrlPanel.getLevel();
}
/**
* 讓用戶設(shè)置游戲難度
* @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;
}
/**
* 當分數(shù)累計到一定的數(shù)量時,升一次級
* @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();
}
/**
* 報告游戲結(jié)束了
*/
private void reportGameOver()
{
JOptionPane.showMessageDialog(this, "Game over!");
stopGame();
reset();
}
/**
* 建立并設(shè)置窗口菜單
*/
private void createMenu()
{
//添加菜單項
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -