1、 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
2、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(P
3、ause miResume = new JMenuItem(Resume miStop = new JMenuItem(Stop miAuthor = new JMenuItem(Author : apple miSourceInfo = new JMenuItem(You can get the source code / document by email private JCheckBoxMenuItem miAsWindows = new JCheckBoxMenuItem(Windows miAsMotif = new JCheckBoxMenuItem(Motif miAsMeta
4、l = 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
5、); 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() pub
6、lic 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
7、, 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(
8、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() = null) block.resumeMove(); ctrlPanel.setP
9、auseButtonLabel(true); miPause.setEnabled(true); miResume.setEnabled(false); * 用户停止游戏 public void stopGame() playing = false;= null) block.stopMove(); miPlay.setEnabled(true); ctrlPanel.setPlayButtonEnable(true); * 得到当前游戏者设置的游戏难度 * return int, 游戏难度1MAX_LEVEL public int getLevel() return ctrlPanel.ge
10、tLevel(); * 让用户设置游戏难度 * param level int, 游戏难度1MAX_LEVEL public void setLevel(int level) if (level 0) ctrlPanel.setLevel(level); * 得到游戏积分 * return int, 积分。 public int getScore() if (canvas != null) return canvas.getScore(); return 0; * 得到自上次升级以来的游戏积分,升级以后,此积分清零 public int getScoreForLevelUpdate() = n
11、ull) return canvas.getScoreForLevelUpdate(); * 当分数累计到一定的数量时,升一次级 * 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; * 游戏开始 pr
12、ivate void play() reset(); playing = true; Thread thread = new Thread(new Game(); thread.start(); * 报告游戏结束了 private void reportGameOver() JOptionPane.showMessageDialog(this, Game Over! * 建立并设置窗口菜单 private void createMenu() bar.add(mGame); bar.add(mControl); bar.add(mWindowStyle); bar.add(mInfo); mGa
13、me.add(miNewGame); mGame.addSeparator(); mGame.add(miSetBlockColor); mGame.add(miSetBackColor); mGame.add(miTurnHarder); mGame.add(miTurnEasier); mGame.add(miExit); mControl.add(miPlay); mControl.add(miPause); mControl.add(miResume); mControl.add(miStop); mWindowStyle.add(miAsWindows); mWindowStyle.
14、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 Action
15、Listener() public void actionPerformed(ActionEvent ae) reset(); setLevel(DEFAULT_LEVEL); miSetBlockColor.addActionListener(new ActionListener() Color newFrontColor = JColorChooser.showDialog(ErsBlocksGame.this, Set color for block, canvas.getBlockColor(); if (newFrontColor != null) canvas.setBlockCo
16、lor(newFrontColor); miSetBackColor.addActionListener(new ActionListener() Color newBackColor =, canvas.getBackgroundColor(); if (newBackColor ! canvas.setBackgroundColor(newBackColor); miTurnHarder.addActionListener(new ActionListener() int curLevel = getLevel(); if (curLevel 1) setLevel(curLevel -
17、1); miExit.addActionListener(new ActionListener() miPlay.addActionListener(new ActionListener() playGame(); miPause.addActionListener(new ActionListener() pauseGame(); miResume.addActionListener(new ActionListener() resumeGame(); miStop.addActionListener(new ActionListener() miAsWindows.addActionLis
18、tener(new ActionListener() String plaf = com.sun.java.swing.plaf.windows.WindowsLookAndFeel; setWindowStyle(plaf); ctrlPanel.fanning(); miAsWindows.setState(true); miAsMetal.setState(false); miAsMotif.setState(false); miAsMotif.addActionListener(new ActionListener() com.sun.java.swing.plaf.motif.Mot
19、ifLookAndFeel miAsWindows.setState(false); miAsMotif.setState(true); miAsMetal.addActionListener(new ActionListener() javax.swing.plaf.metal.MetalLookAndFeel miAsMetal.setState(true); * 根据字串设置窗口外观 * param plaf String, 窗口外观的描述 private void setWindowStyle(String plaf) try UIManager.setLookAndFeel(plaf
20、); SwingUtilities.updateComponentTreeUI(this); catch (Exception e) * 一轮游戏过程,实现了Runnable接口 * 一轮游戏是一个大循环,在这个循环中,每隔100毫秒, * 检查游戏中的当前块是否已经到底了,如果没有, * 就继续等待。如果到底了,就看有没有全填满的行, * 如果有就删除它,并为游戏者加分,同时随机产生一个 * 新的当前块,让它自动下落。 * 当新产生一个块时,先检查画布最顶上的一行是否已经 * 被占了,如果是,可以判断Game Over了。 private class Game implements Runn
21、able 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) /第一次循环时,block为空 if (block.isAlive() try Thread.currentThread().sleep(100); catch (InterruptedException ie) ie.printStackTrace(); continue; checkFullLine(); /检查是否有全填满的行 if (isGameOver() /检查游戏是否应该结束了
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1