我正在尝试计算一堆用户的游戏核心,但我还没有真正得到它。这是一个金字塔游戏,你可以邀请人们,你邀请的人被置于关系树中。
因此,如果我邀请X和X邀请Y,我会从他们两个获得回扣。比方说10%^步......
因此,从X获得10%的分数和1%的Y,X从Y获得10%。
因此,为了计算这个,我认为每个“玩家”都有一个计算他的总分的功能。这个函数必须是递归的,并且“知道”它在树中有多远,以便它能够回放正确的值。
def get_score(player):
if children:
score = player.points
for child in children:
score += child.points*math.pow(.1, get_ancestors(child))
score += get_score(child)
return score
else:
return player.points
但这并不合适,它给出了我认为在某些层面上正确的价值但在其他层面却没有的价值。所以认为我的功能被打破了。有人知道如何解决这个问题吗?
答案 0 :(得分:2)
我怀疑这两行
score += child.points*math.pow(.1, get_ancestors(child))
score += get_score(child)
这是一个简单的递归结构,所以我认为像下面这样就足够了
score += get_score(child)*.1
和递归之美会照顾好自己
你也不需要'如果孩子:'检查 它也有帮助
def get_score(player):
score = player.points
for child in children:
score += get_score(child)*.1
return score
答案 1 :(得分:0)
这可能有非常不同的实现,具体取决于分数必须计算的方式:
您是否需要实时传播每个增益的结果?在这种情况下,您从金字塔的底部开始,并将反馈提供给顶部。
你能负担得起每个人在比赛结束时计算的结果吗?在那个cas中,你可以在每个玩家上设置一个方法,只调用顶部的方法。
E.G代表第二个选项
您使用了功能性方法。虽然这是有效的,但我更喜欢OO所以我会这样:
class Player(object) :
def __init__(self) :
self.score = 0;
self.children = []
def updateScore(self) :
self.score = self.score + sum(((children.score * 10 / 100) for children in self.children))
class Pyramid(object) :
def __init__(self) :
self.top_child = Player()
def updateScore(self, player = None) :
if player == None :
player = self.top_child
for child in player.children :
self.updateScore(child)
child.updateScore()
您可能希望使用itertools来降低CPU和内存密集度。