又重看了一遍类和对象,感觉不会的地方还是有不少,通过代码来熟悉吧
练习:奥特曼打小怪兽
奥特曼:名字,血量,魔法值,魔法攻击,普通攻击,大招,魔法值可以恢复
怪兽:名字,血量,普通攻击
公共的:名字,血量,是否存活,攻击
from random import random,randint
from abc import ABCMeta,abstractmethod
#通过abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果,抽象类不能实例化,专门为了让别的类继承它
class Fighter(object, metaclass=ABCMeta):
#通过__slots__魔法限定对象可以绑定的成员变量
__slots__ = ('_name','_hp')
def __init__(self,name,hp):
self._name = name
self._hp = hp
@property
def name(self):
return self._name
@property
def hp(self):
return self._hp
@hp.setter
def hp(self,hp):
self._hp = hp if hp >= 0 else 0
@property
def alive(self):
return True if self._hp > 0 else False
@abstractmethod
def attack(self,other):
pass
class ultaman(Fighter):
__slots__ = ('_name','_hp','_mp')
def __init__(self,name,hp,mp):
super().__init__(name,hp)
self._mp = mp
def attack(self,other):
other.hp -= randint(10,20)
def huge_attack(self,other):
if self._mp >= 50:
self._mp -=50
injury = other.hp * 3 // 4
other.hp -= 50 if injury < 50 else injury
return True
else:
return False
def magic_attack(self,others):
if self._mp >= 20:
self._mp -=20
for other in others:
if other.alive:
other.hp -=randint(10,15)
return True
return False
def resume(self):
self._mp +=randint(1,20)
return self._mp
def show(self):
print(self.name,'奥特曼',' 生命值:',self.hp,'魔法值:',self._mp)
class Monster(Fighter):
__slots__ = ('_name','_hp')
def attack(self,other):
other.hp -= randint(10,20)
def show(self):
print(self._name,'小怪兽',' 生命值:',self._hp)
def is_any_alive(monsters):
for monster in monsters:
if monster.alive:
return True
return False
def select_monster(monsters):
while True:
for monster in monsters:
if monster.alive:
return monster
def display_info(ultaman,monsters):
print(ultaman.show())
for monster in monsters:
print(monster.show())
def main():
u = ultaman('骆昊', 1000, 120)
m1 = Monster('狄仁杰', 250)
m2 = Monster('白元芳', 500)
m3 = Monster('王大锤', 750)
ms = [m1, m2, m3]
fight_round = 1
while u.alive and is_any_alive(ms):
print('第',fight_round,'回合')
m = select_monster(ms)
skill = randint(1, 10) # 通过随机数选择使用哪种技能
if skill < 6:
print('%s使用普通攻击打了%s.' % (u.name, m.name))
u.attack(m)
u.resume()
print('%s的魔法值恢复了' % (u.name))
elif skill <= 9:
if u.magic_attack(ms):
print('%s使用了魔法攻击.' % u.name)
else:
print('%s使用魔法失败.' % u.name)
else: # 10%的概率使用究极必杀技(如果魔法值不足则使用普通攻击)
if u.huge_attack(m):
print('%s使用究极必杀技虐了%s.' % (u.name, m.name))
else:
print('使用大招失败.' )
u.resume()
print('%s的魔法值恢复.' % (u.name))
if m.alive > 0:
m.attack(u)
print('%s回击了%s.' % (m.name, u.name))
display_info(u, ms) # 每个回合结束后显示奥特曼和小怪兽的信息
fight_round += 1
print('回合结束')
if u.alive > 0:
print('%s奥特曼胜利!' % u.name)
else:
print('小怪兽胜利!')
if __name__ == '__main__':
main()