我正在创建一个基本游戏来帮助理解课程,Player()
实例(Ben)拥有许多建筑物和单元。每个玩家,如本将拥有各种建筑物,如飞机工厂或Bot工厂。
class Player:
def __init__(self):
self.money = 200
self.score = 0
print('Created ')
def increase_money(self, amount):
self.money += amount
def decrease_money(self, amount):
self.money -= amount
def check_money(self):
print(self.money)
class Building(Player):
def __init__(self):
self.level = 0
self.upgrade_cost = 100
print('created building')
def upgrade_building(self):
self.level += 1
def check_building_level(self):
print(self.level)
ben = Player()
我已经意识到,如果我调用Building()
类来创建一个实例,它实际上会创建一个继承了播放器属性的构建实例(即每个建筑物都有自己的钱)。
我如何让每个玩家包含不同属性的各种建筑物和单位?例如,本和比尔有不同的建筑物。在这种情况下,我会使用单个Player()
类,然后使用Player()
内的函数吗?
答案 0 :(得分:5)
首先,从Building
继承的Player
没有多大意义,Building
和Player
之间的是-a 关系似乎很奇怪,就像一个语义错误。
不要继承Player
,即:
class Building(object):
# code for the class
现在针对您的其他问题,如果您希望每个Player
能够聚合Building
个对象的多个实例,则可以使Player
的每个实例都具有集合属性(a列表或集合)来存储Building
个实例。
要实现此目的,您可以添加
行self.buildings = []
到__init__
的{{1}}方法。最初,此列表将为空。要为特定播放器添加建筑物,请附加到其Player
属性,例如:
buildings
玩家p = Player()
p.buildings.append(Building())
p.buildings.append(Building())
p.buildings[1].upgrade_building()
现在有两座建筑物,第二座建筑物升级一次。这只是一个如何做到这一点的一般演示。如果没有关于您希望程序采用的方向的更多信息,我就无法多说些什么。
答案 1 :(得分:2)
您的播放器构造没有跟踪所拥有建筑物的属性。您的建筑物也没有所有者。所以你需要:
class Player:
def __init__(self):
self.money = 200
self.score = 0
self.buildings = []
print('Created ')
def increase_money(self, amount):
self.money += amount
def add_building(self, Building):
#Here's what to call when we construct a new building with the owner
self.buildings.append(Building):
def decrease_money(self, amount):
self.money -= amount
def check_money(self):
print(self.money)
class Building:
def __init__(self, Owner, Type)
#Constructor now requires an Owner and Type:
self.level = 0
self.owner = Owner
self.Type = Type
self.upgrade_cost = 100
print('created building')
Owner.add_building(self) #And now we will add this to the owner's buildings set
def upgrade_building(self):
self.level += 1
def check_building_level(self):
print(self.level)
要创建建筑物,您可以这样称呼它:
P = player()
B1 = Building(P, "Building type")
这将添加到玩家的拥有建筑物列表中。此外,您可以查看每个建筑物的所有者(“建造了多少个Bot工厂?”)。您还可以查看玩家的建筑物。
答案 2 :(得分:0)
所以这个答案更多是为了参考目的 - 有人可能会尝试做同样的事情。
我实际上找到了最好的方法,最干净的是从Player类调用Building类:
class Player:
def __init__(self):
self.money = 200
self.score = 0
print('Created ')
self.bot_factory = Building('Bot Factory') # [1]
self.vehicle_factory = Building('Vehicle Factory')
def increase_money(self, amount):
self.money += amount
def decrease_money(self, amount):
self.money -= amount
def check_money(self):
print(self.money)
class Building(Player):
def __init__(self):
self.level = 0
self.upgrade_cost = 100
print('created building')
def upgrade_building(self):
self.level += 1
def check_building_level(self):
print(self.level)
ben = Player()
这样,每个玩家,比如Ben都有自己的版本bot_factory和vehicle_factory。然后,我打算通过ben.building_upgrade('bot','upgrade')
之类的调用来升级建筑物,该调用从Player类调用Building函数。