我正在尝试创建一个简单的游戏,该游戏最好玩五局,而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,但这似乎并不那么可扩展。所以我想知道是否有更有效的方法。
谢谢。
答案 0 :(得分:0)
您的根本问题是,您没有创建任何实例。程序中唯一的对象(除了几个数字)是类本身。因此,除了Test
类对象之外,您没有什么要存储的东西了,您会一遍又一遍地追加它,因此最终得到同一类对象的列表(您不断进行变异)200次连续
您要做的是创建200个实例 Team
实例,并将这些属性存储在这些实例上,然后您可以在其中包含200个 separate 对象列表。
首先,您必须使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
实例的列表,而不是200个对team
类对象的引用的列表:
for team in objdata:
print(team.scoreA, team.scoreB)