业务需求->业务对象模型(对象关系)->数据建模->类的设计->概要编码->详细功能设计
基本规则:
1)俄罗斯方块都是由一个个Cell构成的:
行宽:10,列高:20,以每个小正方形为单位
2)其次,所有的俄罗斯方块都是一组由4个小型正方形组成的规则图形Tetromino
分别为:S、Z、L、J、I、O、T这几种
数据结构设计:
Cell 格子
|-- int row 行
|-- int col 列
|-- Image image 贴图
Tetromino 四格方块,有7个子类
|-- Cell[] cells 包含4个格子
Tetris 俄罗斯方块
|-- int score 分数
|-- int lines 行数
|-- Cell[][] wall = new Cell[20][10] 20*10的墙
|-- Tetromino tetromino 正在下落的方块
|-- Trtromino nextOne 下一个下落方块
其次是功能:
下落移动功能
旋转流程
定时自动下落
暂停
继续
结束游戏
算法设计:
4格方块的初始形态:I S Z J L T O
就在初始数据的数值状态设计
四格方块的下落计算: 就是将每个格子的row+1
四格子方块的左右移动计算:就是将每个格子的col+1或col-1
下落流程控制:控制方块下落与墙之间的控制关系
1) 如果"能够下落", 就下落一步
2) 否则就"着陆到墙里面"
3) 着落以后, "销毁充满的行", 并且记分
4) 检查游戏是否结束
5) 如果没有结束,还能玩,就生成下一个方块
分数计算
界面的绘制
键盘事件控制
旋转流程控制
加速下降流程控制
记分
开始流程控制(Timer)
主刷新(Timer)频率: 1/100 秒
0.5秒执行一次下落(是主刷新的50倍)
利用定时器定时的调用 下落流程
如果暂停时候, 就不执行下落流程来
实现过程:
1) 在Tetris类中添加属性 Timer, 用于启动主刷新频率
2) 在Tetris类中添加属性 level 是下落的间隔次数
如: 50 表示50次刷新以后,执行一次 下落, 如果减少,
加快下落
3) 在Tetris类中添加属性 stepIndex 是下落计数
每当 stepIndex % level == 0 时候 执行一次 下落
4) 在Tetris类中添加属性 pause 暂停执行状态控制
5) 在action() 方法添加主刷新Timer的启动
在主刷新中 添加代码 控制下落
绘制背景图片
1) 在Tetris类中声明静态变量 background
2) 使用静态代码块 加载磁盘文件到内存对象
将使用到 图片读取API: ImageIO
3) 在paint 方法中绘制背景图片
绘制 正在下落的方块
1) 先在action方法中生产 正在下落的方块和下一个方块
2) 在paint方法中调用 paintTetromino()方法
3) 在Tetris类中 增加paintTetromino()方法
将正在下落的4格方块的每个格子逐一绘制出来
使方块移动
1) 处理键盘事件(API), 获得用户何时按下 ->
2) 当按下 -> 按键时候, 执行当前4格方块 向右移动 方法
3) 向右移动 方法 会改变当前4格方块的每个格子的列坐标
4) 调用继承于JPanel类的 repaint(), 这个方法会尽快的
调用 paint()
5) paint() 会根据当前数据(已经被右移动改变的数据)
绘制全部面板效果
以下是源码:
Cell.java(格子类)
1 packagecom.timmy.tetris;2 importjava.awt.Image;3 public classCell {4 /**
5 *一个格子6 */
7 private introw;8 private intcol;9 privateImage image;10 public Cell(int row,intcol,Image image){11 this.row =row;12 this.col =col;13 this.image =image;14 }15
16 //toString打印行列,方便调试
17 publicString toString(){18 return "["+row+","+col+"]";19 }20
21 public voiddrop(){22 row++;23 }24
25 public voidmoveLeft(){26 col--;27 }28
29 public voidmoveRight(){30 col++;31 }32
33
34 public void setRow(introw){35 this.row =row;36 }37
38 public intgetRow(){39 returnrow;40 }41 public intgetCol() {42 returncol;43 }44 public void setCol(intcol) {45 this.col =col;46 }47 publicImage getImage() {48 returnimage;49 }50 public voidsetImage(Image image) {51 this.image =image;52 }53 }
Tetromino.java(四格方块类)
1 packagecom.timmy.tetris;2 importjava.util.Random;3 //抽象类
4 public abstract classTetromino {5 /**
6 * 四格方块类7 */
8 //是留给子类的,所以用保护
9 protected Cell[] cells = new Cell[4];10 protected State[] states;//旋转状态
11
12 /**私有构造器ÿ