我正在python中制作一个civclicker类型的游戏,这需要我在食物变量变为负数时杀死工人。
目前我正在考虑使用的方法是在列表中使用random.choice,我想知道是否可以使列表保持对变量的引用。
这是我的功能:
self.maxPopulation = 0
self.workers = 0
self.farmers = 0
self.miners = 0
self.loggers = 0
def random_killer(self, amount):
for i in range(round(amount)):
choice = []
choice += [self.farmers] * self.farmers + [self.miners] * self.miners + [self.loggers] * self.loggers + [self.workers] * self.workers
chosen = random.choice(choice)
chosen -= amount
所以这显然不起作用,因为结果choice
列表只是一个数字数组。我还制作了self.farmers
等文本字符串并使用了exec函数(这不起作用),但我知道使用exec / eval是不好的做法。
另一个考虑因素是将所有内容都移到字典中,但这需要对代码进行更全面的检查 - 当其他一些基本系统到位时,我就会离开。
忽略这一点 - 我很好奇你是否可以在列表中存储对self.farmers
等变量的引用,而不是传入数字。
所以我的问题是:你可以将引用或指针存储到列表中的变量,例如self.farmers
,以便引用可以传递给另一个变量chosen
,允许我动态修改self.farmers
。
编辑:
添加了更多细节。 self.farmers/miners/loggers/workers
是对每个类别中人数的引用。
上述函数应该创建一个列表,该列表是通过引用上述变量,然后将变量的引用数乘以变量所代表的数。所以从某种意义上说,如果我们有5个农民,我们会得到一个类似[self.farmers, self.farmers, self.farmers, self.farmers, self.farmers]
的清单。
在人为的意义上,列表中的每个项目代表游戏中的一个人,当他们被选中时,该人被杀死。实际上它只是对同一个变量的一些引用,然后在选择时减少了任意数量。
答案 0 :(得分:1)
使用字典可能会更容易。为简洁起见,我将在类外部演示它,但它很容易成为实例属性(您可以通过属性或__getattr__
将值公开为属性):
>>> import random
>>> people = {'miners': 1,
'workers': 2,
'farmers': 3,
'loggers': 4}
>>> choices = [k for k, v in people.items() for _ in range(v)]
>>> choices
['loggers', 'loggers', 'loggers', 'loggers', 'workers', 'workers', 'miners', 'farmers', 'farmers', 'farmers']
>>> occupation = random.choice(choices)
>>> occupation
'loggers'
>>> people[occupation] -= 1
>>> people
{'loggers': 3, 'workers': 2, 'miners': 1, 'farmers': 3}
请注意,您可能希望在1
循环中减去for
,而不是amount
。
要完全使用属性执行此操作,请使用getattr
和setattr
,并将属性名称存储在choices
中:
class Population(object):
OCCUPATIONS = ('miners', 'workers', 'farmers', 'loggers')
def __init__(self):
self.miners = 1
self.workers = 2
self.farmers = 3
self.loggers = 4
def kill_random(self, n):
for _ in range(n):
choices = [attr for attr in self.OCCUPATIONS
for _ in range(getattr(self, attr))]
occupation = random.choice(choices)
setattr(self, occupation, getattr(self, occupation)-1)
使用中:
>>> a = Population()
>>> a.kill_random(3)
>>> a.miners
0
>>> a.workers
2
>>> a.farmers
1
>>> a.loggers
4