我是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')
答案 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是回合数)。