私はクラスを作って、その属性hpは常に0とmaxhpの間にとどまっています 理論では、hpのプロパティは私に希望の結果を与える必要があります。クラスのプロパティは属性を制限しません
属性をリンクする方法はありますか?だから私はユニットクラスオブジェクトの位置を格納しています。 2つの場所では、[x、y]配列を含む属性位置ともう1つの属性属性x、yに格納され、それぞれにintが格納されます。 self.xまたはself.yを変更すると、self.positionが変更され、逆も同様です。あなたの__init__
で
class units(object):
def __init__(self,typus, position, stats):
self.type = typus
#they should be linked both directions
self.position = position
self.x = self.position[0]
self.y = self.position[1]
self.attack = stats[0]
self.defense = stats[1]
self.maxhp = stats[2]
self.hp = self.maxhp
def __repr__(self):
text = "This a %s at position [%s,%s].\n Attack: %s \n Defense: %s \n Hp : %s/%s \n " \
% (self.type,self.position[0],self.position[1], self.attack, self.defense, self.hp, self.maxhp)
return text
# hp set to always be in between 0 and maxhp
@property
def hp(self):
return self.__hp
@hp.setter
def hp(self, hp):
if hp < 0:
self.__hp = 0
if hp > self.maxhp:
self.__hp = self.maxhp
else:
self.__hp = hp
def takedmg(self,dmg):
self.hp -= max(dmg-self.defense, 0)
if self.hp <= 0:
self.alive = False
return self.hp
p = units("peasant", [1,1], [2,0,30])
p.takedmg(100)
print (p.hp) # it should be 0!
と一緒に:
hp
が0未満である場合に、self.__hp
は最初if
に0に設定され、その後、elif
せずに、それはelse
に負の値に設定されているため、2番目のif
文はelif
に置き換えてください私の答えで与えられた変更は、長い '__repr__'に対して[' str.format() '](https://docs.python.org/3/library/string.html#format-string-syntax)の使用を検討してください。 – aneroid