如何解决这个复杂的递归问题,金字塔点系统

时间:2009-07-23 13:55:35

标签: python django recursion

我正在尝试为ARG游戏编写金字塔,如得分系统,并提出了一个问题。当用户进入游戏时,他们会开始一个新的“金字塔”,但是如果用另一个玩家的引用代码开始游戏,他们就会变成这个用户的孩子,然后踢出积分。

这里的问题不是点数计算,我已经得到了你们的一些好帮助,但是如果用户得到更多的点是它的父级,他们应该在梯子中切换位置。这样用户父母就会变成孩子,等等。

我现在使用的python代码没有正常工作,我真的不知道为什么。

def verify_parents(user):
    """
    This is a recursive function that checks to see if any of the parents
    should bump up because they got more points than its parent.

    """
    from rottenetter.accounts.models import get_score

    try:
        parent = user.parent
    except:
        return False
    else:
        # If this players score is greater than its parent
        if get_score(user) > get_score(parent):
            # change parent
            user.parent = parent.parent
            user.save()

            # change parent's parent to current profile
            parent.parent = user
            parent.save()
        verify_parents(parent)

在我看来这应该有效,如果用户有父母,检查用户是否得到的分数多于其父母,如果是,则将用户父母设置为父母父母,并将父母父母设为用户,然后他们已切换位置。然后,调用与父项相同的函数作为目标,以便它可以自行检查,然后继续上升。

但这并不总是有效,在某些情况下,人们不会因某种原因而陷入正确的位置。

编辑:

当一个用户在梯子中向上或向下一步时,它的孩子随身携带,因此他们仍然与同一个父母有关,除非他们获得更多积分并加强。所以对父母不应该做任何事都应该是不必要的吗?

2 个答案:

答案 0 :(得分:1)

我认为您的问题可能是您没有将profile的孩子设置为现在拥有parent他/他们的父母,除非有父母的孩子也不能成为父母在你的系统中(我认为不是这样)。

或者(或可能与之前一起),您可能只想parent = profile.parent而不是parent = profile.parent.get_profile()

编辑:虽然使用user代替profile,但我发现您确实切换到了第二种形式的内容。

无论如何,由于每个用户可以有多个孩子(正如您在另一个答案的评论中所述),您可能希望从该用户的对象中跟踪每个用户的孩子。有点像...

parent = user.parent
user.parent = parent.parent
parent.parent = user

children = user.children

for child in children:
    child.parent = parent

user.children = parent.children

for child in user.children:
    if child is user:
        child = parent

    child.parent = user

parent.children = children

for child in user.parent.children:
    if child is parent:
        child = user

但这可能需要重构,我可能错过了一些东西。

答案 1 :(得分:1)

[根据您的评论进行更正]

如果“move”的结果从未打算改变树的拓扑结构(即当X成为其旧父Y的父级时,它将其所有子级都赋予Y),那么最简单的可能就是将其解耦来自“用户”的概念“金字塔节点”,具有一对一的关系。然后,如果'swap'操作不改变树的拓扑结构,则只需要在'nodeA< =>之间交换映射。 userA'和'nodeB< => userB'所以他们变成'nodeA< => userB'和'nodeB< =>用户A”。

由于树的拓扑结构没有变化,因此可以自动处理具有正确父级的子项。当然,缺点是您不再能够直接从用户记录中找出“父”,而是需要通过节点。

没有代码,因为我不确定您的应用程序详细信息 - 但希望如果这是适用的,它应该很容易变成代码。