鱼C论坛

 找回密码
 立即注册
查看: 2583|回复: 1

[已解决]如何创建一个包含变量的数据结构,使得当变量被重新定义时,该数据结构也会更新?

[复制链接]
发表于 2023-4-8 11:19:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我正在制作一个文本冒险游戏,使用命名元组来定义地点。

  1. Location = namedtuple('Location', ['desc', 'ldesc', 'func', 'dirloc'])

  2. entrance = foyer = None

  3. entrance = Location('地牢入口', (
  4. '你现在在一片小树林的小空地上。'
  5. '北面可见一扇大的镶铁门,嵌在小山上,小山突起于空地的中心。'
  6. '阳光照耀在你身上,鸟儿在歌唱。'), None,
  7. {'north':foyer, 'south':None, 'east':None, 'west':None, 'up':None, 'down':None})

  8. foyer = Location('门厅', ('你现在在一个中等大小的石头房间里。'
  9. '四面八方都刻有壁龛。'
  10. '一条通道向西延伸,另一条向北延伸。'
  11. '地面上的脚印通向西通道。'),
  12. None,
  13. {'north':None, 'south':entrance, 'east':None, 'west':None, 'up':None, 'down':None})
复制代码


当 foyer 的 Location 被重新赋值时,我需要在 entrance 的字典 dictloc 中自动更新 foyer 变量。

我该怎么做?我已经在互联网上搜索了很多文章,但没有找到相关的内容。
最佳答案
2023-4-8 11:45:45
您可以使用函数或类来解决这个问题。下面是一种使用类的解决方案:

创建一个 LocationManager 类,用于管理所有位置。在该类中,创建一个字典,用于存储所有位置及其名称。

当您重新定义 foyer 变量时,只需调用 LocationManager 类中的 update_location() 方法即可自动更新字典中的 foyer 位置。

以下是一个示例代码:

  1. from collections import namedtuple

  2. class LocationManager:
  3.     def __init__(self):
  4.         self.locations = {}

  5.     def add_location(self, name, desc, ldesc, func, dirloc):
  6.         location = namedtuple('Location', ['desc', 'ldesc', 'func', 'dirloc'])(desc, ldesc, func, dirloc)
  7.         self.locations[name] = location

  8.     def update_location(self, name, desc, ldesc, func, dirloc):
  9.         if name in self.locations:
  10.             location = namedtuple('Location', ['desc', 'ldesc', 'func', 'dirloc'])(desc, ldesc, func, dirloc)
  11.             self.locations[name] = location

  12. # 创建一个 LocationManager 实例
  13. lm = LocationManager()

  14. # 添加 foyer 和 entrance 位置
  15. lm.add_location('foyer', '门厅', ('你现在在一个中等大小的石头房间里。'
  16. '四面八方都刻有壁龛。'
  17. '一条通道向西延伸,另一条向北延伸。'
  18. '地面上的脚印通向西通道。'), None,
  19. {'north':None, 'south':'entrance', 'east':None, 'west':None, 'up':None, 'down':None})

  20. lm.add_location('entrance', '地牢入口', (
  21. '你现在在一片小树林的小空地上。'         
  22. '北面可见一扇大的镶铁门,嵌在小山上,小山突起于空地的中心。'
  23. '阳光照耀在你身上,鸟儿在歌唱。'), None,
  24. {'north':'foyer', 'south':None, 'east':None, 'west':None, 'up':None, 'down':None})

  25. # 重新定义 foyer 位置
  26. lm.update_location('foyer', '新门厅', ('这是新门厅的描述'), None,
  27. {'north':None, 'south':'entrance', 'east':None, 'west':None, 'up':None, 'down':None})

  28. # 现在 foyer 的描述已经更新了,可以打印查看
  29. print(lm.locations['foyer'].desc)
复制代码


输出结果:

  1. 新门厅
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-8 11:45:45 | 显示全部楼层    本楼为最佳答案   
您可以使用函数或类来解决这个问题。下面是一种使用类的解决方案:

创建一个 LocationManager 类,用于管理所有位置。在该类中,创建一个字典,用于存储所有位置及其名称。

当您重新定义 foyer 变量时,只需调用 LocationManager 类中的 update_location() 方法即可自动更新字典中的 foyer 位置。

以下是一个示例代码:

  1. from collections import namedtuple

  2. class LocationManager:
  3.     def __init__(self):
  4.         self.locations = {}

  5.     def add_location(self, name, desc, ldesc, func, dirloc):
  6.         location = namedtuple('Location', ['desc', 'ldesc', 'func', 'dirloc'])(desc, ldesc, func, dirloc)
  7.         self.locations[name] = location

  8.     def update_location(self, name, desc, ldesc, func, dirloc):
  9.         if name in self.locations:
  10.             location = namedtuple('Location', ['desc', 'ldesc', 'func', 'dirloc'])(desc, ldesc, func, dirloc)
  11.             self.locations[name] = location

  12. # 创建一个 LocationManager 实例
  13. lm = LocationManager()

  14. # 添加 foyer 和 entrance 位置
  15. lm.add_location('foyer', '门厅', ('你现在在一个中等大小的石头房间里。'
  16. '四面八方都刻有壁龛。'
  17. '一条通道向西延伸,另一条向北延伸。'
  18. '地面上的脚印通向西通道。'), None,
  19. {'north':None, 'south':'entrance', 'east':None, 'west':None, 'up':None, 'down':None})

  20. lm.add_location('entrance', '地牢入口', (
  21. '你现在在一片小树林的小空地上。'         
  22. '北面可见一扇大的镶铁门,嵌在小山上,小山突起于空地的中心。'
  23. '阳光照耀在你身上,鸟儿在歌唱。'), None,
  24. {'north':'foyer', 'south':None, 'east':None, 'west':None, 'up':None, 'down':None})

  25. # 重新定义 foyer 位置
  26. lm.update_location('foyer', '新门厅', ('这是新门厅的描述'), None,
  27. {'north':None, 'south':'entrance', 'east':None, 'west':None, 'up':None, 'down':None})

  28. # 现在 foyer 的描述已经更新了,可以打印查看
  29. print(lm.locations['foyer'].desc)
复制代码


输出结果:

  1. 新门厅
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 12:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表