Python字典元素重赋值异常:回合制游戏脚本未正确更新
解决字典赋值后脚本字符串不更新的问题
我来帮你分析下这个问题——核心原因是你提前把脚本字符串给固化了,而不是让它在需要的时候动态获取最新值。
问题根源
当你执行这行代码时:
scripts = {"normal 1" : "%s attacks with %s" % (attacker["name"],attacker["action"]["melee"]["attack"]["normal"])}
此时attacker还指向blank对象,Python会立即完成字符串格式化,生成固定的"blank attacks with 0"。由于字符串是不可变类型,后续哪怕attacker切换为character,这个已经生成的字符串也不会自动更新。
解决方案:延迟计算,动态获取值
我们可以把脚本改成可调用的函数(比如lambda),让它在需要打印的时候才去读取当前attacker的最新属性值。修改后的代码如下:
name = "none" scripts = "blank" stats = {"hp" : 0, "sp" :0} atk = {"normal": 0, "crit" : 0, "crit chance": 0} sword = {"attack": atk, "scripts" : scripts} actions = {"melee" : sword} blank = {"name" : "blank", "stats" : stats, "action" : actions} attacker = blank # 将脚本改为lambda函数,延迟到调用时计算 scripts = {"normal 1" : lambda char: "%s attacks with %s" % (char["name"], char["action"]["melee"]["attack"]["normal"])} stats = {"hp" : 20, "sp" :5} atk = {"normal": 12, "crit" : 15, "crit chance": 30} sword = {"attack": atk, "scripts" : scripts} actions = {"melee" : sword} character = {"name" : "Jabe", "stats" : stats, "action" : actions} attacker = character # 调用函数并传入当前攻击者对象,获取最新的字符串 print(attacker["action"]["melee"]["scripts"]["normal 1"](attacker)) print(attacker["action"]["melee"]["attack"])
替代方案:使用字符串模板
如果你不想用函数,也可以把脚本存为未格式化的模板字符串,在需要打印的时候再完成格式化:
# 存储模板字符串 scripts = {"normal 1" : "%s attacks with %s"} # 打印时动态格式化 print(attacker["action"]["melee"]["scripts"]["normal 1"] % (attacker["name"], attacker["action"]["melee"]["attack"]["normal"]))
为什么这样有效?
- 函数(或lambda)会在你调用它的那一刻,才去读取传入的
attacker对象的最新属性,避免了提前固化值的问题。 - 字符串模板方式则把格式化操作延迟到需要输出的时候,确保使用的是当前最新的变量值。
这两种方式都能完美解决你回合制游戏中切换攻击者后脚本内容不更新的问题。
内容的提问来源于stack exchange,提问作者ojj920
相关产品推荐
相关产品推荐

