如何在Python RPG游戏中实现按唯一物品分组并带数量的格式化库存展示
如何在Python RPG游戏中实现按唯一物品分组并带数量的格式化库存展示
看起来你已经离目标超级近了!你用Counter统计物品数量的思路完全正确,只是差了最后一步——不要遍历原inventory列表,而是直接遍历Counter的键值对,这样每个唯一物品只会输出一次,再配合格式化对齐就能完美实现你想要的效果!
问题出在哪?
你当前的第二个循环是对着原inventory列表遍历的:
for i in inventory: print(f"{i.name} \t {inventory_count[i]}")
这就导致同一个物品会被打印多次(比如你的5个草药会输出5行),而我们需要的是每个唯一物品只显示一行。
解决方案:遍历Counter的键值对
Counter的items()方法会返回每个唯一元素和对应的计数,我们直接遍历它就行。另外,为了让名字和数量对齐更整齐,建议用字符串格式化的左对齐语法(比如:<20表示左对齐占20个字符),比\t更可控,避免不同长度的名字导致对齐混乱。
修改后的完整代码
from collections import Counter # This is used to count specific items in inventory. from collections import namedtuple # I use named tuples for Weapons and Armor. Weapon = namedtuple('Weapon', ['name','strength','cost']) # Create a named tuple for Weapons copper_sword = Weapon('Copper Sword',10,180) # 这里修正了笔误:namedtuple的第一个参数应该和变量名一致,统一为Item Item = namedtuple('Item', ['name', 'cost']) # Create a named tuple for Items medicinal_herb = Item('Medicinal Herb', 15) inventory = [medicinal_herb, medicinal_herb, copper_sword, medicinal_herb, medicinal_herb, medicinal_herb] print("Inventory:") # 统计唯一物品数量 inventory_count = Counter(inventory) # 遍历每个唯一物品及其数量,格式化输出 for item, count in inventory_count.items(): # 左对齐物品名(占20个字符宽度),后面紧跟数量 print(f"{item.name:<20}{count}")
输出效果
运行后就会得到你想要的整洁格式:
Inventory: Medicinal Herb 5 Copper Sword 1
额外小提示
如果你想同时保留原来的“多列平铺展示”(比如给玩家两种查看选项),可以把两种展示逻辑结合起来,比如先展示分组统计,再展示平铺的物品列表,或者让玩家输入指令切换查看方式~
备注:内容来源于stack exchange,提问作者FreyjasChosen
相关产品推荐
相关产品推荐

