鱼C论坛

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

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

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

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

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

x
我正在制作一个文本冒险游戏,使用命名元组来定义地点。
Location = namedtuple('Location', ['desc', 'ldesc', 'func', 'dirloc'])

entrance = foyer = None

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

foyer = Location('门厅', ('你现在在一个中等大小的石头房间里。'
'四面八方都刻有壁龛。'
'一条通道向西延伸,另一条向北延伸。'
'地面上的脚印通向西通道。'),
None,
{'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 位置。

以下是一个示例代码:
from collections import namedtuple

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

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

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

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

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

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

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

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

输出结果:
新门厅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

以下是一个示例代码:
from collections import namedtuple

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

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

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

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

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

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

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

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

输出结果:
新门厅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 23:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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