2

私はpythonクラスを使用し、1つのサイコロに面の数を与えるコンストラクタ関数と、面の数に基づいて返される乱数でサイコロを振る関数を持つ問題に取り組んでいます。コードが非常に基本的なものであることは認識していますが、3 つのサイコロを振って面が異なる合計を合計する方法を理解するのに苦労しています。変数は関数インスタンスを渡しているので、その値を取得して合計する最良の方法は何でしょうか? これが私が持っているものです。

*明確にするために... roll1.roll_dice() の合計を取得できますが、各ロールを個別に表示してから、3 つのサイコロの合計を表示する必要があります。どちらかはできますが、両方はできません。

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

8 に答える 8

10

結果をリストに保存できます。

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

(質問への変更/説明を反映するために編集されました)

于 2009-03-29T02:32:52.673 に答える
3

いつでも取り出せるように、最後のロールを保管しておくことも便利です。

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
于 2009-03-29T03:01:03.883 に答える
3

どこで混乱しているのか正確にはわかりません。あなたがする必要がある最も簡単なことは、あなたがロールしようとしている特定のサイコロ (オブジェクト) の概念をアクション (ロールする) と分離することです。ここから始めます:

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)

...そして、リストなどでより洗練されたものになります。

于 2009-03-29T02:37:16.220 に答える
1

値を返すのでroll_die、それらの値を追加できます。

これを試して。

roll1.roll_die() + roll2.roll_die()

何が起こるのですか?

于 2009-03-29T02:22:54.477 に答える
0

私があなたを正しく理解していれば、クラス属性が必要です。

更新:合計を自動的にリセットする方法を追加しました

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()
于 2009-03-29T06:36:33.430 に答える
0

夢中になりましょう:)(私の最後の答えと組み合わせて)

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)
于 2009-03-29T22:26:23.023 に答える
0

私はこのようなことをすると思います:

# 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()
于 2009-03-29T02:56:51.447 に答える
0

数字を合計するだけです。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))
于 2009-03-29T02:30:02.743 に答える