俄罗斯方块设计祥解(下)
上回说到消行后需要将上面的行移动下来,这很想从一摞硬币底下抽硬币的情形:

则这个变成一个数学问题,请听题,说:
N个硬币,从底部抽出i个,则剩下的硬币分别应该下落几层?
对于这个应用题,粗略来看,应该分三种情况:
1.在抽出的硬币下面的是不需要下落的
2.在抽出的i个硬币之间的硬币,下落的层数是从他开始往下被抽出的硬币的个数
3.在抽出的硬币上面的硬币,下落的层数应该所有抽出硬币的总个数
经过上面的分析,上面三种情况其实是一种情况,即,第j个硬币下落的层数应该是其下被抽出硬币的总数,所以没必要分情况,用一个循环解决战斗。即从最底层向上遍历工作区数组,如果是没有被抽出的,下移;是被抽出的,则被抽出数加1。至于哪个被抽出了,还是要遍历一下受影响的行,看哪些行满可以消除了。
第五个问题:如何旋转
对于这7中方块来说,田字型的无需旋转,长条型的旋转方式固定,需要考虑的是其他五种。
对于旋转,刚开始时我采用坐标变换的方式如下:

对于任何一点(x,y),当旋转时,我们假设是顺时针旋转,那么当我们把脖子扭一下后用新的坐标来带的话,就会发现两者之间的关系,即:
(x,y) – (y, 4- x-1)
但是这样有一个缺点,因为这种方法的旋转是以(0,0)点为圆心的,所以看起来会发生漂移。为了解决漂移问题,我分别找到每个方块的最小x坐标和y坐标,然后平移到(0,0)点,但看起来仍然不像其他俄罗斯方块程序一样,以中心旋转的。为此分析了一下其他的俄罗斯方块游戏,发现他们的旋转是以(1,1)点为中心来旋转的,而(1,1)点在4×4方块中是处于中心的,在3×3方块中是真正的中心。我们的7种方块有五种只能占据3×3的格子,所以是可以以(1,1)来旋转的。分析到此,旋转问题就好解决的:
这9个格除中间的一个不变以外,其他格子顺时针旋转的话,是以与中心呈90的方式来转的,如,(0,2)->(0,0) ;(0,1)->(1,0)。
对于长条形的,旋转就很简单,由x轴坐标全为1变为y轴全为1,或者反之就可以了。
第六个问题:如何判断能否旋转
方块在两种情况下不能旋转,与不能移动时几乎一致,即不能翻到工作区外边,旋转后不能覆盖工作区已有的方块。解决这个问题是先预先翻转一下,然后检测是否方块中的每一个方块是否有跑到边界外面的,或者重叠的。由于算法与是否能移动类似就不多做解释了。
最后一个问题:如何判断死亡
当冷冻流程结束,产生下一个方块,此时,如果产生的位置上对应的工作区中已经有了方块,则认为游戏结束。
现在一个俄罗斯方块的基本设计问题已经解决,剩下的就是编代码了,针对不同的语言,科可能画方块的方式不一样,控制方块移动的事件也不一样,不过这写就都很简单了。另外,设计一个方块的游戏不难,但是从有这个游戏开始,已经产生了不下1w个版本了,如果说只是通过这个游戏练手,那当然能设计出来就可以了,但是如果要编一个让别人乐意玩的游戏,还远远不止这些——这需要加入您的智慧和创意。比如QQ的火拼俄罗斯就是在可玩性方面做了改进的很好的例子。
想法,从来就是最重要的,Over
本文魏晋遗疯原创,转载请注明出处






还没有任何评论。