while循环
有时候我们希望「只要满足某个条件,就一直重复做某件事」,直到条件不再满足为止
这时候就可以使用 while 循环
语法
while (条件表达式):
循环体和if语句一样,括号不是必要的,但如果条件很长需要换行时则必须要加上括号
当条件结果为 true,就会不停地执行循环体;本次循环结束后,若条件的结果变为 false,整个循环就会结束,程序会继续往下执行
无限循环
如果你的 while 循环条件永远不会为 false,那就会变成「无限循环」
无限循环将会导致程序主线程繁忙,从而使得应用未响应,也就是我们俗称的“卡死”
while true:
print("This will run forever")我们将true作为了while的条件,而true是布尔值常量,它永远不可能为false,因此构成了一个无限循环
这段代码会疯狂输出个不停 如果你把它放进 _ready 或 _process 里运行,Godot 编辑器和游戏会直接卡死没反应
这是因为主线程被彻底占用了,只能去任务管理器强制关闭进程
长时间运算
在刚刚的测试中,我们知道了无限循环会带来怎样的后果
除了真正的无限循环,其实最常见导致游戏“卡住”的情况是——循环里做了太多事或是进行了太多次循环,比如:
大规模计算
创建大量对象
执行特别复杂的逻辑
这些操作虽然最终会完成,但如果耗时过长,游戏依然会看起来像是「死机」了一样
而这种情况其实可以用“协程”(await关键字)来解决
此处仅提及循环的注意点,协程函数相关知识详见后续章节
迭代变量
在下面的例子中,我们定义了一个变量count,并且每次循环都会改变它的值,这就是迭代变量
var count = 0
while count < 10:
count += 1
if count % 2 == 0:
print("The current count is even:", count)迭代变量在while语句中,一般是用于
控制循环结束
在循环体里参与运算(例如打印当前轮次、累加、索引等)
不要忘了在循环中更新迭代变量
变量作用域 & 重新声明
在循环外声明的迭代变量(像上例的
count): 只会被创建一次,每轮循环只是改变其值。在循环体内部声明的新变量(例如
var temp = …放在while内): 每次进入循环都会重新创建并初始化,上一轮的值不会保留。gdscriptvar i = 0 while i < 3: var j = 1 j += 1 print(j) i += 1
练习
使用
while打印 1 到 5 的数字从 10 开始倒着打印,直到 1
求出从 1 加到 100 的结果,并打印它
从 1 开始不断乘2,直到结果不小于1000,打印最终的数以及它是2的几次方
打印 0 到 100 之间的所有偶数