每个游戏都有它自己的规则,我们的俄罗斯方块的规则很明显,shape落到最底端时就停止下落,然后下一个shape开始往下落;当任一一个点挡住下落的shape时,整个shape就认为是已经到底了;当一行充满所有blocks时,这行消除,然后所有的往下落一行等等等等。
那么我们现在就开始制定我们的游戏规则,本节过后,我们的程序运行起来是这样子的:
我们首先从自定义的协议(protocol)开始,之前我们已经接触过两个swift自带的协议,hashable和printable。我们首先在swiftris类中添加我们自己的protocol
我们的程序将以试错法(trial-and-error)作为基本的原则进行,我们的用户交互界面GameViewController询问swiftris去向左向右向下移动,如果这条指令是合法的,我们就执行。
那什么时候“不合法”呢?我们来定义不合法的情况。
这里我们在#2中新建了一个函数用来判断shape是否处于不合法的地方,因为我们采用trial-and-error方法来测试是否处于合法位置,所以,我们的shape可能会处于各种奇怪的地方,没有关系。
接下来我们添加一些函数,用来旋转,移动我们的shape
#1中我们分别添加了两个函数让shape可以顺时针和逆时针的旋转,接下来我们添加了可以使shape左右上下移动的函数
接下来,让我们真正让这些函数发挥作用吧:
#1 dropshape函数中,我们每次将shape往下移动一行,如果它没有处于非法的位置,就循环执行下去,知道它处于非法的位置,因为它已经处于非法的位置了,所以我们需要把它复原到最后一个合法的位置,所以我们需要把它往上移动一行。
#2
我们定义了每次tick都会被调用的函数,不用担心没有见到的settle函数,我们稍后会来完善它
#3 我们可以让我们的shape在下落的过程中旋转
让我们来修复现在存在的error
#1中的settleShape函数会在shape无法再往下落的时候调用,我们把当前shape中的所有block都写入到blockArray里面,然后告诉程序,这个shape已经成功着陆了,不管它是真的着陆还是降落在别的shape头上,#2中的函数正是完成这样的检测;
同时fallingshape设置成nil,这样swiftris就会开始新的fallingshape。
得分机制
我们应该还记得,玩游戏大部分都有得分的,让我们来完善得分机制吧:
我们需要一组变量 score和level来表示得分和关卡数
当我们移除掉一整行的时候,我们就得分了,整个游戏就是依靠这样来得分的,对吧。
这是一段很长很长的代码,但是里面应该没有什么特别难以理解的内容,整个逻辑看起来也很清楚。返回两个数组,linesRemoved和fallenBlocks
好了,我们已经走完了好长的一段,休息一下:
接下来还有好长的一段路要走。。。。。。。。。。。。。。。
swiftris即将完成了,我们还需要一个函数允许用户一次性将所有的block都移除出去
是时候将我们之前自定义的协议和GameViewController联系起来了
好了,运行一下你的程序,看看是不是想象的样子呢?