首页 > 技术文章 > 俄罗斯方块代码总结

marsdu 2013-08-19 18:16 原文

俄罗斯方块的总结,记录是为了延缓忘记的速度。

考虑两个:界面+后台的处理。

1 第一印象

界面上

老大:mainFrame

小弟:gamePanel&Toolpanel

mainFrame是老大,包括了两个panel(用来显示各种信息),并且对于键盘的监听也放在这里面。

游戏的对象

各种图形:piece(由square组成)

图形里包含的小方块:square

2 具体来说

(1)Square

这是里面最小的元素了,当然由它开始入手:

image

一个小Square呢有三个属性:x,y,image

然后就是与这三个属性相关的get与set方法。

(2)Piece

一个图形,由若干Square组成,一共有7中图形

image

以下只取一种为例,其他都与其相似:

image

我们可以从中看到一些相似的特征,因此可以抽象出一个父类:Piece,剩下的都继承这个父类:Piece0~6

先来看父类Piece的属性:

图形的组成:List<Square> squares

变化的集合:List<List<Square>> changes

当前图形是集合中的哪一个:currentIndex

squares的get与set方法

获取当前图形的几个最大最小:min.x min.y max.x max.y(之所以要获取是为了后面判断边界问题用到)

以及位图形整体移动提供服务的方法:向下,向左,向右时所需要的坐标设置函数

然后在子类中:

只要设置好squares的内容以及changes的内容就行啦

(3)PieceCreator&PieceCreatorImpl

将创建图形的逻辑提取出来,因为创建Piece也要挺多事的,对于这种经常会用到的代码,应该抽取出来。

提供的功能:随机产生一个图形,其颜色也是随机产生的,然后返回这个Piece对象

(4)GamePanel

初始化一个二维数组,用来存放Square对象,初始化数组全是image属性为空的Square对象,数组的大小由panel的大小来决定

(5)MainFrame

MainFrame监听并产生对应的动作,当游戏开始,就初始化GamePanel中存放的二维数组(Square[][]),然后通过一个Timer对象每隔一段时间就更新一下界面以显示出刷新的效果。

除此之外还有检测是失败,检测是否碰到障碍,检测是否到达底部,检测是否触碰到边界,以及图形变化的方法(提供是否超过左右边界的判断),左右移动,快速向下移动。

并且还有行的消除,注意二维数组,squars[xSzie][ySize],所以一维是x二维才是y,一定要注意,也就是在实际的内存中保存的那张表,跟界面上的不太一样,它是睡倒的。

image

消除的话,注意悬空行的消除,这里的逻辑稍微有点复杂:

首先明确,在消除的的情况下:最多消除四行,至少消除一行,这两种情况处理起来也最简单,从最上面往下挪动即可,复杂的是消除两行和三行的情况,因为会出现这种情况:

image

image

对于消除两行的,如果下一行不是要消除的就移动到上面,对于三行的则要遍历下面两行。

代码太多,就不贴了。

推荐阅读