




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
=1=package russia;/* * 控制面板类 */import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;public class ControlPanel extends JPanel private TipBlockPanel tipBlockPanel; private JPanel tipPanel,InfoPanel,buttonPanel; private final JTextField levelField,scoreField; private JButton playButton,pauseButton,stopButton, turnHarderButton,turnEasilyButton; private EtchedBorder border=new EtchedBorder(EtchedBorder.RAISED,Color.WHITE, new Color(148, 145, 140) ; private RussiaBlocksGame game; private Timer timer; public ControlPanel(final RussiaBlocksGame game) this.game = game; /* *图形界面部分 */ setLayout(new GridLayout(3,1,0,4); tipBlockPanel = new TipBlockPanel(); tipPanel = new JPanel( new BorderLayout() ); tipPanel.add( new JLabel(Next Block:) , 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.setEditable(false); InfoPanel.add(new JLabel(Level:); InfoPanel.add(levelField); InfoPanel.add(new JLabel(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 = new 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();/添加 add(tipPanel); add(InfoPanel); add(buttonPanel); /* *添加事件监听器 */ playButton.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) game.playGame(); requestFocus();/让ControlPanel重新获得焦点以响应键盘事件 ); pauseButton.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) if(pauseButton.getText().equals(Pause) game.pauseGame(); else game.resumeGame(); requestFocus();/让ControlPanel重新获得焦点以响应键盘事件 ); stopButton.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) game.stopGame(); requestFocus();/让ControlPanel重新获得焦点以响应键盘事件 ); turnHarderButton.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) int level = 0; try level = Integer.parseInt(levelField.getText(); setLevel(level + 1); catch(NumberFormatException e) e.printStackTrace(); requestFocus();/让ControlPanel重新获得焦点以响应键盘事件 ); turnEasilyButton.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) int level = 0; try level = Integer.parseInt(levelField.getText(); setLevel(level - 1); catch(NumberFormatException e) e.printStackTrace(); requestFocus();/让ControlPanel重新获得焦点以响应键盘事件 ); /* * 时间驱动程序,每格500毫秒对level,score值进行更新 */ timer = new Timer(500, new ActionListener() public void actionPerformed(ActionEvent event) scoreField.setText(+game.getScore(); game.levelUpdate(); ); timer.start(); /* * 设置预显方块的样式 */ public void setBlockStyle(int style) tipBlockPanel.setStyle(style); tipBlockPanel.repaint(); /* * 重置,将所有数据恢复到最初值 */ public void reset() levelField.setText(+RussiaBlocksGame.DEFAULT_LEVEL); scoreField.setText(0); 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 ? Pause : Rusume ); /* *设置方块的大小,改变窗体大小时调用可自动调整方块到合适的尺寸 */ public void fanning() tipBlockPanel.fanning(); /* *根据level文本域的值返回当前的级别 */ public int getLevel() int level = 0; try level=Integer.parseInt(levelField.getText(); catch(NumberFormatException e) e.printStackTrace(); return level; /* * 设置level文本域的值 */ public void setLevel(int level) if(level 0 & level = RussiaBlocksGame.MAX_LEVEL) levelField.setText( + level); /* * 内部类 为预显方块的显示区域 */ private class 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.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(); /* * 绘制预显方块 */ public void paintComponent(Graphics g) super.paintComponent(g); int key = 0x8000; if(!isTiled) fanning(); for(int i = 0; i boxes.length; i +) for(int j = 0; j=1; /* *设置方块的大小,改变窗体大小时调用可自动调整方块到合适的尺寸 */ public void fanning() boxWidth = getSize().width / RussiaBlock.COLS; boxHeight = getSize().height /RussiaBlock.ROWS; isTiled=true; /* *内部类 键盘键听器,响应键盘事件 */ class ControlKeyListener extends KeyAdapter public void keyPressed(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(); break; case KeyEvent.VK_RIGHT: block.moveRight(); break; case KeyEvent.VK_UP: block.turnNext(); break; case KeyEvent.VK_SPACE:/一键到底 while(block.moveDown() break; default: break; =2=package russia;/* * 游戏中方块显示的画布类 */import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;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(0,204,204); private EtchedBorder border=new EtchedBorder(EtchedBorder.RAISED,Color.WHITE, new Color(148, 145, 140) ; /* *采用单件模式,构造函数私有 */ private GameCanvas() boxes = new RussiaBoxrowscols; for(int i = 0; i boxes.length; i +) for(int j = 0; j= 0 & row = 0 & col cols) return boxesrowcol; else return null; /* *在画布中绘制方块 */ public void paintComponent(Graphics g) super.paintComponent(g); fanning(); for(int i = 0; i boxes.length; i +) for(int j = 0; j 0; i -) for(int j = 0; j cols; j +) boxesij = (RussiaBox)boxesi-1j.clone(); /* *重置 为初始时的状态 */ public void reset() for(int i = 0; i boxes.length; i+) for(int j = 0 ;j boxesi.length; j+) boxesij.setColor(false); repaint(); /* * 根据窗体的大小自动调整方格的大小 */ public void fanning() boxWidth = getSize().width / cols; boxHeight = getSize().height / rows; =3=package russia;/* * 方块类 */ 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; 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, / Z型的四种状态 0x6220, 0x1700, 0x2230, 0x0740, / 7型的四种状态 0x6440, 0x0e20, 0x44c0, 0x8e00, / 反7型的四种状态 0x0660, 0x0660, 0x0660, 0x0660, / 方块的四种状态 ; /* *构造函数 */ public RussiaBlock(int y,int x,int level,int style) this.y = y; this.x = x; this.level = level; moving = true; pausing = false; this.style = style; canvas = GameCanvas.getCanvasInstance(); boxes = new RussiaBoxROWSCOLS; int key = 0x8000; for(int i = 0; i boxes.length; i+) for(int j = 0; j = 1; display(); /* *线程的 run方法控制放块的下落及下落速度 */ public void run() while(moving) try sleep( BETWEEN_LEVELS_TIME * (RussiaBlocksGame.MAX_LEVEL - level + LEVEL_FLATNESS_GENE) ); if(!pausing) moving = ( moveTo(y + 1,x) & moving ); catch(InterruptedException e) e.printStackTrace(); /* *暂停移动 */ public void pauseMove() pausing = true; /* *从暂停状态恢复 */ public void resumeMove() pausing = false; /* *停止移动 */ public void stopMove() moving = false; /* *向左移一格 */ public void moveLeft() moveTo(y , x - 1); /* *向右移一格 */ public void moveRight() moveTo(y , x + 1); /* *向下移一格,返回与其他几个不同,为了一键到底 */ public boolean moveDown() if(moveTo(y + 1, x) return true; else return false; /* *移到newRow,newCol位置 */ public synchronized boolean moveTo(int newRow, int newCol) /erase();/必须在判断前进行擦除,否则isMoveable将产生错误行为 if(!moving | !isMoveable(newRow,newCol) display(); return false; y = newRow; x = newCol; display(); canvas.repaint(); return true; /* *判断能否移到newRow,newCol位置 */ private boolean isMoveable(int newRow, int newCol) erase(); for(int i = 0; i boxes.length; i +) for(int j = 0; j boxesi.length; j + ) if( boxesij.isColorBox() ) RussiaBox box = canvas.getBox(newRow + i, newCol + j); if(box = null | box.isColorBox() return false; return true; /* *通过旋转变为下一种状态 */ public void turnNext() int newStyle = 0; for(int i = 0; i STYLES.length; i +) for(int j = 0 ;j STYLESi.length; j+) if(style = STYLESij) newStyle = STYLESi(j + 1)%BLOCK_STATUS_NUMBER; break; turnTo(newStyle); /* *通过旋转变能否变为newStyle状态 */ private synchronized boolean turnTo(int newStyle) /erase();/擦除之后在判断isTurnNextAble if(!moving | !isTurnable(newStyle) display(); return false; style=newStyle; int key = 0x8000; for(int i = 0; i boxes.length; i +) for(int j = 0 ;j =1; display(); canvas.repaint(); return true; /* *判断通过旋转能否变为下一种状态 */ private boolean isTurnable(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化工能力测试题及答案
- 气焊工中级试题及答案
- 交通三控试题及答案
- 傅雷家书考试题及答案
- 2025年国家特种设备安全管理人员(A证)考试练习题库(含答案)
- 医养结合人才培训班理论考试题(含答案)
- 医疗机构消毒技术规范培训试题及答案
- 2025心肺复苏理论考试试题(含答案)
- 2025年安全知识竞赛题库及答案
- 2024年农村农业《果树生产技术》知识试题与答案
- 《2025游戏账号交易合同书》
- 2025年事业单位会计岗考试题库
- 2025年秋季开学教师大会上教学副校长讲话:回到课堂的原点走向教学的深处
- 2025事业单位招聘考试时事政治考试题库及答案(考点梳理)
- 2025年少先队知识竞赛试题库附答案
- GB/T 9775-2025纸面石膏板
- 防蚊培训课件
- 弥漫性大B细胞淋巴瘤病例讨论
- 2025年医院血透室人员培训工作计划
- 2025年公务员考试时政热点必做题(附答案)
- 护理烫伤不良事件分析及整改措施
评论
0/150
提交评论