我正在尝试构建一款《幸存者》游戏,该游戏将允许我将存储的角色单独或作为部落成员进行比较。我可以用一个属性来做这件事,但无法找到将其扩展到多个属性的最佳方法。
示例:
TribeAStr = {'John': 50, 'Tyler': 55, 'Joe': 90, 'Bob': 55}
# check who is the strongest Survivor
$ strongest = max(TribeAStr, key=TribeAStr.get)
#Remove him from TribeA
del TribeAStr[strongest]
#Check how strong the Tribe is as a whole
$ tribeastrength = sum(TribeAStr.values())
我想做的是让每个幸存者都有自己的房子,然后用他们的名字作为钥匙,然后可以把钥匙拉到类似的场景中。类似这样的东西:
class Survivor:
def __init__(self, name, str=None, int=None, cha=None, luk=None):
self.name = name
self.str = strength
self.int = intelligence
self.cha = charisma
self.luk = luck
TribeA = {}
John = Survivor{'John', 50, 40, 55, 20}
Bob= Survivor{'Bob', 55, 40, 80, 25}
Joe= Survivor{'Joe', 60, 10, 65, 10}
Tyler= Survivor{'Tyler', 56, 30, 15, 25}
TribeA.update('John', 'Bob', 'Joe', 'Tyler')
# check who is the strongest Survivor
$ strongest = max(Survivor, Survivor.str) for Survivor in TribeA
有什么建议吗?
您的第一个问题是语法错误:
John = Survivor{'John', 50, 40, 55, 20}
在Python中,您可以像调用普通函数一样调用构造函数,使用括号:
John = Survivor('John', 50, 40, 55, 20)
你的第二个问题是,你不能用一个键列表update
一个dict;您需要使用dict(或键值对列表(更新它。否则它怎么知道你想要什么价值观?因此:
TribeA.update({'John': John, 'Bob': Bob, 'Joe': Joe, 'Tyler': Tyler})
但实际上没有理由仅仅为了update
it而创建一个空dict;只需一次创建即可:
TribeA = {'John': John, 'Bob': Bob, 'Joe': Joe, 'Tyler': Tyler}
如果每个名字都要写两次似乎是重复的,你可以通过使用dict理解来解决这个问题:
TribeA = {survivor.name: survivor for survivor in (John, Bob, Joe, Tyler)}
或者,也许你一开始就不想创建这些变量;您可以直接将对象存储在dict:中
TribeA = {}
TribeA['John'] = Survivor('John', 50, 40, 55, 20)
# etc.
您的第三个问题是理解语法错误:
strongest = max(Survivor, Survivor.str) for Survivor in TribeA
你必须把整个理解放在传递给max
的括号里。此外,你想根据力量对它们进行排序,所以你希望力量在这对中排在第一位,而不是发送。最后,如果你的部落是一个dict,你不能只是在dict上循环——它只会给你钥匙。您需要在值上循环:
strongest = max((survivor.str, survivor) for survivor in TribeA.values())
但请注意,这不仅会给你最强的幸存者,还会给你两个值,最强幸存者的力量和幸存者。你可以扔掉你不想要的:
_, strongest = max((survivor.str, survivor) for survivor in TribeA.values())
……但可能最好使用一个关键函数,如排序HOWTO:中所述
strongest = max(TribeA.values(), key=lambda survivor: survivor.str)
这应该有效:
In [19]: class Survivor:
...: def __init__(self, name, strength=None, intelligence=None, charisma=None, luck=None):
...: self.name = name
...: self.strength = strength
...: self.intelligence = intelligence
...: self.cha = charisma
...: self.luk = luck
In [21]: TribeA = []
...: John = Survivor('John', 50, 40, 55, 20)
...: Bob= Survivor('Bob', 55, 40, 80, 25)
...: Joe= Survivor('Joe', 60, 10, 65, 10)
...: Tyler= Survivor('Tyler', 56, 30, 15, 25)
...: TribeA.extend([John, Bob, Joe, Tyler])
In [25]: strongest = max(TribeA, key=lambda x: x.strength)
In [26]: strongest.name
Out[26]: 'Joe'
要从翠贝卡移除最强玩家,请使用以下选项:
TribeA = list(filter(lambda x: x != strongest, TribeA))
# or going by name
# TribeA = list(filter(lambda x: x.name != strongest.name, TribeA))
您可以定义一种用于确定Survivor
的总体评级的方法,可能是所有属性中的sum
,并将其用作max
的key
,以确定最强的Survivor
:
class Survivor:
def __init__(self, name, str=None, int=None, cha=None, luk=None):
self.name = name
self.str = str
self.int = int
self.cha = cha
self.luk = luk
def overall(self):
return sum(getattr(self, attr) for attr in ('str', 'int', 'cha', 'luk'))
John = Survivor('John', 50, 40, 55, 20)
Bob= Survivor('Bob', 55, 40, 80, 25)
Joe= Survivor('Joe', 60, 10, 65, 10)
Tyler= Survivor('Tyler', 56, 30, 15, 25)
TribeA = [John, Bob, Joe, Tyler]
strongest = max(TribeA, key=Survivor.overall)
print(strongest.name)
该输出:
Bob