类
关于类学习到了以下知识:
- 1.@property装饰器
方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用
- 2.类的继承
继承父类的基本属性值,父类的参数调用
- 3.__slots__
限制类的属性
- 4.__str__()方法
返回对象的描述信息,需要返回一个字符串,当做这个对象的描写
- 5.随机数
从列表取随机元素,从给定范围取随机元素
- 6.条件语句的基本用法
条件、循环、Ture/False判断等
- 7.@abstractmethod
抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写
实例小游戏
from abc import ABCMeta, abstractmethod
from random import randint, randrange
# 抽象类,只能被继承,不能被实例化abc模块
class Fighter(object, metaclass=ABCMeta):
"""战斗者"""
# 限制该类能添加的属性,只能是name和hp
__slots__ = ('_name', '_hp')
def __init__(self, name, hp):
# 初始化名名字和生命值
self._name = name
self._hp = hp
# 修饰name方法,使该方法了name属性的getter方法
@property
def name(self):
return self._name
# 同上
@property
def hp(self):
return self._hp
# 修该hp属性
@hp.setter
def hp(self, hp):
if hp >= 0:
self._hp = hp
else:
self._hp = 0
# 活着的
@property
def alive(self):
return self._hp > 0
# 用于程序接口的控制,正如上面的特性,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法
@abstractmethod
def attack(self, other):
# other 被攻击的对象
pass
class Ultraman(Fighter):
# 奥特曼的属性
__slots__ = ('_name', '_hp', '_mp')
def __init__(self, name, hp, mp):
# super()函数是用于调用父类(超类)的一个方法
super().__init__(name, hp)
self._mp = mp
# 此处继承了Fighter抽像类,必须实现attack的方法,即被攻击的对象掉血多少
def attack(self, other):
# 既然继承了父类,那么other参数就可以调用父类的参数,即此处hp为Fighter类定义的hp
other.hp -= randint(15, 25)
def huge_attack(self, other):
# 必杀技,other是被攻击对象,成功返回True
if self._mp >= 50:
self._mp -= 50
injury = other.hp * 3 // 4
# 至少需要掉血50
if injury >= 50:
injury_current = injury
else:
injury_current = 50
other.hp -= injury_current
return True
else:
self.attack(other)
return False
def magic_attack(self, others):
#群体魔法攻击,成功返回True
if self._mp >= 20:
self._mp -= 20
for temp in others:
if temp.alive:
temp.hp -= randint(10, 15)
return True
else:
return False
def resume(self):
# 恢复魔法
incr_point = randint(1, 10)
self._mp += incr_point
return incr_point
def __str__(self):
# 返回对象的描述信息
return '---%s奥特曼---\n生命值:%d\n魔法值:%d\n' % (self._name, self._hp, self._mp)
class Monster(Fighter):
# 小怪兽
__slots__ = ('_name', '_hp')
# 同上,继承了Fighter父类,需要再此类中实现该方法
def attack(self, other):
other.hp -= randint(10, 20)
def __str__(self):
return '---%s小怪兽---\n生命值:%d\n' % (self._name, self._hp)
# 判断是否还有小怪兽存活,monsters是怪兽组,即所有怪兽的列表
def is_any_alive(monsters):
for monster in monsters:
if monster.alive > 0:
return True
return False
# 选中一只活着的怪兽
def select_alive_one(monsters):
monsters_len = len(monsters)
while True:
# 从给定的范围返回随机项
index = randrange(monsters_len)
# 取出返回的怪兽序列
monster = monsters[index]
# 判断其是否活着
if monster.alive > 0:
return monster
# 输出奥特曼和怪兽的信息
def display_info(ultraman, monsters):
print(ultraman)
for monster in monsters:
print(monster, end='')
def main():
my = Ultraman('秦剑', 100, 50)
g1 = Monster('怪兽1', 100)
g2 = Monster('怪兽2', 100)
g3 = Monster('怪兽3', 100)
g4 = Monster('怪兽4', 100)
# 实例化的4个怪兽的列表
mosters = [g1, g2, g3, g4]
# 初始化回合数为1
fight_round = 1
while my.alive and is_any_alive(mosters):
print('========第%02d回合========' % fight_round)
tmp_g = select_alive_one(mosters)
# 取1-10之间的随机数
skill = randint(1, 10)
if skill <= 3:
print('%s对%s使用了普通攻击' % (my.name, tmp_g.name))
# 奥特曼攻击怪兽,怪兽随机掉血
my.attack(tmp_g)
# 奥特曼恢复魔法值
print('%s的魔法值恢复了%d点' % (my.name, my.resume()))
elif skill >= 8:
# 使用全体魔法攻击,对所有小怪兽进行扣血
if my.magic_attack(mosters):
print('%s对全体小怪兽使用了魔法攻击' % my.name)
else:
print('%s的魔法值不足,释放技能失败' % my.name)
else:
# 对单个怪兽使用大招
if my.huge_attack(tmp_g):
print('%s对%s使用了大招技能' % (my.name, tmp_g.name))
else:
print('%s对%s使用了普通攻击' % (my.name, tmp_g.name))
my.attack(tmp_g)
print('%s的魔法值恢复了%d点' % (my.name, my.resume()))
if tmp_g.alive > 0:
print('%s回击了%s' % (tmp_g.name, my.name))
tmp_g.attack(my)
display_info(my, mosters)
fight_round += 1
print('\n========战斗结束!========\n')
if my.alive > 0:
print('%s奥特曼胜利!'% my.name)
else:
print('%s怪兽胜利!' % tmp_g.name)
if __name__ == '__main__':
main()