我正在使用Python 2.7制作TBRPG游戏,而且我目前正在制作一个任务系统。我想创建一个函数来检查列表中的所有任务,在这种情况下(quests
),并告诉您列表中的任何任务是否具有相同的ID或名称,如果他们这样做multiple_id
和multiple_names
将上升1.
class Quest:
def __init__(self, target, name, ID, required_level, objective_requirements, reward_gold, reward_exp, reward_item):
self.target = target
self.name = name
self.ID = ID
self.req_level = required_level
self.objective_default = 0
self.objective_req = objective_requirement
self.reward_gold = reward_gold
self.reward_exp = reward_exp
self.reward_item = reward_item
def accept(self):
if self.target.level >= self.req_level:
self.target.quest.append(self.ID)
else:
pass
def turn_in(self):
if self.reward_exp >= 0:
self.target.exp += self.reward_exp
print '...'
if self.reward_gold >= 0:
self.target.gold += self.reward_gold
print '...'
if self.reward_item == None:
pass
else:
self.target.inventory.append(self.reward)
print '...'
def test_quests(list):
multiple_id = 0
multiple_names = 0
for x in list[:]:
print 'ID ' + str(x.ID)
print 'Name ' + x.name
print 'Target ' + str(x.target)
print 'Required Level ' + str(x.req_level)
print 'Objective Default ' + str(x.objective_default)
print 'Objective Requirement ' + str(x.objevtive_req)
print 'Reward Gold ' + str(x.reward_gold)
print 'Reward Exp ' + str(x.reward_exp)
print 'Reward Item' + str(x.reward_item)
print "Multiple ID's found = %d" % multiple_id
print "Multiple Name's found = %d" % multiple_names
me = 'Just a filler ATM...'
Quest1 = Quest(me, 'A Simple Task', 001, 0, 1, 100, 20, None)
Quest2 = Quest(me, 'A Difficult Task', 702, 0 , 1, 0 ,0, None)
quests = [Quest1, Quest2]
test_quests(quests)
我不知道如何做到这一点。
答案 0 :(得分:0)
您可以创建一个包含不同ID的set
,然后将该组的大小与任务总数进行比较。差异告诉您重复的ID数量。名字相同。
像这样(未经测试):
def test_quests(quests):
num_total = len(quests)
different_ids = len(set((q.ID for q in quests)))
different_names = len(set((q.name for q in quests)))
print "Multiple ID's found = %d" % (num_total - different_ids)
print "Multiple Name's found = %d" % (num_total - different_names)
此外,实施Quest.__repr__
和/或Quest.__str__
可能是一个好主意,因此您只需执行print some_quest
即可打印该任务的所有详细信息。
答案 1 :(得分:0)
获取重复的ID /名称数量:
id_set = set(map(lambda x: x.ID, quests))
name_set = set(map(lambda x: x.name, quests))
multiple_id = len(quests) - len(id_set)
multiple_names = len(quests) - len(name_set)
如果您想获得每个ID /名称的现有时间,可以在上面的代码中使用collection.Counter代替 set
答案 2 :(得分:0)
您的Quest类看起来像god object。
class Quest:
def __init__(self, target, name, ID, required_level, objective_requirements, reward_gold, reward_exp, reward_item):
查看需要多少输入。
您应该尝试隔离其关注点并将其拆分为更多类。
一个班级应该只有一个问题。
也许你应该把奖励分给另一个班级。
将目标要求分解为单独的课程也是有道理的。或者甚至是一个要求的类,然后简单地将客观要求列为需求列表。
因此,您可以声明需要满足列表中的所有要求。但是每个要求都可以包含备用要求,例如,将项目A给予人员A或给予人员B.让需求类处理或者,并且任务类处理和。
一旦你关闭了Quest类,你应该创建一个QuestFactory来创建任务并创建一个任务应该检查没有其他任务具有相同的id或相同的名称,或者计数那里是多个等。
如果你绝对想要计算同一个id / name的出现次数,不要重新发明轮子,请使用python数学库,如pandas或类似的东西。
import pandas as pd
df = pd.DataFrame("ID":[x.id for x in quests], "Name":[x.name for x in quests])
print df.ID.value_counts()
print df.Name.value_counts()