⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ersblocksgame.java

📁 java实现的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * 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 + -