《编程农场》教程 (8):农场的“百宝箱”!掌握列表 (List) 与字典 (Dictionary) 的进阶数据管理
欢迎回来,高级农场架构师!
在之前的课程中,我们学会了用变量(Variable)来充当“小纸条”,记录木材的数量(比如 wood_count = 1000)。 但是,随着农场的发展,你需要管理的作物品种越来越多:草、树木、胡萝卜、南瓜、向日葵……如果每种作物都写一张小纸条,你的代码里就会塞满几十个变量,管理起来会让人彻底抓狂。
今天,我们将学习编程中极其强大的数据收纳工具:列表(List) 和 字典(Dictionary)。它们就像是农场里的“百宝箱”和“档案柜”,能帮你一次性管理海量的数据!
1. 什么是列表(List)?
如果说普通的变量是一个只能装一样东西的“单肩包”,那么列表就是一个拥有无数个夹层的**“多格收纳盒”**。
在 Python 中,列表用方括号 [] 来表示。你可以把数字、文字、甚至游戏里的实体(Entities)和物品(Items)通通塞进去,中间用逗号 , 隔开:
# 创建一个包含三种作物的列表
crop_list = [Entities.Tree, Entities.Carrot, Entities.Pumpkin]
# 也可以创建一个空列表,以后再往里装东西
empty_list = []
⚠️ 程序员的终极执念:从 0 开始数数
想要从列表中拿出某样东西,你需要用到索引(Index)。 请死死记住:在编程的世界里,数数永远是从 0 开始的!
第 1 个格子是
[0]第 2 个格子是
[1]第 3 个格子是
[2]
如果你想种下刚才那个 crop_list 里的“胡萝卜”(它是第 2 个),你应该这么写:
# 这会种下胡萝卜,因为 Carrot 的索引是 1!
plant(crop_list[1]) 2. 列表的“四大法宝”与遍历操作
列表不是死板的,你可以随时对它进行增删改查。游戏内置了这些极其好用的修改方法:
添加:
append()和insert()list.append(7):在列表的最末尾加上数字 7。list.insert(1, Items.Wood):强行插队!把木材塞到索引1的位置,后面的东西统统往后挪一格。
删除:
remove()和pop()list.remove(2):在列表里找数字 2,找到第一个就把它删掉。list.pop():不指定数字的话,直接把列表最后一样东西扔掉(就像弹匣弹出最上面的一颗子弹)。你也可以用list.pop(1)删掉索引为 1 的那个东西。
测量:
len()x = len(list):拿尺子量一下列表里现在有几个东西。(Length的缩写)。
🔄 用 for 循环遍历列表:
你可以让无人机挨个检查列表里的东西,这就叫做“迭代”。比如,你想计算列表里所有数字的总和:
my_numbers = [4, 7, 2, 5]
total_sum = 0
for number in my_numbers:
total_sum += number # 把它们挨个加起来
# 循环结束后,total_sum 变成了 183. 🚨 避坑警告:列表的“替身使者”陷阱(引用语义)
官方说明书里提到了一个极度危险的陷阱:“引用语义”。这会让无数新手彻夜难眠找 Bug。
看看这段代码:
a = [1, 2]
b = a # 你以为是复制了一个新列表给 b?错!
b.pop() # b 把自己最后一个元素删了此时,你觉得 a 还是 [1, 2] 吗? 答案是:a 也变成了 [1]!
为什么? 在 Python 里,b = a 并没有去复印一份全新的列表。a 和 b 就像是两把通往同一个房间的钥匙。既然 b 拿着钥匙进去把房间里的 2 扔掉了,那 a 开门进去看的时候,2 自然也不见了! (以后如果你想真正地复制一份列表,一定要查阅更高阶的复制方法,千万别直接用等号赋值!)
4. 字典(Dictionary):带标签的高级档案柜
虽然说明书重点讲了列表,但你既然提到了字典,我就必须为你解锁这个比列表更强大的神器!
列表是用数字排序来找东西的([0], [1]),而字典则是用**标签(键值对 Key-Value)**来找东西的!它用大括号 {} 表示。
想象你要记录三种资源的库存,如果用三个变量,代码会很乱。用字典就一目了然:
# 建立一个库存字典
inventory = {
Items.Wood: 1500,
Items.Carrot: 300,
Items.Hay: 800
}
# 想知道有多少胡萝卜?直接报它的名字!
carrot_count = inventory[Items.Carrot]更厉害的是,字典可以随时更新和新增标签:
inventory[Items.Pumpkin] = 50 # 刚才收割了50个南瓜,直接贴个新标签放进字典!
inventory[Items.Wood] += 100 # 木头又多了100个,在原有的基础上加100在后期极其复杂的“南瓜合体”或“仙人掌排序”中,我们甚至会用坐标 (X, Y) 来当标签,把每一个格子的状态存进字典里!
5. 实战应用:打造“轮作式”多样化农场
学了列表,我们可以彻底告别“全图只种一种作物”的单调农场了。 我们要利用 [Entities.Grass, Entities.Tree, Entities.Carrot] 这个列表,结合 x 坐标,让农场每一列种不同的作物!
size = get_world_size()
# 把我们想种的作物放进列表里
crop_rotation = [Entities.Grass, Entities.Tree, Entities.Carrot]
while True:
for x in range(size):
# 【核心魔法】:根据当前的 X 坐标,来决定从列表里拿哪个种子!
# 使用 % (取模) 确保就算农场很大,也会在 0, 1, 2 之间循环
current_crop = crop_rotation[x % len(crop_rotation)]
for y in range(size):
if can_harvest():
harvest()
if get_entity_type() == None:
if get_ground_type() == Grounds.Grassland:
till()
# 种下刚才挑选好的作物
plant(current_crop)
move(North)
move(East)
运行这段代码,你的农场会呈现出极其美丽的条纹状:一列草、一列树、一列胡萝卜,周而复始。这就是列表带来的“数据驱动”编程之美!
结语: 太酷了!掌握了 def 函数、if-else 分支、以及今天的 List 列表和 Dictionary 字典,你已经具备了构建任何复杂逻辑的数据处理能力。