2009-07-02 5 views
1

J'essaie de calculer des jeux de cartes pour un groupe sur les utilisateurs et je ne l'ai pas encore vraiment compris. C'est un jeu pyramidal où vous pouvez inviter des gens, et les gens que vous invitez vous sont placés dans l'arbre des relations. Donc, si j'invite X et X à m'inviter Y, je reçois des pots-de-vin de l'un et de l'autre. Disons que 10%^pas ...Calculer le score dans un système de score pyramide

donc de X i obtenir 10% de son score et 1% de Y et X 10% de Y. de

Donc, pour calculer ce que je pensais que chaque "joueur" avait une fonction qui calculait son score total. Cette fonction devait être récursive et "savoir" jusqu'où elle se situait dans l'arbre pour que les bonnes valeurs soient relancées. Mais cela ne fonctionne pas correctement, il donne ce que je crois être les bonnes valeurs dans certains niveaux, mais pas dans d'autres. Alors pense que ma fonction est cassée. Quelqu'un at-il une idée sur la façon de résoudre ce problème?

+0

J'espère que vous n'allez pas aller tous Madoff :) – Makis

+0

Non désolé, c'est en fait pour un jeu ARG avec un prix en argent et sans frais pour le joueur donc pas de soucis ... – espenhogbakk

Répondre

2

Je doute ces deux lignes

score += child.points*math.pow(.1, get_ancestors(child)) 
score += get_score(child) 

ceci est une structure récursive simple, donc je pense que quelque chose comme ci-dessous suffira

score += get_score(child)*.1 

et la beauté récursive prendra soin d'elle-même

vous aussi ne pas besoin de «si les enfants:» vérifier de sorte qu'il aide

def get_score(player): 
    score = player.points 
    for child in children: 
     score += get_score(child)*.1 
    return score 
+0

Vous avez si absolument raison, doh Comment puis-je avoir manqué cela, j'ai définitivement besoin d'une pratique récursive. Merci beaucoup. – espenhogbakk

+0

récursion est fondamentalement si simple qu'il trébuche nos esprits complexes –

0

Cela peut avoir des implémentations très différentes, en fonction de la façon dont le résultat doit calculera:

  • Avez-vous besoin de propager le résultat de chaque gain en temps réel? Dans ce cas, vous commencez à partir du bas de la pyramide et donnez le retour jusqu'au sommet. Pouvez-vous vous permettre le calcul du résultat à la fin du jeu pour tout le monde? Dans ce cas, vous pouvez simplement définir une méthode sur chaque joueur et n'appelez que celle en haut.

pour la seconde par exemple l'option

Vous avez utilisé une approche fonctionnelle. Bien que cela soit valable, je suis plus en OO donc je vais aller dans cette voie:

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() 

Vous pouvez utiliser itertools pour la rendre moins CPU et de mémoire.

Questions connexes