我正在尝试为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)
在我看来这应该有效,如果用户有父母,检查用户是否得到的分数多于其父母,如果是,则将用户父母设置为父母父母,并将父母父母设为用户,然后他们已切换位置。然后,调用与父项相同的函数作为目标,以便它可以自行检查,然后继续上升。
但这并不总是有效,在某些情况下,人们不会因某种原因而陷入正确的位置。
编辑:
当一个用户在梯子中向上或向下一步时,它的孩子随身携带,因此他们仍然与同一个父母有关,除非他们获得更多积分并加强。所以对父母不应该做任何事都应该是不必要的吗?
答案 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”。
由于树的拓扑结构没有变化,因此可以自动处理具有正确父级的子项。当然,缺点是您不再能够直接从用户记录中找出“父”,而是需要通过节点。
没有代码,因为我不确定您的应用程序详细信息 - 但希望如果这是适用的,它应该很容易变成代码。