模式应用(二) 俄罗斯方块设计的思考:用OO的思想
大学的时候看同学用C写的俄罗斯方块,今天心血来潮,突然想设计下用OO的思想来设计下。俄罗斯方块是一以前俄罗斯的计算机科学家自己开发娱乐的小游戏,没想到后来这么流行。
像俄罗斯(Tetris)方块,迷宫,推箱子这种小游戏,其实建模都差不多,这里我选择一个2维数组10×20的来代表整个游戏区域的显示点,0代表该位置空,1代表有方块。 每一个数组值(a[2][4])代表屏幕上的一个像素,数组类似于:
a[20][10] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
.........................................
}
这里有几个简单的判断:
1. 判断是不是方块撞到墙上,就是看a[i-1]中i-1是不是<0或i+1是不是>10;
2. 判断一层能不能clear, 就是每行是不是数组值都是1
int k = 0;
for(int i=0; i<20; i++){
for(int j = 0; j<10; j++){
if(a[i][j] == 1)
k++;
}
if(k==10)
ClearRow(i); //把数组第i行全置0
}
3......其它的判断类似
好,具体的设计思想参考图1-1
在游戏操作中,有六个键, 上下左右+左右旋转, 该图中Form是边界类与UI和用户控制打交道,Handler业务控制类, ManageArray操作singleton数组和控制一些比较复杂算法的类。
首先该设计把整个业务算法等等从界面分离开,不管你用什么Iphone的UI的SDK还是android的, 都没问题。 他们只与我们的UIForm打交道。
再次这边的Singleton模式把数组暴露给想要他的程序。
最后用策略模式把旋转的算法分开,每个算法只关心自己怎么变化,想扩展就加一个类,如果一个算法要修改,那么只修改某一个方法。开闭原则。
望各位博友指点