我正在尝试创建一个简单的游戏,五局四胜,B队每轮有60%的机会获胜。此外,我想模拟每个游戏玩了X次。
理想情况下,在运行完所有模拟之后,我能够访问每个模拟中发生的情况。例如,谁赢了第一轮,谁赢了第二轮,等等,以最有效的方式。
我的想法是,我可以将来自类的所有数据附加到一个列表中,然后访问每个类。但是,除非您附加一个实际的值,否则它不会工作。
下面是代码的一个稍微简化的示例:
class Game(object):
def add_values(self):
if random.random() > 0.6:
Team.scoreA+=1
else:
Team.scoreB+=1
def check_if_end(self):
end = 0
if max(Team.scoreA,Team.scoreB) == 3: end = 1
return end
import random
class Team(object):
def oriscore(self):
Team.scoreA = 0
Team.scoreB = 0
objdata = []
antsim = 200
for a in range(antsim):
Team.oriscore(1)
for i in range(5):
Game.add_values(1)
end = Game.check_if_end(1)
if end == 1:
objdata.append(Team)
break
for i in objdata:
print(i.scoreA,i.scoreB)
打印出下面的值只会显示上一次模拟的结果。而我想要每个模拟的结果。
在这个特定的游戏中,我可以只更改它,这样我就可以同时添加scoreA和scoreB,但是这看起来不是那么可伸缩。所以我想知道是否有更有效的方法。
提前谢谢。
发布于 2018-07-12 07:22:09
这里的根本问题是您没有创建任何实例。程序中唯一的对象(除了几个数字之外)是类本身。因此,您没有任何东西可以存储在列表中,只有Test
类对象,您可以反复追加它,因此您最终得到了一个相同类对象的列表(您不断地改变它) 200次。
您要做的是创建200个实例Team
实例,并将属性存储在这些实例上,然后您就可以在列表中拥有200个单独的对象。
首先,您必须使Team
成为一个在其实例上存储值的类:
class Team(object):
def __init__(self):
self.scoreA = 0
self.scoreB = 0
现在,您必须对Game
执行相同的操作。而且,因为每个Game
都必须使用一个Team
,所以您需要给它一个:
class Game(object):
def __init__(self, team):
self.team = team
def add_values(self):
if random.random() > 0.6:
self.team.scoreA += 1
else:
self.team.scoreB += 1
def check_if_end(self):
end = 0
if max(self.team.scoreA, self.team.scoreB) == 3: end = 1
return end
现在,您的循环可以创建单独的实例。然后,您可以在这些实例上调用方法,而不是在类上调用它们并将1
作为假self
传递
objdata = []
antsim = 200
for a in range(antsim):
team = Team()
for i in range(5):
game = Game(team)
game.add_values()
end = game.check_if_end()
if end == 1:
objdata.append(team)
break
现在,您有了200个不同的team
实例的列表,而不是对Team
类对象的200个引用的列表:
for team in objdata:
print(team.scoreA, team.scoreB)
https://stackoverflow.com/questions/51295220
复制相似问题