3.3.1 完善鼠标事件处理

检测鼠标左键的单击事件很简单,类似于检测鼠标右键,可以通过表达式“button ==mouse.LEFT”来判断鼠标的左键是否被单击。只不过加入左键单击操作后,方块又增加了一个新的状态,即是否被打开。与标识方块是否埋地雷以及是否插旗子类似,还要再为方块定义一个布尔变量,用来标识它是否被打开。具体来说,在创建方块角色的时候为其设置一个isopen属性,初值设为False,表示初始时方块没有打开。当执行方块打开操作时将该属性设为True,表示方块打开了。于是可以在创建方块的语句后面加入这样一行代码:

接着修改on_mouse_down()函数,加入处理鼠标左键的单击事件操作。代码如下所示(粗体部分表示新添加的代码):

上述代码有两处需要注意:一处是鼠标单击操作的条件,除了判断方格是否被单击,还要判断方格是否已经打开了,因为无论是左键还是右键的操作,都只能针对没有打开的方块来执行;另一处是打开方块的条件,除了判断是否单击了鼠标左键,还要判断方块是否插上了旗子,也就是说鼠标左键只能打开没插旗子的方块。

可以看到,打开方块的操作代码又是由另一个if语句构成的,而判断条件则是方块埋设地雷与否。若打开的方块之下有地雷,则执行blow_up()函数,否则执行open_block()函数。按照模块化的编程方法,我们预先定义了blow_up()函数和open_block()函数,前者执行地雷爆炸的动作,后者逐一地将方块打开。先将这两个函数简单地定义如下:

可以看到,目前这两个函数只是建立了一个形式,并没有具体内容。下面便考虑如何编写具体的操作代码,首先来实现open_block()函数。