Skip to content

while循环

有时候我们希望「只要满足某个条件,就一直重复做某件事」,直到条件不再满足为止

这时候就可以使用 while 循环

语法

gdscript
while (条件表达式):
    循环体

和if语句一样,括号不是必要的,但如果条件很长需要换行时则必须要加上括号

当条件结果为 true,就会不停地执行循环体;本次循环结束后,若条件的结果变为 false,整个循环就会结束,程序会继续往下执行

无限循环

如果你的 while 循环条件永远不会为 false,那就会变成「无限循环

无限循环将会导致程序主线程繁忙,从而使得应用未响应,也就是我们俗称的“卡死”

gdscript
while true:
    print("This will run forever")

我们将true作为了while的条件,而true是布尔值常量,它永远不可能为false,因此构成了一个无限循环

这段代码会疯狂输出个不停 如果你把它放进 _ready_process 里运行,Godot 编辑器和游戏会直接卡死没反应

这是因为主线程被彻底占用了,只能去任务管理器强制关闭进程

长时间运算

在刚刚的测试中,我们知道了无限循环会带来怎样的后果

除了真正的无限循环,其实最常见导致游戏“卡住”的情况是——循环里做了太多事或是进行了太多次循环,比如:

  • 大规模计算

  • 创建大量对象

  • 执行特别复杂的逻辑

这些操作虽然最终会完成,但如果耗时过长,游戏依然会看起来像是「死机」了一样

而这种情况其实可以用“协程”(await关键字)来解决

此处仅提及循环的注意点,协程函数相关知识详见后续章节

迭代变量

在下面的例子中,我们定义了一个变量count,并且每次循环都会改变它的值,这就是迭代变量

gdscript
var count = 0
while count < 10:
    count += 1
    if count % 2 == 0:
        print("The current count is even:", count)

迭代变量在while语句中,一般是用于

  • 控制循环结束

  • 在循环体里参与运算(例如打印当前轮次、累加、索引等)

不要忘了在循环中更新迭代变量

变量作用域 & 重新声明

  • 在循环外声明的迭代变量(像上例的 count): 只会被创建一次,每轮循环只是改变其值。

  • 在循环体内部声明的新变量(例如 var temp = … 放在 while 内): 每次进入循环都会重新创建并初始化,上一轮的值不会保留。

    gdscript
    var i = 0
    while i < 3:
        var j = 1                 
        j += 1         
        print(j)            
        i += 1

练习

  1. 使用 while 打印 1 到 5 的数字

  2. 从 10 开始倒着打印,直到 1

  3. 求出从 1 加到 100 的结果,并打印它

  4. 从 1 开始不断乘2,直到结果不小于1000,打印最终的数以及它是2的几次方

  5. 打印 0 到 100 之间的所有偶数