从嵌套dict中选择一个随机值并在另一个嵌套di中更新它

2024-06-26 10:46:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在用python编写一个RPG文本游戏,并尝试在每次启动时创建随机遭遇系统。我有一个包含多个遭遇和相应类别的dict和另一个嵌套dict,其中包含关于游戏区域的信息。我可以创建一个随机选择并将其打印出来,但是如何使随机选择在区域嵌套表中的每个“交互”中更新呢。我想要一个新的随机值从相遇表中为嵌套dict区域中的每个“interact”键

另外,我只需要更新这些值,所以"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()

编辑:

预期结果将是:

^{pr2}$

其中"interact" : "zombie"zombie是random_encounters()的输出


Tags: namefalse游戏区域arearandomdictinteract
1条回答
网友
1楼 · 发布于 2024-06-26 10:46:25

由于random.choicesrandom.choice只适用于list类型,所以您可以获得对象键的列表并随机选择其中一个。所选的结果键将用于访问子字典项。还有一件事,当使用for key, values in dictionary.items()遍历字典时,第一个变量将是字典键,另一个变量将是对应于该键的值。我想你混淆了这两个词的顺序,所以我也帮你解决了。在

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

编辑: 为了给不同的区域设置唯一的遭遇,你把随机遭遇生成代码放在2个for循环中,这样每个区域都有自己的随机遭遇。 另外,由于您希望设置每个项目都有一定的发生概率,并且使用list(encounters.keys())将以随机顺序给出字典的键列表,所以我决定从使用list(encounters.keys())改为使用encounters键的顺序与weights_a相同的encounters键,这样每种类型的遭遇都有正确的概率。在

import random
import json

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")
    encounters_keys = ["enemy", "chest", "npc", "furniture", "nothing"]
    weights_a = [0.3, 0.1, 0.05, 0.05, 0.5]

    for q, w in area.items():
        for a, s in area[q].items():
            encounter_a = random.choices(encounters_keys, weights_a)[0]
            encounter_b = random.choice(list(encounters[encounter_a].keys()))
            area[q][a]["interact"] = encounters[encounter_a][encounter_b]

    print(json.dumps(area, indent=2))

random_encounters()

相关问题 更多 >