第4章:分支和循环——让游戏世界“活”起来
各位同学,欢迎来到第四课。前几章我们学了变量、数据类型,还有最基本的输入输出。说实话,那些东西就像游戏里的“砖块”和“水泥”。但光有材料,你砌不出会动的城堡。
这一章,我们要给游戏世界注入“灵魂”。
说白了,就是让代码学会做决定和重复干活。没有这两个能力,你的游戏角色永远只会站桩,敌人永远只会发呆。嗯,这可不是我们想要的。
4.1 让代码学会“思考”:if判断语句
先问大家一个问题:游戏里怎么判断玩家是否按下了“跳跃键”?
答案就是——if。
if 是编程里最基础的判断工具。它的逻辑很简单:如果条件成立,就执行某段代码。
看个例子:
player_hp = 100
if player_hp > 0:
print("玩家还活着,继续战斗!")
这里 player_hp > 0 就是一个条件。如果它成立(True),程序就会打印那句话。如果不成立(False),就跳过。
核心要点:if 后面跟的条件,最终结果必须是 True 或 False。
我在项目中遇到过新手把 if player_hp = 0 写成赋值语句,结果游戏角色永远死不了。嗯,这是个经典坑,后面会细说。
4.2 运算符:判断的“工具包”
光有 if 还不够,你得有工具来构造条件。这些工具就是运算符。
我习惯把它们分成三类:
4.2.1 比较运算符
用来比较两个值的大小或是否相等。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 5 |
True |
!= |
不等于 | 5 != 3 |
True |
> |
大于 | 10 > 5 |
True |
< |
小于 | 3 < 8 |
True |
>= |
大于等于 | 5 >= 5 |
True |
<= |
小于等于 | 4 <= 9 |
True |
注意:千万不要把 == 写成 =!= 是赋值,== 才是判断相等。我曾经调试一个 bug 整整两小时,最后发现就是少写了一个等号。
4.2.2 逻辑运算符
用来组合多个条件。常用的有三个:
and:两个条件都成立,结果才为 Trueor:只要有一个条件成立,结果就为 Truenot:取反,True 变 False,False 变 True
举个例子:
hp = 50
mana = 30
# 玩家必须血量大于0 并且 蓝量大于20,才能释放大招
if hp > 0 and mana > 20:
print("释放大招!")
你想想看,如果这里用 or,那玩家只剩1滴血也能放大招,这游戏平衡性就崩了。
4.2.3 成员运算符
这个在游戏里很常用,比如判断背包里有没有某件道具:
inventory = ["剑", "盾牌", "药水"]
if "药水" in inventory:
print("你可以喝药回血了!")
in 和 not in 就是成员运算符,专门用来检查某个东西在不在一个集合里。
4.3 二选一:if-else 语句
现实世界不是非黑即白,游戏里也一样。玩家要么活着,要么死了。这时候就需要 if-else。
player_hp = 0
if player_hp > 0:
print("玩家存活")
else:
print("玩家阵亡,游戏结束")
逻辑很清楚:条件成立走 if,不成立走 else。没有中间地带。
那如果条件不止两个呢?比如根据分数给玩家评级:
score = 85
if score >= 90:
grade = "S"
elif score >= 80:
grade = "A"
elif score >= 70:
grade = "B"
else:
grade = "C"
print(f"你的评级是:{grade}")
这里用到了 elif,它是 else if 的缩写。程序会从上往下依次判断,找到第一个成立的条件就执行,然后跳过剩下的所有判断。
小技巧:写多条件判断时,把最可能成立的条件放在最前面,能提高效率。我习惯把“边界情况”放在最后处理。
4.4 重复的力量:while 循环
游戏里经常需要重复做某件事,比如“只要玩家还活着,就一直检测按键输入”。这时候就需要循环。
while 循环的语法很简单:
count = 0
while count < 5:
print(f"第 {count+1} 次循环")
count += 1
它会一直执行,直到条件 count < 5 变成 False。
致命陷阱:千万别忘了在循环里更新条件变量!如果你忘了写 count += 1,这个循环会永远跑下去,程序就卡死了。我刚开始学的时候,经常把电脑跑死机。
游戏里一个经典用法就是“游戏主循环”:
game_running = True
while game_running:
# 处理玩家输入
# 更新游戏状态
# 渲染画面
# 检查是否退出
pass # 这里只是占位,后面会填实际代码
嗯,几乎所有游戏的核心,都是这样一个 while 循环。
4.5 精准控制:for 循环
如果你知道要循环多少次,用 for 更合适。它比 while 更简洁,也更安全(不容易死循环)。
最常见的用法是遍历一个序列:
enemies = ["史莱姆", "哥布林", "骷髅兵"]
for enemy in enemies:
print(f"攻击 {enemy}!")
输出:
攻击 史莱姆!
攻击 哥布林!
攻击 骷髅兵!
如果你想生成一个数字序列,配合 range() 函数:
# 生成 0 到 4 的数字
for i in range(5):
print(f"第 {i} 波敌人来袭!")
range(5) 会生成 0, 1, 2, 3, 4 这五个数。注意是从0开始,到4结束,不包含5。
还可以指定起始和步长:
# 从 1 到 10,每次跳 2
for i in range(1, 10, 2):
print(i) # 输出:1, 3, 5, 7, 9
我的习惯:能用 for 的地方,我绝不用 while。因为 for 自带“计数器”,不容易出错。
4.6 循环的“刹车”与“跳过”:break 和 continue
有时候,循环需要提前结束,或者跳过某一次迭代。这时候就需要 break 和 continue。
4.6.1 break:强制退出
想象一下,你在搜索一个敌人列表,找到目标后就停止搜索,没必要继续遍历了。
enemies = ["史莱姆", "哥布林", "BOSS", "骷髅兵"]
for enemy in enemies:
if enemy == "BOSS":
print("发现BOSS!准备战斗!")
break # 找到BOSS,停止搜索
print(f"清理小怪:{enemy}")
输出:
清理小怪:史莱姆
清理小怪:哥布林
发现BOSS!准备战斗!
看到没?遇到 BOSS 后,循环直接结束了,“骷髅兵”根本没被打印。
4.6.2 continue:跳过本次
有时候你不想完全退出循环,只是想跳过某一次。比如,玩家背包满了,捡不了东西:
items = ["金币", "药水", "垃圾", "宝石"]
for item in items:
if item == "垃圾":
print("垃圾不捡,跳过")
continue # 跳过本次循环,继续下一次
print(f"捡起:{item}")
输出:
捡起:金币
捡起:药水
垃圾不捡,跳过
捡起:宝石
continue 只是跳过当前这一次,循环还会继续往下走。
避坑指南:我曾经在 while 循环里用 continue,结果忘了更新条件变量,直接死循环了。记住,continue 之前一定要确保条件变量有变化。
4.7 综合实战:简易战斗系统
好了,理论讲完了。我们来写一个真正能跑的小游戏片段。
需求很简单:玩家和怪物轮流攻击,直到一方血量归零。
player_hp = 100
monster_hp = 80
turn = 0 # 0表示玩家回合,1表示怪物回合
while player_hp > 0 and monster_hp > 0:
if turn == 0:
# 玩家攻击
damage = 15
monster_hp -= damage
print(f"玩家攻击,造成 {damage} 点伤害,怪物剩余 {monster_hp} 血")
turn = 1
else:
# 怪物攻击
damage = 10
player_hp -= damage
print(f"怪物攻击,造成 {damage} 点伤害,玩家剩余 {player_hp} 血")
turn = 0
# 判断胜负
if player_hp > 0:
print("玩家胜利!")
else:
print("怪物胜利...")
这段代码里,我们用到了 while 循环、if-else 判断、比较运算符。虽然简单,但已经是一个完整的回合制战斗框架了。
你可以试着改改数值,或者加上暴击、闪避等逻辑。嗯,这就是你搭建游戏世界的第一步。
4.8 本章小结
这一章我们学了:
- if 判断:让代码根据条件做选择
- 运算符:比较、逻辑、成员,三种工具帮你构造条件
- if-else / elif:处理多分支情况
- while 循环:条件成立就一直重复
- for 循环:遍历序列或固定次数循环
- break / continue:控制循环的流程
说实话,这些内容看起来多,但核心就两件事:做决定和重复做。你写任何游戏逻辑,都逃不开这两个模式。
下一章,我们会把这些知识串起来,开始真正搭建你的第一个游戏世界。到时候你会发现,原来编程这么有意思。
公众号:蓝海资料掘金营,微信deep3321