骰子直方图-OOP(作业)

时间:2019-05-09 04:02:13

标签: python

我是Python的初学者,在过去的几天里,我一直试图解决一个练习失败的问题。这是老师给我们做的面向对象的编程练习。

这是提供的主要练习和代码:


锻炼:

在此作业中,您将编写一个程序来构建骰子掷骰的直方图。询问用户要进行几轮(掷两个骰子)。该程序应模拟许多随机回合,并输出一个直方图,计算两个骰子的总数为2、3、4 ...最多12个的次数。这是一个典型的运行:

您要进行几轮? (或Enter退出):1000000

1000000发后: 2:计数为28012或2%

3:计数为55665或5%

4:计数为83513或8%

5:计数为110874或11%

6:计数为138351或13%

7:计数为166296或16%

8:计数为139313或13%

9:计数为110814或11%

10:计数为83521或8%

11:计数为55792或5%

12:计数为27849或2%

想法是采用三层方法:

1)主代码创建一个“游戏”对象。然后,主代码循环运行,询问用户要进行多少回合,然后告诉Game对象“运行”模拟。

2)Game对象的初始化应创建13个“ Bin”对象-一个代表每个可能的总数(即使不可能获得带有两个骰子的0或1),并将这些对象存储在Bin对象的列表中。然后,当主代码告诉Game对象运行时,Game对象应重置Bin对象并执行给定数量的模拟掷骰。每次滚动时,都应告知相应的纸箱以增加其自身。最后,它应该打印一个标题,然后告诉每个Bin对象显示其报告。

3)每个Bin对象均应使用其bin编号进行初始化,并保持一次计数将掷骰总数乘以Bin表示的数量的计数。 Bin对象应具有以下方法:

__init__-将在bin标识符(0到12之间的数字)中传递

reset-将传递的总卷数

increment-没有要传入的值

show-没有要传递的值。模拟结束时调用。仅当bin标识符为2或更大时才打印。它应该计算百分比并打印垃圾箱标识符,计数和百分比。

因此,老师提供的初始文件是:

初始代码(空白):

import random

class Bin():
    def __init__(self, binIdentifier):
        pass

    def reset(self, nRoundsToDo):
        pass

    def increment(self):
        pass

    def show(self):
        pass


class GameMgr():
    def __init__(self):
        pass

    def run(self, nRounds):
        pass

oGameMgr = GameMgr()
while True:
    maxRounds = input('How many rounds do you want to do? (or Enter to exit): ')
    if maxRounds == '':
        break
    maxRounds = int(maxRounds)
    oGameMgr.run(maxRounds)

print('OK bye')

这是我到目前为止所完成的:

# Dice - count totals in user-defined number of rounds

import random

class Bin():

    def __init__(self, binIdentifier):
        self.binIdentifier = binIdentifier
        binIdentifier = 0
        self.number_of_rounds = 0

    def reset(self, nRoundsToDo):
        self.nRoundsToDo = nRoundsToDo
        nRoundsToDo = 0
        self.bin_count = 0

    def increment(self):
        self.bin_count = self.bin_count + 1

    def show(self):
        print(bin_count)
        self.bin_chances = self.bin_count/self.number_of_rounds
        print(bin_chances)


class GameMgr():

    def __init__(self):
        self.bins_list = [ ]
        for i in range(0,13):
            self.bins_list.append(Bin(i))

    def run(self, nRounds):
        self.nRounds = nRounds
        dice1 = random.randint(1,6)
        dice2 = random.randint(1,6)

        for i in self.bins_list:
            i.reset(self.nRoundsToDo)

        for o in self.bins_list:
            bin_roll = dice1 + dice2
            self.bins_list[bin_roll].increment()

oGameMgr = GameMgr()

while True:
    maxRounds = input('How many rounds do you want to do? (or Enter to exit): ')
    if maxRounds == '':
        break
    maxRounds = int(maxRounds)
    oGameMgr.run(maxRounds)

print('OK bye')

1 个答案:

答案 0 :(得分:0)

您要混合使用camelCase和snake_case作为变量名(您的类名很好)。选择一种命名约定并坚持使用。

在您的Bin的{​​{1}}方法中,您具有:

__init__

不需要将binIdentifier设置为零,因为这基本上不执行任何操作。

在您的class Bin(): def __init__(self, binIdentifier): self.binIdentifier = binIdentifier binIdentifier = 0 self.number_of_rounds = 0 的{​​{1}}方法中,您具有:

Bin

同样,您不需要将参数(nRoundsToDo)设置为零。根据此方法,您的类具有名为reset的实例变量,但是根据您的 def reset(self, nRoundsToDo): self.nRoundsToDo = nRoundsToDo nRoundsToDo = 0 self.bin_count = 0 方法,您的类也具有名为nRoundsToDo的实例变量。在我看来,这两个都应该代表相同的数量。选择一个并坚持下去(我个人更喜欢__init__)。 此外,也许更关键的是,Bin对象实际上不必关心有多少回合。关心轮数的是GameMgr(游戏管理器)类。我会给GameMgr类这个实例变量。 Edit *看来Bin类确实确实需要知道回合数(在show方法中,要计算百分比)。

此外,您还希望number_of_rounds的{​​{1}}将number_of_rounds初始设置为零。

最后,您的Bin的{​​{1}}方法需要以某种方式使用回合数。您必须创建一个循环,将两个骰子掷出n次(其中n是回合数)。