3.1.4 埋设地雷
现在已经创建了方块阵列,接下来要做的就是在方块之下埋设地雷。首先思考一下该如何表示方块是否埋设了地雷呢?仔细想想,对于某个方块来说,它要么埋了地雷,要么没有埋,只有这两种可能。实际上,是否埋设了地雷,这可以看作是方块角色的一种状态,其取值只有是或否两种可能。因此,可以借助布尔变量表示。
在拼图游戏中,曾使用布尔变量表示游戏是否结束的状态。类似地,这里可以为方块设置一个布尔变量,用来表示它的下面是否有地雷,若有则将布尔变量的值设为True,若没有则设为False。不过由于各个方块的状态不一定相同,可能有的埋有地雷,而有的没有埋,所以要分别为每个方块都设置一个布尔变量。于是在创建方块角色之后,马上给它添加一个名叫isbomb的属性,用来表示方块之下是否埋有地雷,并将其初值赋为False。代码如下所示:
如此一来,就能很方便地为方块埋设地雷。若是希望在某个方块下面埋地雷,只需要将该方块的isbomb属性设为True即可。例如要在场景中埋下20颗地雷,只需要使用循环语句从列表中获取20个方块,并分别将它们的isbomb属性设置为True。代码如下所示:
上面的代码中首先定义了一个常量BOMBS,用来表示地雷的数量,并将其设置为20。然后执行了一个计数循环语句,依次为列表的前20个方块埋设了地雷。
聪明的你或许会产生疑问:仅仅是将地雷埋在列表的前20个方块中,那地雷的位置不就是固定不变了吗?确实是这样的。因为我们为各个方块设置坐标时是按顺序依次进行的,列表的前20个方块就对应着窗口中第一行的15个方块,以及第二行的前5个方块。所以游戏每次运行时,地雷总是埋在这20个方块中。
如果是这样,那游戏还有何乐趣可言呢?根据扫雷游戏的规则,地雷应该是随机出现的才对,玩家事先并不知道地雷的位置,而且每次游戏时地雷的位置都会发生改变。不要着急,下面马上处理这个问题。其实解决这个问题非常容易,还记得在拼图游戏中是如何让图片块随机显示的吗?在那里我们仅仅用了一行代码便解决了问题,即调用随机函数来随机地打乱图片块在列表中的次序。在扫雷游戏中也可以采取类似的操作。在埋设地雷的for语句之前加入这样一句:
该语句调用Python提供的random库的shuffle()方法,随机地打乱了列表blocks中各个方块的次序。这意味着列表的前20个方块不再是固定顺序的,它们的位置可能分散在窗口的各个角落。于是程序再去调用埋设地雷的语句,为这20个方块来埋设地雷,便会将地雷埋藏在窗口的不同位置。而且游戏每次运行时调用shuffle()方法的结果都不一样,因此每次游戏的地雷位置也不会相同。