从嵌套字典中选择一个随机值,然后在另一个嵌套字典中对其进行更新

时间:2019-03-23 19:07:35

标签: python python-3.x dictionary

我目前正在用python编写RPG文字游戏,并且正在尝试在每次启动时创建随机遇到的系统。我有一个具有多个遭遇及其对应类别的字典,另一个嵌套的字典包含有关游戏区域的信息。我可以创建一个随机选择并打印出来,但是如何在区域嵌套表的每个“交互”中更新该随机选择。我想从遭遇表中为嵌套字典区域中的每个“交互”键提供一个新的随机值。

我也只需要更新值,例如"interact" : "zombie",类别仅用于加权随机选择,因为我希望它们是“随机的”,而大多数都不是(“”)或敌人

尽管这是最新版本,因为我尝试了许多不同的方法,但它们都失败了-同样,下面的代码也出错了,我也不知道如何解决此问题。如果需要,我还可以发布所有其他尝试。

这是我失败的尝试:

import random

encounters = {
    "enemy" : {
        1 : "zombie",
        2 : "wolf",
        3 : "wraith"
    },

    "chest" : {
        1 : "chest",
        2 : "weapons_chest",
    },

    "npc"   : {
        1 : "villager",
    },

    "furniture" : {
        1 : "bed"
    },

    "nothing"   : {
        1 : ""
    }
}

area = {

    "spawner" : {

        "spawn" : {
            "name"      : "Spawn",
            "interact"  : "",
            "solved"    : False,
            "connects"  : {
                1   : "alleyway_1"
            }
        }
    },

    "alley" : {

        "alleyway_1"   : {
            "name"      : "Alleyway 1",
            "interact"  : "",
            "solved"    : False,
            "connects"  : {
                1   : "spawn",
                2   : "alleyway_2",
                3   : "hall"
            }
        },

        "alleyway_2"   : {
            "name"      : "Alleyway 2",
            "interact"  : "",
            "solved"    : False,
            "connects"  : {
                1   : "alleyway_1"
            }
        }
    }
}

def random_encounters():
    print("random encounters")

    weights_a = [0.3, 0.1, 0.05, 0.05, 0.5]

    encounter_a = random.choices(encounters, weights_a)
    encounter_b = random.choice(list(encounter_a.values()))

    for q, w in area.items():
        for a, s in area[w].items():
            area[w][s]["interact"] = encounter_b

random_encounters()

编辑:

预期结果将是:

 area = {

    "spawner" : {

        "spawn" : {
            "name"      : "Spawn",
            "interact"  : "bed",
            "solved"    : False,
            "connects"  : {
                1   : "alleyway_1"
            }
        }
    },

    "alley" : {

        "alleyway_1"   : {
            "name"      : "Alleyway 1",
            "interact"  : "zombie",
            "solved"    : False,
            "connects"  : {
                1   : "spawn",
                2   : "alleyway_2",
                3   : "hall"
            }
        },

        "alleyway_2"   : {
            "name"      : "Alleyway 2",
            "interact"  : "chest",
            "solved"    : False,
            "connects"  : {
                1   : "alleyway_1"
            }
        }
    }
}

"interact" : "zombie"的僵尸是random_encounters()的输出

1 个答案:

答案 0 :(得分:0)

由于random.choicesrandom.choice仅适用于列表类型,因此您可以获取对象键的列表并随机选择其中之一。选择的结果键将用于访问子词典项目。还有一件事,当使用for key, values in dictionary.items()遍历字典时,第一个变量将是字典键,另一个将是与该键对应的值。我认为您混淆了两者的顺序,因此我也为您解决了该问题。

我还添加了import jsonprint(json.dumps(area, indent=2)),因此您可以验证它是否是您想要的。完成测试后,可以将其删除。

编辑: 为了为不同区域设置唯一的遭遇,您可以将随机遭遇生成代码放在2个for循环中,以便每个区域都有自己的随机遭遇。 另外,由于您要设置每个项目都有一定的发生概率,并且使用list(encounters.keys())会随机给出字典键的列表,因此我决定从使用list(encounters.keys())更改为使用{{1 }},它们的encounters_keys=["enemy", "chest", "npc", "furniture", "nothing"]'键与encounters的顺序相同,因此每种相遇类型都有正确的概率。

weights_a