亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ersblocksgame.java

?? 經(jīng)典的俄羅斯方塊,不錯的界面!!!!!還有聲音
?? JAVA
字號:
/**
 * File: ErsBlocksGame.java
 * User: 隋國丞
 * Date: 2004.12.3
 * Describe: 俄羅斯方塊的 Java 實現(xiàn)
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * 游戲主類,繼承自JFrame類,負責(zé)游戲的全局控制。
 * 內(nèi)含
 * 1, 一個GameCanvas畫布類的實例引用,
 * 2, 一個保存當(dāng)前活動塊(ErsBlock)實例的引用,
 * 3, 一個保存當(dāng)前控制面板(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;
	/**
	 * 最大級數(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 JMenuBar bar = new JMenuBar();
	private JMenu
	        mGame = new JMenu("Game"),
			mControl = new JMenu("Control"),
			mWindowStyle = new JMenu("WindowStyle"),
			mInfo = new JMenu("Information");
	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"),

			miAuthor = new JMenuItem("Author : apple@radiantek.com"),
			miSourceInfo = new JMenuItem("You can get the source code / document by email");


	private JCheckBoxMenuItem
	        miAsWindows = new JCheckBoxMenuItem("Windows"),
			miAsMotif = new JCheckBoxMenuItem("Motif"),
			miAsMetal = new JCheckBoxMenuItem("Metal", true);

	/**
	 * 主游戲類的構(gòu)造函數(shù)
	 * @param title String,窗口標(biāo)題
	 */
	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();
		container.setLayout(new BorderLayout(6, 0));

		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);
			}
		});

		addComponentListener(new ComponentAdapter() {
			public void componentResized(ComponentEvent ce) {
				canvas.fanning();
			}
		});

		show();
		canvas.fanning();
	}

	/**
	 * 讓游戲“復(fù)位”
	 */
	public void reset() {
		ctrlPanel.reset();
		canvas.reset();
	}

	/**
	 * 判斷游戲是否還在進行
	 * @return boolean, true-還在運行,false-已經(jīng)停止
	 */
	public boolean isPlaying() {
		return playing;
	}

	/**
	 * 得到當(dāng)前活動的塊
	 * @return ErsBlock, 當(dāng)前活動塊的引用
	 */
	public ErsBlock getCurBlock() {
		return block;
	}

	/**
	 * 得到當(dāng)前畫布
	 * @return GameCanvas, 當(dāng)前畫布的引用
	 */
	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);
	}

	/**
	 * 讓暫停中的游戲繼續(xù)
	 */
	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);
	}

	/**
	 * 得到當(dāng)前游戲者設(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;
	}

	/**
	 * 當(dāng)分?jǐn)?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!");
	}

	/**
	 * 建立并設(shè)置窗口菜單
	 */
	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);
			}
		});
		miSetBlockColor.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				Color newFrontColor =
				        JColorChooser.showDialog(ErsBlocksGame.this,
				                "Set color for block", canvas.getBlockColor());
				if (newFrontColor != null)
					canvas.setBlockColor(newFrontColor);
			}
		});
		miSetBackColor.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				Color newBackColor =
				        JColorChooser.showDialog(ErsBlocksGame.this,
				                "Set color for block", canvas.getBackgroundColor());
				if (newBackColor != null)
					canvas.setBackgroundColor(newBackColor);
			}
		});
		miTurnHarder.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				int curLevel = getLevel();
				if (curLevel < MAX_LEVEL) setLevel(curLevel + 1);
			}
		});
		miTurnEasier.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				int curLevel = getLevel();
				if (curLevel > 1) setLevel(curLevel - 1);
			}
		});
		miExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				System.exit(0);
			}
		});
		miPlay.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				playGame();
			}
		});
		miPause.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				pauseGame();
			}
		});
		miResume.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				resumeGame();
			}
		});
		miStop.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				stopGame();
			}
		});
		miAsWindows.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				String plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
				setWindowStyle(plaf);
				canvas.fanning();
				ctrlPanel.fanning();
				miAsWindows.setState(true);
				miAsMetal.setState(false);
				miAsMotif.setState(false);
			}
		});
		miAsMotif.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
				setWindowStyle(plaf);
				canvas.fanning();
				ctrlPanel.fanning();
				miAsWindows.setState(false);
				miAsMetal.setState(false);
				miAsMotif.setState(true);
			}
		});
		miAsMetal.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				String plaf = "javax.swing.plaf.metal.MetalLookAndFeel";
				setWindowStyle(plaf);
				canvas.fanning();
				ctrlPanel.fanning();
				miAsWindows.setState(false);
				miAsMetal.setState(true);
				miAsMotif.setState(false);
			}
		});
	}

	/**
	 * 根據(jù)字串設(shè)置窗口外觀
	 * @param plaf String, 窗口外觀的描述
	 */
	private void setWindowStyle(String plaf) {
		try {
			UIManager.setLookAndFeel(plaf);
			SwingUtilities.updateComponentTreeUI(this);
		} catch (Exception e) {
		}
	}

	/**
	 * 一輪游戲過程,實現(xiàn)了Runnable接口
	 * 一輪游戲是一個大循環(huán),在這個循環(huán)中,每隔100毫秒,
	 * 檢查游戲中的當(dāng)前塊是否已經(jīng)到底了,如果沒有,
	 * 就繼續(xù)等待。如果到底了,就看有沒有全填滿的行,
	 * 如果有就刪除它,并為游戲者加分,同時隨機產(chǎn)生一個
	 * 新的當(dāng)前塊,讓它自動下落。
	 * 當(dāng)新產(chǎn)生一個塊時,先檢查畫布最頂上的一行是否已經(jīng)
	 * 被占了,如果是,可以判斷Game Over了。
	 */
	private class Game implements Runnable {
		public void run() {
			int col = (int) (Math.random() * (canvas.getCols() - 3)),
			        style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];

			while (playing) {
				if (block != null) {    //第一次循環(huán)時,block為空
					if (block.isAlive()) {
						try {
							Thread.currentThread().sleep(100);
						} catch (InterruptedException ie) {
							ie.printStackTrace();
						}
						continue;
					}
				}

				checkFullLine();        //檢查是否有全填滿的行

				if (isGameOver()) {     //檢查游戲是否應(yīng)該結(jié)束了
					miPlay.setEnabled(true);
					miPause.setEnabled(true);
					miResume.setEnabled(false);
					ctrlPanel.setPlayButtonEnable(true);
					ctrlPanel.setPauseButtonLabel(true);

					reportGameOver();
					return;
				}

				block = new ErsBlock(style, -1, col, getLevel(), canvas);
				block.start();

				col = (int) (Math.random() * (canvas.getCols() - 3));
				style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];

				ctrlPanel.setTipStyle(style);
			}
		}

		/**
		 * 檢查畫布中是否有全填滿的行,如果有就刪除之
		 */
		public void checkFullLine() {
			for (int i = 0; i < canvas.getRows(); i++) {
				int row = -1;
				boolean fullLineColorBox = true;
				for (int j = 0; j < canvas.getCols(); j++) {
					if (!canvas.getBox(i, j).isColorBox()) {
						fullLineColorBox = false;
						break;
					}
				}
				if (fullLineColorBox) {
					row = i--;
					canvas.removeLine(row);
				}
			}
		}

		/**
		 * 根據(jù)最頂行是否被占,判斷游戲是否已經(jīng)結(jié)束了。
		 * @return boolean, true-游戲結(jié)束了,false-游戲未結(jié)束
		 */
		private boolean isGameOver() {
			for (int i = 0; i < canvas.getCols(); i++) {
				ErsBox box = canvas.getBox(0, i);
				if (box.isColorBox()) return true;
			}
			return false;
		}
	}

	/**
	 * 程序入口函數(shù)
	 * @param args String[], 附帶的命令行參數(shù)
	 */
	public static void main(String[] args) {
		new ErsBlocksGame("Russia Blocks by apple@radiantek.com");
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜精品网| 久久精品国产精品亚洲精品| 91精品国产综合久久精品| 国产伦精品一区二区三区视频青涩| 最近中文字幕一区二区三区| 欧美三级视频在线| a亚洲天堂av| 国产成人综合精品三级| 狂野欧美性猛交blacked| 亚洲五码中文字幕| 综合色中文字幕| 中文字幕欧美区| 国产亚洲女人久久久久毛片| 日韩欧美二区三区| 欧美美女一区二区三区| 日本高清不卡在线观看| 97se亚洲国产综合自在线观| 国产剧情在线观看一区二区| 国产美女一区二区三区| 日韩二区三区在线观看| 一区二区免费视频| 亚洲男人电影天堂| 一区精品在线播放| 国产日韩精品视频一区| 亚洲精品在线电影| 日韩精品中文字幕一区二区三区| 欧美日韩在线免费视频| 91福利在线免费观看| 91日韩一区二区三区| 91亚洲男人天堂| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 极品少妇一区二区| 免费成人在线播放| 毛片一区二区三区| 美女在线一区二区| 激情综合色综合久久| 韩国三级在线一区| 国产一区二区中文字幕| 国产成人自拍网| 成人免费高清视频| 91在线视频网址| 色综合久久久久| 欧美日韩中文国产| 欧美电影在线免费观看| 91精品欧美久久久久久动漫| 欧美一级淫片007| 精品国产青草久久久久福利| 久久综合视频网| 国产欧美一区二区精品仙草咪| 久久久高清一区二区三区| 国产亚洲1区2区3区| 国产精品久久国产精麻豆99网站| 综合久久久久久| 亚洲一区二区成人在线观看| 亚洲风情在线资源站| 热久久国产精品| 国产91精品精华液一区二区三区| 成人伦理片在线| 在线免费不卡视频| 91精品国产综合久久精品| 久久精品欧美日韩| 亚洲精品va在线观看| 日韩精品福利网| 国产夫妻精品视频| 色88888久久久久久影院按摩| 欧美日韩精品免费观看视频| 欧美精品一区二区三区很污很色的| 国产亚洲综合性久久久影院| 免费成人在线视频观看| 国产自产高清不卡| 91麻豆6部合集magnet| 欧美精品一级二级| 国产欧美精品一区二区色综合| 一区二区三区影院| 久久成人久久爱| 色素色在线综合| 精品久久久久久综合日本欧美| 中文字幕一区二区三区av| 日韩成人伦理电影在线观看| 国产成人在线看| 欧美区视频在线观看| 国产午夜精品久久久久久久| 亚洲综合一区二区精品导航| 精品亚洲成a人| 欧美三级中文字| 国产欧美视频一区二区三区| 337p日本欧洲亚洲大胆精品| 欧美一区二区三区在线观看视频| 欧美激情一区二区三区蜜桃视频| 性做久久久久久免费观看| 高清国产一区二区| 日韩三级在线免费观看| 亚洲桃色在线一区| 国产美女精品在线| 欧美日韩三级视频| 亚洲图片激情小说| 国产在线播放一区二区三区| 欧美三级韩国三级日本一级| 国产精品久久久久影院| 蜜臀久久99精品久久久久久9| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产精品 日产精品 欧美精品| 欧美亚洲动漫制服丝袜| 国产欧美精品一区二区色综合 | 国产一二精品视频| 欧美日韩高清在线| 亚洲欧美激情在线| 成人午夜激情在线| 日韩欧美电影在线| 日本一道高清亚洲日美韩| 在线中文字幕一区| 亚洲女人小视频在线观看| 国产成人免费视频 | 精品系列免费在线观看| 欧美专区日韩专区| 亚洲欧美色图小说| 99精品视频一区| 中文字幕av不卡| 国产jizzjizz一区二区| 久久免费视频色| 国内精品视频666| 精品国产伦一区二区三区观看方式| 日日夜夜免费精品视频| 欧美精选在线播放| 天堂在线亚洲视频| 91精品麻豆日日躁夜夜躁| 亚洲成人av福利| 欧美精品v国产精品v日韩精品| 亚洲专区一二三| 在线视频你懂得一区二区三区| 亚洲三级小视频| 色天天综合久久久久综合片| 一区二区三区在线视频免费| 在线视频你懂得一区| 亚洲一区二区在线免费看| 在线观看一区日韩| 亚洲二区视频在线| 欧美一二三在线| 狠狠色丁香久久婷婷综| 久久久久国产精品人| 成人一区二区三区视频 | 蜜臀av一区二区在线观看| 欧美丰满一区二区免费视频| 蜜桃视频一区二区三区| 久久新电视剧免费观看| 岛国精品在线播放| 自拍偷拍国产精品| 欧美三级电影在线看| 日韩激情视频网站| 26uuu亚洲综合色| 成人精品视频一区二区三区尤物| 亚洲欧美自拍偷拍色图| 色婷婷狠狠综合| 日本成人在线不卡视频| 久久久久综合网| 一本高清dvd不卡在线观看| 一区二区三区蜜桃| 日韩免费视频一区| 丁香桃色午夜亚洲一区二区三区| 成人免费在线播放视频| 欧美人妇做爰xxxⅹ性高电影| 美日韩一区二区| 国产精品免费久久久久| 欧美亚洲综合久久| 狠狠网亚洲精品| 日韩美女久久久| 日韩一区二区电影| eeuss国产一区二区三区| 国产精品一二三四区| 综合电影一区二区三区 | 91蝌蚪国产九色| 图片区小说区国产精品视频| 久久精品一区八戒影视| 在线免费观看不卡av| 国产一区二区免费看| 一区二区三区小说| 久久久久高清精品| 欧美日韩中文精品| 国产99久久久久久免费看农村| 亚洲一区二区在线播放相泽| 久久综合九色综合久久久精品综合| 91婷婷韩国欧美一区二区| 精品一区二区三区视频| 亚洲综合一区二区精品导航| 国产亚洲欧美一级| 6080日韩午夜伦伦午夜伦| 91在线免费视频观看| 国产综合久久久久久久久久久久| 亚洲电影一级黄| 亚洲欧洲日产国码二区| 久久先锋影音av鲁色资源网| 在线精品视频免费观看| 成人午夜电影小说| 久久精品99国产精品日本| 亚洲一区在线看| 亚洲欧美乱综合| 国产三级一区二区三区| 日韩一区二区三区四区五区六区| 一本一本大道香蕉久在线精品| 国产精品自拍毛片|