我正在尝试制造一种提供随机伤害的武器。我这样做是使用表单中的项目数据库
itemsList = {
1: {"name": "Padded Armor", "armor": 1, "value": 5, "class": "Light"},
2: {"name": "Leather Armor", "armor": 2, "value": 10, "class": "Light"},
....
19: {"name": "Dagger", "damage" : int(random.randrange(1, 4)), "value": 2, "Type": "Dagger"},
20: {"name": "Dagger + 1", "damage" : int(random.randrange(1, 4) + 1), "value": 200, "Type": "Dagger"},
21: {"name": "Dagger + 2", "damage" : int(random.randrange(1, 4) + 2), "value": 750, "Type": "Dagger"},
22: {"name": "Dagger + 3", "damage" : int(random.randrange(1, 4) + 3), "value": 2000, "Type": "Dagger"}
}
每次我尝试调用 "damage"
时,它只会返回相同的结果。我知道这是因为随机数是生成一个然后保存到那个字典键。
每次调用损坏时我将如何生成一个随机数?
最佳答案
我会不厌其烦地在类的 itemsList
实例中制作这些东西。尽管您可能认为这有点矫枉过正,但这样做会给您以后的编程带来很大的灵 active 。它还将使许多代码更易于编写(和阅读),因为您将能够使用点符号而不是通过索引来引用事物,这意味着您不仅可以编写现在使用 itemsList[19].damage
而不是 itemsList[19]["damage"]
。您还将对所有其他属性使用相同的语法,例如 itemsList[1].name
和 itemsList[2].value
,并且能够编写条件代码如下:
if hasattr(itemsList[2], 'Class'):
# do something based on itemsList[2].Class
我的意思是:
import random
class Gear(object):
def __init__(self, **kwargs):
kwargs['_damage'] = kwargs.pop('damage', False)
self.__dict__.update(kwargs)
@property
def damage(self):
return int(random.randrange(*self._damage)) if self._damage else 0
itemsList = {
1: Gear(name="Padded Armor", armor=1, value=5, Class="Light"),
2: Gear(name="Leather Armor", armor=2, value=10, Class="Light"),
# ...
19: Gear(name="Dagger", damage=(1, 4), value=2, Type="Dagger"),
20: Gear(name="Dagger + 1", damage=(1, 5), value=200, Type="Dagger"),
21: Gear(name="Dagger + 2", damage=(1, 9), value=750, Type="Dagger"),
22: Gear(name="Dagger + 3", damage=(2, 6), value=2000, Type="Dagger"),
}
在下面的一条评论中回答您的后续问题:
kwargs
是传递给 __init__()
构造方法的所有关键字参数的字典。 (__dict__
是字典的名称,每个实例都在其中存储其属性。)参见 this section在文档中。
damage
由使用 @property
的类定义装饰器,这是一种实际使它成为“数据描述符”的简单方法。这会设置一些东西,以便每当您引用类实例的 damage
属性时,它都会调用一个函数来检索/确定其当前“值”。查看Descriptor HowTo Guide有关 Python 描述符的更多信息。
关于python - 每次调用一个键时,如何从字典中返回一个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39563672/