分支结构

我们之前写的代码其实并没有什么逻辑可言,它们只会按照顺序一行行执行而已。

在真正的游戏中有很多分支,例如玩家与 NPC 对话时,如果完成了任务,NPC 就会给玩家奖励,否则 NPC 就会告诉玩家一些任务提示。这里的任务是否完成就是一个分支条件。

如果

在程序中使用关键字 if 来表示分支,它的语法格式如下:

if <逻辑表达式> :
    <代码块>

if 可以直接理解成汉语中的如果,当逻辑表达式的值为 true 时就会执行下面的代码块,否则就不执行。

其中的逻辑表达式就是指一条运算结果为逻辑值的式子,现在假设咱有个变量 var 任务完成数 = 10 来表示当前完成了几个任务,当完成 20 个任务时显示恭喜通关:

func _ready():
    var 任务完成数 = 10
    if 任务完成数 >= 20:
        print("恭喜通关了")

目前运行游戏的话你会发现什么也没有显示,毕竟任务完成数现在是10,if 后面的条件不满足,也就不会执行里面的代码。当然你可以手动把变量值改成 20 以上的数字再试试。

否则

现在想完善一下刚才的程序,在任务完成数量不达标时提示玩家需要完成更多任务,那么以目前学到的知识,我们可以写成这样:

func _ready():
    var 任务完成数 = 10
    if 任务完成数 >= 20:
        print("恭喜通关了")
    if 任务完成数 < 20:
        print("完成的任务还不够多")

这样虽然可以实现效果,但是我们可以发现两个 if 的条件语句正好相反,这时可以把第二个 if 语句替换成 else 语句:

if 任务完成数 >= 20:
    print("恭喜通关了")
else:
    print("完成的任务还不够多")

很明显这个 else 就是否则的意思,当上一个 if 条件不满足时则执行。

否则-如果

现在我们想让这个例子更复杂一些,具体规则如下:

  • 当完成 20 个任务时显示 恭喜通关
  • 完成 15-19 个任务时显示 马上就完成了
  • 完成 5-14 个任务时显示 加油
  • 完成 5 个以下时显示 这才刚刚开始

于是我们可以写出:

if 任务完成数 >= 20:
    print("恭喜通关")
else:
    if 任务完成数 >= 15:
        print("马上就完成了")
    else:
        if 任务完成数 >= 5:
            print("加油")
        else:
            print("这才刚刚开始")

这一层一层的 else 语句看起来实在是不好看,那么再认识一个新的关键字:elif

elif 就是 else 和 if 的组合形式,它会在上一个 if 的条件不满足时判断自身条件,如果自身条件满足则执行自己的代码,同时 elif 可以多个串联使用。

修改之前的代码,使用 elif 语句的结果如下:

if 任务完成数 >= 20:
    print("恭喜通关")
elif 任务完成数 >= 15:
    print("马上就完成了")
elif 任务完成数 >= 5:
    print("加油")
else:
    print("这才刚刚开始")

[!tip] 条件判断可以避免重复

想想我们的条件中提到的是15-19个任务显示马上就完成了,但为什么我们的 if 和 elif 后面只判断了 任务完成数 >= 15 呢?

这里就要想一下 else 和 elif 的一个特点:只有在上一个 if 或 elif 的条件不满足时才判断。

由于第一个 if 已经判断了 任务完成数 >= 20 的情况,那么下面的所有 elif 和 else 中的任务完成数就不可能包含 20,所以我们就只判断 >= 15 即可。

[!tip] bool 值变量可以直接放到表达式里

一个变量也可以组成表达式,假设有个变量 var a = true,想判断 a 是否是 true 时千万不要写 if a == true,直接写 if a 即可。(虽然写成第一种也不会出错,但就是会显得自己编程水平不好......

[!tip] match 条件分支语句

match 语句在判断变量与大量固定值是否相等时,比 if 分支更简洁,不过由于 if 可以实现同样的功能,所以用的较少。

比如下面的示例判断三月份有几天。

var 月份 = 3
match 月份:
    2:
        print("非闰年该月份有28天")
    4,6,9,11:
        print("该月份有30天")
    _:
        print("该月份有31天")

更多用法可以参阅官方文档相应介绍,大家可以先认识一下这个语句,但不一定能用到。

[!tip] 三元运算符(又称三目运算符)

比如下面的例子,判断玩家在 x 轴的正半轴还是负半轴。

var 玩家的x轴位置 = 100
var 玩家方向 = 1 if 生命值 >=0 else -1

夹在 ifelse 中间的为条件语句 生命值 >= 0,如果条件语句为真,返回 if 前的值,否则返回 else 后的值。