趣学Python游戏编程
上QQ阅读APP看书,第一时间看更新

3.2.2 定义函数执行插旗操作

在设计set_flag()函数的具体操作之前,为了保证程序能正常运行,不妨先这样编写代码:

上述代码给出了set_flag()函数的定义,但是在函数体内只是执行一个pass语句。

提示:

其实这是编程的一个小技巧,就是在不确定函数内部细节的情况下,先保证函数形式的完整,使得程序能够正确执行。而pass关键字的作用就是占据位置,虽然什么都没有做,但是能够保证代码整体完整。

现在重新运行一下程序,虽然右键单击方块还是没有出现旗子,但是程序也不再报错了。

接下来是时候考虑set_flag()函数的具体动作了。先不要着急编写代码,首先来设计这个函数的操作流程,然后再去编程实现。这实际上也是程序设计的一般步骤,即先设计算法,再编写程序。

说明:

所谓算法,就是计算机完成某个操作的具体步骤和方法。设计算法通常可采用两种方式:一种称为流程图,另一种则叫作伪代码。前者是按照规定的符号对程序的执行流程进行刻画,优点是结构清晰、格式规范;后者则是通过非正式的,类似于自然语言的形式来描述程序的执行动作,好处是形式灵活,可以和程序语言的语法相结合。

下面试着用伪代码来描述set_flag()函数的具体操作。根据扫雷游戏规则,玩家用鼠标右键单击某个方块时,如果该方块上面没有插旗子,则可以给它插上旗子;若方块上已经插了旗子,则取消它的旗子。我们结合Python的语法规则来书写伪代码,那么插旗子操作的伪代码可以这样描述:

在上面的伪代码中,if语句以及缩进的格式都属于Python语法,而判断条件及具体操作则使用了自然语言来描述。可以看到伪代码的特点,它的形式介于程序语言与自然语言之间,也可以看作是两者的混合。通过伪代码的描述,我们清楚了插旗子操作的具体动作,那么接下来就要将伪代码“翻译”成计算机能够理解的程序代码。

由于此前已经准备好了所有的图片资源,所以改换方块的图像很简单,只需要将方块角色的image属性设置为插上旗子的图片即可。然而如何来判断方块是否插了旗子呢?事实上,是否插旗子可看作是方块的某种状态,就如同方块是否埋地雷一样,同样可借助布尔变量进行标识。在创建方块角色的时候,可以为每个方块定义一个isflag属性,用来表示方块是否插了旗子,初值设为False,表示初始时方块没有插旗子。当玩家执行插旗子操作后,再将方块的isflag属性设为True,表示方块已经插了旗子。

在创建方块的语句后面加入这样一行代码:

然后在set_flag()函数中加入如下代码:

现在运行一下游戏,试着用鼠标右键单击某个方块,看看能否给它插上旗子呢?游戏的运行画面如图3.3所示。

图3.3 插旗子操作的效果