项目:经典俄罗斯方块:
画面20行10列的方格
画面中的最小单元:
一个小方块
设计需求分析:
最多有200个方块,这些方块有共同特征,有共同行为,
四个方块为一种方块组合,分别为ZSTOJLI
游戏运行状态:一个方块组合下落,
行为:左右移动,加速下落,旋转
屏幕右边显示下一个要落下的方块组合和得分score 每消除一行加15分,
方块组合下落至面板底部,或碰到堆积在底部的方块 ,则停止下落, 新的方块组合落下;
游戏结束转态:方块组合堆积至面板顶部
最小单元:用Cell来定义方块
成员变量:行号row,列号col
方法:drop(),left(),right()
方块组合:Tetromino:
成员变量:cells = new Cell[4];
方法:
moveLeft();
moveRight();
moveDrop();
rotate();//变形:旋转
hit();//碰撞,堆积
hitBound();//越界,底边堆积
tetrominoRandom();//随机产出一种子类型,静态方法
子类(extends Tetromino):Z,S,T,O,J,L,I
不同的构造方法,其余的方法一致
游戏界面:
TetrominoGame
currentOne:下落的方块组合
currentNext:下次下落的方块组合
cs[]:堆积在面板上的方块
lables[][]:标记面板上的方法是否有方块
=======================================
编写:
(1)编写方块类型:Cell
row;行号
col;列号
image;方块的图片
添加构造方法
get/set方法
左右移动,下落的方法
(2)编写TetrominoGame类型,继承面板类型
加载静态资源(静态变量和静态块)
添加main方法,创建窗口,TetrominoGame对象
重写了void paint(Graphics g)
添加了paintBackground(g)
需要定义此方法
(3)编写Tetromino类型, 添加方法
并编写其七个子类(7种方块组合)
(4)回到TetrominoGame中,
添加成员变量currentOne,调用静态方法TetrominoRandom();随机产生一种方块组合
在paint()中添加paintCurrentOne(g);
定义 void paintCurrentOne(Graphics g)
添加一个成员变量 定时器timer
在action里初始化,
定义监听器对象,用于监听键盘事件
根据键盘输入的上下左右,分别是变形,下落,左右移动,执行完重绘
并在左右移动中添加条件语句(移动方向没有越界,没有面板方块障碍才能移动(在Tetromino类中添加一个判断的方法))
添加一个死循环,每过一秒,currentOne下落一个方格(添加一个睡眠)并重绘
给定时器设置任务,延迟0毫秒执行任务,
间隔1毫秒循环执行 并重绘
内部添加检查任务(方法)
(5)在定时器中添加堆积方法hit()
添加currentNext ,调用静态方法tetrominoRandom()随机生成一个新的方块组合;
在paint()中添加paintCurrentNext(),并定义
添加Cell[] cs数组,用来存储堆积的方块,
Boolean[][] lable的20x10的数组,用来标记每个方格的状态
在paint()中添加paintCs方法并定义该方法
定义hit()方法,在Tetromino中添加判断是否与底边或与已堆积的方块堆积的方法
若堆积,将cs扩容, currentOne的方块存入cs, 并将lable中对应的位置的false改成true;
将currentNext赋值给currentOne, currentNext重新随机新的方块组合
(6)在定时器中添加消除方法deleteAction()
添加成员变量score用来统计得分
添加并定义paintScore();
定义deleteAction(),遍历lable,当某一行都为true时,将一行的方块消除,score+=15(每消除一行加15分),被消除的方块之上的方块,行数+1,lable对cs中剩下的方块重新遍历
(7)在定时器中添加overAction(), 判断游戏是否结束
添加成员变量state 和常量RUNNING=0,GAMEOVER=1
添加并定义paintGameOver()
定义overAction(), 当cs数组中有方块在面板顶端时,state= GAMEOVER
并在运行时的语句前加一个if(state==RUNNING)条件语句
在键盘监听事件中加一个"s"键 用来重新开始游戏(所有成员"初始化")