1、) , BorderLayout.NORTH ); tipPanel.add( tipBlockPanel , BorderLayout.CENTER ); tipPanel.setBorder(border); InfoPanel = new JPanel( new GridLayout(4,1,0,0) ); levelField = new JTextField(+RussiaBlocksGame.DEFAULT_LEVEL); levelField.setEditable(false); scoreField = new JTextField(0); scoreField.setEdi
2、table(false); InfoPanel.add(new JLabel(Level:); InfoPanel.add(levelField);Score: InfoPanel.add(scoreField); InfoPanel.setBorder(border); buttonPanel = new JPanel(new GridLayout(5,1,0,0); playButton = new JButton(Play pauseButton = new JButton(Pause stopButton = new JButton(Stop turnHarderButton = ne
3、w JButton(Turn harder turnEasilyButton = new JButton(Turn easily buttonPanel.add(playButton); buttonPanel.add(pauseButton); buttonPanel.add(stopButton); buttonPanel.add(turnHarderButton); buttonPanel.add(turnEasilyButton); buttonPanel.setBorder(border); addKeyListener(new ControlKeyListener();/添加 ad
4、d(tipPanel); add(InfoPanel); add(buttonPanel); *添加事件监听器 */ playButton.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) game.playGame(); requestFocus();/让ControlPanel重新获得焦点以响应键盘事件 ); pauseButton.addActionListener( if(pauseButton.getText().equals() game.pauseGame(
5、); else game.resumeGame(); ); stopButton.addActionListener( game.stopGame(); turnHarderButton.addActionListener( int level = 0; try level = Integer.parseInt(levelField.getText(); setLevel(level + 1); catch(NumberFormatException e) e.printStackTrace(); turnEasilyButton.addActionListener( setLevel(lev
6、el - 1); * 时间驱动程序,每格500毫秒对level,score值进行更新 timer = new Timer(500, scoreField.setText(+game.getScore(); game.levelUpdate(); timer.start(); * 设置预显方块的样式 public void setBlockStyle(int style) tipBlockPanel.setStyle(style); tipBlockPanel.repaint(); * 重置,将所有数据恢复到最初值 public void reset() levelField.setText(
7、setPlayButtonEnabled(true); setPauseButtonLabel(true); tipBlockPanel.setStyle(0); *设置playButton是否可用 public void setPlayButtonEnabled(boolean enable) playButton.setEnabled(enable); *设置pauseButton的文本 public void setPauseButtonLabel(boolean pause) pauseButton.setText( pause ? :Rusume *设置方块的大小,改变窗体大小时调用
8、可自动调整方块到合适的尺寸 public void fanning() tipBlockPanel.fanning(); *根据level文本域的值返回当前的级别 public int getLevel() try level=Integer.parseInt(levelField.getText(); return level; * 设置level文本域的值 public void setLevel(int level) if(level 0 & level = RussiaBlocksGame.MAX_LEVEL) + level); * 内部类 为预显方块的显示区域 private cl
9、ass TipBlockPanel extends JPanel private Color bgColor = Color.darkGray, blockColor = Color.lightGray; private RussiaBox boxes = new RussiaBoxRussiaBlock.ROWSRussiaBlock.COLS; private int boxWidth, boxHeight,style; private boolean isTiled = false; * 构造函数 public TipBlockPanel() for(int i = 0; i boxes
10、.length; i +) for(int j = 0; j boxesi.length; j +) boxesij=new RussiaBox(false); style = 0x0000; public TipBlockPanel(Color bgColor, Color blockColor) this(); this.bgColor = bgColor; this.blockColor = blockColor; * 设置方块的风格 public void setStyle(int style) this.style = style; repaint(); * 绘制预显方块 publi
11、c void paintComponent(Graphics g) super.paintComponent(g); int key = 0x8000; if(!isTiled) fanning(); j=1; boxWidth = getSize().width / RussiaBlock.COLS; boxHeight = getSize().height /RussiaBlock.ROWS; isTiled=true; *内部类 键盘键听器,响应键盘事件 class ControlKeyListener extends KeyAdapter public void keyPressed(
12、KeyEvent ke) if (!game.isPlaying() return; RussiaBlock block = game.getCurBlock(); switch (ke.getKeyCode() case KeyEvent.VK_DOWN: block.moveDown(); break; case KeyEvent.VK_LEFT: block.moveLeft(); case KeyEvent.VK_RIGHT: block.moveRight(); case KeyEvent.VK_UP: block.turnNext(); case KeyEvent.VK_SPACE
13、:/一键到底 while(block.moveDown() default: * 游戏中方块显示的画布类public class GameCanvas extends JPanel private RussiaBox boxes; private int rows = 20 , cols = 12; private static GameCanvas canvas=null; private int boxWidth, boxHeight;/默认为零需要调用fanning函数设置 private Color blockColor = Color.RED, bgColor = new Color
14、(0,204,204); *采用单件模式,构造函数私有 private GameCanvas() boxes = new RussiaBoxrowscols;boxesi.length; boxesij = new RussiaBox(false); setBorder(border); *获得GameCanvas实例 public static GameCanvas getCanvasInstance() if(canvas = null) canvas = new GameCanvas(); return canvas; *设置画布的背景色 public void setBgColor(C
15、olor bgColor) * 获得画布的背景色 public Color getBgColor() return bgColor; *设置方块的颜色 public void setBlockColor(Color blockColor) *方块的颜色 public Color getBlockColor() return blockColor; *设置画布中方块的行数 public void setRows(int rows) this.rows = rows; *得到画布中方块的行数 public int getRows() return rows; *设置画布中方块的列数 public
16、void setCols(int cols) this.cols = cols; *得到画布中方块的列数 public int getCols() return cols; *得到row行,col列的方格 public RussiaBox getBox(int row, int col) if(row = 0 & row col 0; i -) cols; boxesij = (RussiaBox)boxesi-1j.clone(); *重置 为初始时的状态 i+) for(int j = 0 ;j j+) boxesij.setColor(false); * 根据窗体的大小自动调整方格的大小
17、 boxWidth = getSize().width / cols; boxHeight = getSize().height / rows; * 方块类 public class RussiaBlock extends Thread private int style,y,x,level; private boolean moving,pausing; private RussiaBox boxes; private GameCanvas canvas; public final static int ROWS = 4; public final static int COLS = 4;
18、public final static int BLOCK_KIND_NUMBER = 7; public final static int BLOCK_STATUS_NUMBER = 4; public final static int BETWEEN_LEVELS_TIME = 50; public final static int LEVEL_FLATNESS_GENE = 3; *方块的所有风格及其不同的状态 public final static int STYLES = / 共28种状态 0x0f00, 0x4444, 0x0f00, 0x4444, / 长条型的四种状态 0x04e0, 0x0464, 0x00e4, 0x04c4, / T型的四种状态 0x4620, 0x6c00, 0x4620, 0x6c00, / 反Z 0x2640, 0xc600, 0x2640, 0xc600, /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1