分支结构
我们之前写的代码其实并没有什么逻辑可言,它们只会按照顺序一行行执行而已。
在真正的游戏中有很多分支,例如玩家与 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
夹在
if
和else
中间的为条件语句生命值 >= 0
,如果条件语句为真,返回 if 前的值,否则返回 else 后的值。