【问题标题】:Create random, unique variable names for objects为对象创建随机的、唯一的变量名
【发布时间】:2015-07-24 12:20:06
【问题描述】:

我是第一次玩 Python 和任何编程语言,所以请多多包涵。两周前我开始了在线课程,但尝试在旁边开发一个小游戏以更快地学习(并且玩得开心)。这是一个文字冒险,但会随机遭遇并与拥有随机装备的敌人战斗,然后玩家可以掠夺。

这是我的问题:如果我为随机遭遇创建随机对象/武器,我需要确保对象具有唯一名称。关卡的设计方式理论上可以是无限数量的对象(它可以是开放式的,只是突然出现)。

这是我目前的方法

class Item_NPCs: #create objects for NPCs

    def__init__(self, item_type, item_number):
    # e.g. item_type 1 = weapons, item_type2 = potions, etc.

        if item_type == 1 and item number == 1:
             self.property1 = 5
             self.property2 = 4

        if item_type == 1 and item_number ==2:

       # etc. :)

def prepare_encounter(): 

    inventory_NPC = [] # empty list for stuff the NPC carries around

    XXX = Class_Item(item_type, item_number) # I might randomize the arguments.   

重要的是我希望“XXX”是唯一且随机的,这样任何对象都不会存在超过一次并且以后可以放入玩家的库存中。

怎么做?

【问题讨论】:

  • 重要提示:您的 必须是唯一的,而不是您的变量。变量是算法中的占位符。如果占位符是未定义的混乱,您的算法将无法运行。如果您需要保存多个值,即使是随机值,请使用listdict
  • @deceze 是对的,如果您需要一个随机的 name 对象,您应该考虑将其传递给 Class_Item 的构造函数并将其分配给 @ 的属性987654325@ 实例。
  • 或者如果名称总是在“Item X”的形式上,你可以在构造函数中生成该名称,方法是让类密切关注已创建实例的数量。

标签: python variables random unique names


【解决方案1】:

为什么你需要它是随机的?您可以简单地使用列表,并将每个新对象附加到列表中,其索引是其唯一标识符:

items = []
items.append( Class_Item(item_type, item_number) )

但如果你真的需要随机标识符,也许你可以使用字典:

items = dict()
items[random_id] = Class_Item(item_type, item_number)

这要求 random_id 是可散列的(但它应该是数字或字符串)。

【讨论】:

  • 好的,这很有趣,因为它暗示我做错了。我预计在相同的变量名下创建两个相同的对象然后尝试将其视为两个不同的对象将是一个问题。如果我理解正确的话,在不同索引的同一个列表中就足够了两个让 python 把这个东西当作两个不同的对象?如果是这样,我不需要随机名称。我认为这是必要的。 --> 抱歉,现在不能测试任何东西。在工作中。
  • 您可以创建具有不同名称的对象,但我认为这不是您真正想要的。您真正想要的是对象的集合:玩家的对象、敌人的对象等...这为您的程序提供了结构(并避免了变量的混乱,就像 deceze 所说的那样),但它也为您提供了更强大的功能操纵物体。例如,使用player_items list/dict,您可以通过简单的循环向玩家显示他的物品:for item in player_items: print(item),并且在战斗结束时,您可以添加战利品:player_items.extend(enemy_items)
  • 我喜欢扩展的东西。不过,我可能会让玩家选择要掠夺什么。 ....顺便说一句:这就是我目前所得到的库存和对象模块:trinket.io/library/trinkets/1210c14e8c ...我问是因为现在我想添加 enctounter 系统并相信我需要不同的变量名。但是......这里的帖子暗示情况并非如此。期待实验。
  • 选择战利品可以通过类似的方式完成。你可以打印敌人的物品和他们的id号:for id, item in enumerate(enemy_items): print(id, item),用chosen_loot = raw_input()从玩家那里得到他想要的物品的id列表,然后将它们添加到玩家的物品中:player_items.extend([enemy_items[id] for id in chosen_loot])。我在这里要强调的是,使用listdictset 等数据结构是处理大量对象集合的正确方法,并且可以让您以更简单、更清晰的方式做事.
  • 从我在您的代码中看到的,您的方法非常 OOP。我认为使用数据结构可以更有效地做一些事情。如果这是您第一次编程,我不确定 OOP 是否是最好的开始方式。它很容易走错路:例如,您创建了一个Item 类,然后通过item_type 字段识别它是什么类型的对象,这对我来说似乎是错误的,您不使用多态性,然后结束有很多if-elif。此外,在创建自己的数据结构之前,最好了解如何使用该语言的本机数据结构。
【解决方案2】:

我不知道为什么其他人没有想到这一点:

yourvariableName = randint(0,1000)
exec("var_%s = 'value'" % yourVariableName)

我只是自己想到的。希望对你有帮助。

缺点是你不能这样做:

print(var_yourVariableName)

你只能这样做:

exec("print(var_%s)" % yourVariableName)

但是您可能会以一种或另一种方式规避这一点。如果您设法弄清楚,请发表评论。

还有一个缺点——如果以某种方式使用,它可能非常不安全(因为我们使用的是exec),所以一定要覆盖所有漏洞!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多