俄罗斯方块
背景:《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。
规则:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。
一.先定义俄罗斯方块中最小单位:方块 Cell类
我们将整个游戏界面视为一个二维的坐标系,用横纵坐标(即行、列)来显示方块的位置信息,并为每种四个方块提供不同的方块颜色:
I O
S
Z
T
L
J
方格属性(私有):行号 row(int) 列号 col(int) 图片 image(BUfferImage)并提供相关get/set方法
public class Cell {
private int row; //行
private int col; //列
private BufferedImage image; //图片
public Cell(int row, int col, BufferedImage image) {
super();
this.row = row;
this.col = col;
this.image = image;
}
public Cell() {
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
提供方格的行为方法:向左移动—left() 向右移动—right() 向下移动—drop()
public void left() {
col--;
}
public void right() {
col++;
}
public void drop() {
row++;
}
二.四格方块共有的行为模式 Tetromino类
俄罗斯方块中出现的七种不同形状的四格方块均由四个小方块组成,并且七种四格方块都具有:左移、右移、软下落,三种行为模式。
另外,由于Tetromino类为七种四格方块共有行为模式的提供者,需要被作为父类继承,所以其中属性的访问修饰符为protected(受保护的)
1)我们将四个小方块(cell)作为一个整体放入数组当中进行统一操作:
protected Cell[] cells = new Cell[4];
2)对作为整体的四格方块提供相应的行为方法,即四格方块左移/右移/软下落,其中的每个小方块都左移/右移/软下落,使用for循环对每个小方块都实现left()/right()/drop()方法,并提供toString方法:
public void moveLeft() { //四个方块向左移动
for(int i = 0;i<cells.length;i++) {
cells[i].left();
}
}
public void moveRight() { //四个方块向右移动
for(Cell c:cells) { //增强for循环
c.right();
}
}
public void softDrop() { //四个方块向下移动
for(int i = 0;i<cells.length;i++) {
cells[i].drop();
}
}
@Override
public String toString() {
return "[" + Arrays.toString(cells) + "]";
}
3)定义一个静态方法randomOne(),实现四格方块的随机生成能力,期间用到Math.random()方法生成随机数,根据生成的不同随机数利用switch_case语句对不同的方块生成进行选择:
public static Tetromino randomOne() {
Tetromino t = null;
int num = (int)(Math.random()*7);
switch(num){
case 0:
t = new T();
break;
case 1:
t = new I();
break;
case 2:
t = new O();
break;
case 3:
t = new J();
break;
case 4:
t = new L();
break;
case 5:
t = new S();
break;
case 6:
t = new Z();
break;
}
return t;
}