Понимание экземпляров класса Python - PullRequest
2 голосов
/ 29 марта 2009

Я работаю над проблемой, которая использует класс python и имеет функцию конструктора, которая задает количество сторон для одного кубика, и функцию для броска кубика со случайным числом, возвращаемым на основе количества сторон. Я понимаю, что код очень простой, но у меня возникают проблемы с пониманием того, как суммировать три бросанных кубика с разных сторон. Поскольку переменная передает экземпляр функции, что будет лучшим способом получить это значение, чтобы сложить его? Вот что у меня есть.

* Чтобы прояснить ... Я могу получить итоги roll1.roll_dice (), чтобы сложить, но я должен показать каждый бросок отдельно, а затем сумму трех кубиков. Я могу сделать любой из этих, но не оба.

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

Ответы [ 8 ]

10 голосов
/ 29 марта 2009

Вы можете сохранить результаты в виде списка:

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

тогда вы можете показать отдельные результаты

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

или сумма их

>>> print sum(rolls)
13

Или вместо этого вы можете оставить промежуточный итог:

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

(отредактировано, чтобы отразить изменения / пояснения к вопросу)

3 голосов
/ 29 марта 2009

Также может быть полезно просто сохранить последний бросок, чтобы вы могли получить его в любое время.

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
3 голосов
/ 29 марта 2009

Я не уверен точно, где ты запутался. Самое простое, что вам нужно сделать, это отделить концепцию конкретного кубика, который вы собираетесь бросить (объект) с действием (бросить его). Я бы начал здесь:

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)

... а затем полюбите списки и т. Д.

1 голос
/ 29 марта 2009

Поскольку roll_die возвращает значение, вы можете добавить эти значения.

Попробуйте это.

roll1.roll_die() + roll2.roll_die()

Что происходит?

0 голосов
/ 30 марта 2009

Давай сойдём с ума :) (вместе с моим последним ответом)

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)
0 голосов
/ 29 марта 2009

Если я вас правильно понял, вам нужен атрибут класса.

ОБНОВЛЕНИЕ: Добавлен способ автоматического сброса всего

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 голосов
/ 29 марта 2009

Думаю, я бы сделал что-то вроде этого:

# 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

Вы также можете объединить несколько из этих шагов, если хотите:

for num_sides in [6,4,12]:
    print Die(num_sides).roll_die()
0 голосов
/ 29 марта 2009

Вы можете просто сложить числа. Если вы хотите суммировать результат бросков n , рассмотрите возможность добавления этой функции в класс:

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

Также рассмотрите возможность переименования roll_die в roll . Очевидно, что речь не идет о бросании камня, поскольку метод является частью класса Die .


Редактировать : Теперь я прочитал, что вам нужно напечатать промежуточные рулоны. Рассмотрим:

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

Теперь вы можете бросить 7-сторонний кубик 10 раз:

rolls = Die(7).n_rolls(10)
print(rolls, sum(rolls))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...