2.4.1 检查拼图是否完成
若想知道拼图是否完成,需要知道各个图片块在拼图中的位置是否正确。对于某个图片块来说,怎样的位置才算正确呢?
回顾一下图2.1,可以看到,若所有图片块按照图中的位置摆放,则形成了一副完整的图像。同时注意到,各图片块的文件名是从左上至右下,按照从0到8的顺序依次进行编号的。最初创建图片块角色时,正是按照这样的编号顺序将它们加入列表中的,并且还为每个图片块定义了index属性,专门用来记录其对应的编号值。
然而,当调用随机函数打乱列表次序后,各图片块的位置不再按照编号顺序进行排列了。游戏的目标实际上就是通过移动图片块,以将其摆放到正确的位置上来,即让所有图片块按照0至8的编号顺序,从左上至右下依次摆放在程序窗口各方格中,如图2.4所示。
图2.4 图片块的正确编号顺序
那怎么知道每个图片块是否放置在正确的位置上呢?可以按照图2.4中的编号顺序,依次获取每个方格中的图片块,看看它的index属性所记录的编号值是否与图中的编号相一致。若所有图片块的编号值都与图中的编号一致,则说明拼图完成了。换句话说,只要有一块的编号值与图中不一致,则说明拼图没有完成。由于最后一个图片块并没有加入列表中,因此只需要对前8个图片块的编号进行判定。在update()函数中编写如下代码:
上述代码通过一个计数循环进行判定,循环变量i从0到7的不同取值,对应着图2.4中各方格的编号值。在每次循环中,对i取余得到方格的列号,取整得到方格的行号。然后以列号和行号作为参数来调用get_pic()函数,从而获取该方格中的图片块,并保存到pic变量中。接着进行判断:如果pic为空白块,或者pic的index属性值与i的值不相等,说明该方格中的图片块编号不正确,程序便调用return语句直接返回;如果所有图片块的编号都是正确的,说明拼图完成了,return语句将不会被调用,程序会继续执行for循环之后的语句。于是便可以将游戏结束时需要执行的操作代码编写在for语句之后。