2009-03-29 11 views
2

Je travaille sur un problème qui utilise une classe python et a une fonction constructeur pour donner le nombre de côtés à un dé et une fonction pour lancer le dé avec un nombre aléatoire retourné basé sur le nombre de côtés. Je me rends compte que le code est très basique, mais j'ai de la difficulté à comprendre comment résumer le total de trois dés roulés avec des côtés différents. Puisqu'une variable passe l'instance de la fonction, quelle serait la meilleure façon de récupérer cette valeur pour l'additionner? Voici ce que j'ai.Comprendre les instances de la classe Python

* Pour clarifier ... Je peux obtenir les totaux de roll1.roll_dice() à additionner, mais je dois montrer chaque rouleau individuellement, puis le total des trois dés. Je peux faire l'un de ces deux mais pas les deux.

class Die(): 

     def __init__(self, s = 6): 
      self.sides = s 
     def roll_die(self): 
      x = random.randint(1,self.sides) 
      return x 

     roll1 = Die() #Rolling die 1 with the default side of 6 
     roll2 = Die(4) #Rolling die 2 with 4 sides 
     roll3 = Die(12) #Rolling die 3 with 12 sides 

     print roll1.roll_die() 
     print roll2.roll_die() 
     print roll3.roll_die() 
+0

Voir http: // page d'accueil. mac.com/s_lott/books/oodesign/htmlchunks/pt02.html - en particulier le chapitre 25 - pour plus d'informations sur ce problème spécifique. –

Répondre

3

Je ne sais pas exactement où vous re confus. La chose la plus simple que vous devez faire est de séparer le concept d'un dé spécifique que vous allez lancer (l'objet) avec l'action (le lancer). Je voudrais commencer ici:

d6 = Die() #create die 1 with the default side of 6 
d4 = Die(4) #create die 2 with 4 sides 
d12 = Die(12) #create die 3 with 12 sides 

roll1 = d6.roll_die() 
roll2 = d4.roll_die() 
roll3 = d12.roll_die() 

print "%d\n%d\n%d\nsum = %d" % (roll1, roll2, roll3, roll1 + roll2 + roll3) 

... puis obtenir plus chic avec des listes, etc.

+0

Mon problème était que lorsque je me rappelais l'instance, je recevais une somme différente de celle des dés que je roulais parce qu'elle résumait trois dés différents. Je n'ai pas pensé à la fonction de somme ... c'est exactement ce dont j'avais besoin. Parfois, les choses les plus simples peuvent être si difficiles. Merci. –

+0

Content de vous aider. (mais je n'ai pas mentionné sum(), quelqu'un d'autre l'a fait ...) – mpontillo

1

Depuis roll_die, vous pouvez ajouter ces valeurs.

Essayez ceci.

roll1.roll_die() + roll2.roll_die() 

Que se passe-t-il?

+0

Je suppose que j'aurais dû clarifier ... Je peux obtenir les valeurs de ces jets, mais je dois montrer chacun des jets séparément et ensuite un total pour les trois jets. Donc, si j'ajoute les jets comme vous l'avez fait, je peux obtenir un total, mais pas une valeur pour chaque lancer. –

+0

@jb: Mettez à jour votre question avec des informations supplémentaires. –

0

Vous pouvez simplement additionner les nombres. Si vous voulez résumer les résultats des n rouleaux, pensez à ajouter cette fonction à la classe:

def sum_of_n_rolls(self, n) 
    return sum(self.roll_die() for _ in range(n)) 

En outre, envisager de renommer roll_die juste rouleau. Il est évident qu'il ne s'agit pas de rouler une roche, puisque la méthode fait partie de la classe Die.


Modifier: Je lis maintenant vous avez besoin d'imprimer des rouleaux intermédiaires. Tenir compte:

def n_rolls(self, n): 
    return [self.roll_die() for _ in range(n)] 

Maintenant vous pouvez lancer un dé 7 face 10 fois:

rolls = Die(7).n_rolls(10) 
print(rolls, sum(rolls)) 
10

Vous pouvez stocker les résultats dans une liste:

rolls = [Die(n).roll_die() for n in (6, 4, 12)] 

alors vous pouvez montrer l'individu résultats

>>> print rolls 
[5, 2, 6] 

ou additionnez-les

>>> print sum(rolls) 
13 

Ou, au contraire, vous pouvez garder un total courant:

total = 0 
for n in (6, 4, 12): 
    value = Die(n).roll_die() 
    print "Rolled a", value 
    total += value 
print "Total is", total 

(modifié pour tenir compte des changements/clarifications à la question)

+0

+1 probablement pas ce que le projet de classe nécessite :) J'ai toujours aimé jouer avec les professeurs de CompSci. – David

+0

Cela fonctionnerait, bien que nous devions "Créer trois dés, le premier sans indiquer le nombre de côtés" donc il prend la valeur par défaut du constructeur (6) plutôt que d'appeler 6. Y at-il un moyen de passer une valeur vide dans un liste? –

0

pense que je ferais quelque chose comme ceci:

# Create dice 
sides = [6,4,12] 
dice = [Die(s) for s in sides] 

# Roll dice 
rolls = [die.roll_die() for die in dice] 

# Print rolls 
for roll in rolls: 
    print roll 

Vous pouvez également combiner quelques-unes de ces étapes si vous le souhaitez:

for num_sides in [6,4,12]: 
    print Die(num_sides).roll_die() 
3

Il peut également être utile de stocker tout le dernier rouler ainsi vous pouvez l'obtenir quand vous voulez.

def __init__(self, s = 6): 
    self.sides = s 
    self.last_roll = None 

def roll_die(self): 
    self.last_roll = random.randint(1,self.sides) 
    return self.last_roll 
+0

+1: Change l'état de l'objet. –

0

Si je vous ai bien compris, vous voulez un attribut de classe.

MISE À JOUR: Ajout d'une façon pour reseting automatiquement le total

import random 

class Die(): 
    _total = 0 

    @classmethod 
    def total(cls): 
     t = cls._total 
     cls._total = 0 
     return t 

    def __init__(self, s=6): 
     self.sides = s 

    def roll_die(self): 
     x = random.randint(1,self.sides) 
     self.__class__._total += x 
     return x 

roll1 = Die() #Rolling die 1 with the default side of 6 
roll2 = Die(4) #Rolling die 2 with 4 sides 
roll3 = Die(12) #Rolling die 3 with 12 sides 

print roll1.roll_die() 
print roll2.roll_die() 
print roll3.roll_die() 
print Die.total() 
print "--" 
print roll1.roll_die() 
print roll2.roll_die() 
print roll3.roll_die() 
print Die.total() 
+0

L'utilisation d'une classe attr pour le total semble être un effet secondaire étrange. Surtout dans un jeu où deux joueurs diff lancent le même jeu de dés. Vous obtiendriez des effets secondaires bizarres, plus vous devriez vous rappeler de le remettre à zéro. –

+0

Vrai, mais ce n'est pas le cas d'utilisation Jb décrit (peut-être qu'il devrait clarifier) ​​et je ne suis pas d'accord que des termes comme "étrange" ou "effet secondaire" sont appropriés pour décrire cette solution. BTW, le réglage à zéro pourrait probablement être automatisé par un getter. –

+0

Hmm. Merci les gars. Je pensais aussi à ce que chmod700 a dit. Les trois prochains dé seraient également résumés, où j'aurais besoin qu'il soit réinitialisé. Oui, j'aurais dû clarifier cela. Je joue avec ça. –

0

Obtenons fou :) (combiné avec ma dernière réponse aussi bien)

class Die(): 
    def __init__(self, s = 6): 
     self.sides = s 
     self.last_roll = None 

    def roll_die(self): 
     self.last_roll = random.randint(1,self.sides) 
     return self.last_roll 

dice = map(Die, (6, 4, 12)) 
rolls = map(Die.roll_die, dice) 

print rolls 
print sum(rolls) 
Questions connexes