Project

General

Profile

Files » 实战_英雄游戏.py

UserName LastName, 01/16/2025 04:31 PM

 
import random


class Hero:
red_team = []
blue_team = []

def __init__(self, name, hp, power, speed, team, auto=True):
self.name = name
self.hp = hp
self.power = power
self.speed = speed # 速度可取范围[1,5],可以为小数
self.team = team
self.auto = auto
if self.team == 'red':
Hero.red_team.append(self)
else:
Hero.blue_team.append(self)

def __str__(self):
return f'{self.name}(hp:{self.hp:.1f}/power:{self.power:.1f}/speed:{self.speed:.1f})'

def say_words(self):
pass

def move(self):
if self.hp > 0:
if self.auto:
self.auto_attack()
else:
self.manual_attack()
# print('-----')
# else:
# print(f'{self.name}已死亡')

def attack(self, target):
"""
普通攻击,造成自身能力值的伤害
:param target:
:return:
"""
print(f'{self.name}{target.name}({target.hp})发起了攻击')
target.injured(self.power)

def injured(self, damage):
self.hp -= damage
if self.hp > 0:
print(f'{self.name}受到了{damage}点伤害,hp:{self.hp:.1f}')
else:
if self in self.get_team():
print(f'{self.name}({self.hp:.1f})似啦!!!丸辣!')
self.get_team().remove(self)

def heal(self, recovery):
self.hp += recovery
print(f"{self.name}回复了{recovery}点血量,hp:{self.hp:.1f}")

def speed_up(self, extra=1):
self.speed = min(5, self.speed + extra)
print(f'{self.name}的速度提高了,speed:{self.speed}')

def get_enemy(self):
if self.team == 'red':
return Hero.blue_team
else:
return Hero.red_team

def get_team(self):
if self.team == 'red':
return Hero.red_team
else:
return Hero.blue_team

def auto_attack(self):
if isinstance(self, Assist):
if self.get_team():
target = random.choice(self.get_team())
self.attack(target)
else:
if self.get_enemy():
target = random.choice(self.get_enemy())
self.attack(target)

def manual_attack(self):
pass


class Mage(Hero):
"""
法师
fire_ball:消耗蓝量,对目标造成1.5倍能力值的伤害。蓝量不足时,只能使用普通攻击
亡语:死亡后对所有剩余敌人造成伤害,敌人均摊总和为(2*能力值+2*mp)的伤害
"""

def __init__(self, name, hp=90, power=20, speed=2, team='red', mp=100):
super().__init__(name, hp, power, speed, team)
self.mp = mp

def say_words(self):
print(f'{self.name}:元素的低语,是命运的指引;在火焰与寒冰的交织中,我掌控一切!')

def attack(self, target):
if self.mp >= 30:
self.mp -= 30
self.fire_ball(target)
else:
print(f'{self.name}魔法不足,只能使用普通攻击')
Hero.attack(self, target)

def injured(self, damage):
self.hp -= damage
if self.hp > 0:
self.hp -= damage
print(f'{self.name}受到了{damage}点伤害,hp:{self.hp:.1f}')
else:
if self in self.get_team():
print(f'{self.name}({self.hp:.1f})受到了{damage}点伤害,濒临死亡')
self.death_rattle(self.get_enemy())
self.get_team().remove(self)

def fire_ball(self, target):
"""
火球术,消耗30点蓝量,造成1.5倍攻击力伤害
:param target:
:return:
"""
print('“微火起点,足以化作烈焰。”')
print(f'{self.name}{target.name}({target.hp:.1f})释放了火球,mp:{self.mp}')
target.injured(self.power * 1.5)

def death_rattle(self, enemy):
"""
所有敌人均摊受到自身攻击力3倍的伤害
:param enemy: 敌人列表
"""
print('呵...知识的火焰...终将燃尽...但真理...永不熄灭...烈焰焚天!')
aoe_damage = (self.power * 2 + self.mp * 2) / len(enemy)
for i in enemy:
i.injured(aoe_damage)


class Shield(Hero):
"""
盾兵,额外拥有护盾值,受到攻击时优先消耗护盾值
shield_slam:使用护盾猛击对手,造成0.75倍攻击力的伤害,并获得当前血量20%的护盾(无上限)
"""

def __init__(self, name, hp=80, power=20, speed=1, team='red', armor=70):
super().__init__(name, hp, power, speed, team)
self.armor = armor

def say_words(self):
print(f'{self.name}:钢铁为盾,怒火为刃!今日的战场,只能留下胜者的咆哮!')

def attack(self, target):
self.shield_slam(target)

def injured(self, damage):
if damage <= self.armor:
self.armor -= damage
print(f'{self.name}消耗了{damage}点护盾,armor:{self.armor}')
elif self.armor < damage < self.hp + self.armor:
damage = damage - self.armor
self.armor = 0
self.hp -= damage
print(f'{self.name}受到了{damage}点伤害,护盾被消耗了,hp:{self.hp:.1f}')
else:
self.hp -= damage
self.armor = 0
print(f'{self.name}({self.hp:.1f})似啦!!!丸辣!')
self.get_team().remove(self)

def shield_slam(self, target):
"""
护盾猛击,造成0.75倍攻击力的伤害,并恢复当前血量20%的护盾(无上限)
:param target:攻击目标
"""
print(f'{self.name}{target.name}({target.hp})释放了护盾猛击,护盾值回复了,hp:{self.hp:.1f}/armor:{self.armor}')
target.injured(self.power * 0.75)
self.armor += self.hp / 20


class Assist(Hero):
"""
辅助
support:只能以友军为目标。消耗蓝量,产生随机效果:回复友军生命值或提高友军速度
"""

def __init__(self, name, hp=80, power=20, speed=2, team='red', mp=100):
super().__init__(name, hp, power, speed, team)
self.mp = mp

def say_words(self):
print(f'{self.name}:光明庇佑同伴,生命源泉涌动;在我的守护下,你们无需畏惧黑暗')

def attack(self, target):
if self.mp >= 40:
print('战意如风,守护如山;去吧,我的力量与你同在')
if random.randint(0, 1):
self.mp -= 40
print(f'{self.name}治愈了{target.name}({target.hp}),mp:{self.mp}')
target.heal(self.power / 2)

else:
self.mp -= 40
print(f'{self.name}加速了{target.name}({target.hp}),mp:{self.mp}')
target.speed_up(extra=0.7)

else:
self.mp += 60
print('魔法不足,本回合回复法力值')


class Ninja(Hero):
"""
忍者
被动技能:有概率闪避攻击,速度越快,闪避几率越高
每次闪避成功提升自身能力值,每次攻击提高自身速度

"""

def __init__(self, name, hp=100, power=20, speed=2, team='red'):
super().__init__(name, hp, power, speed, team)

def say_words(self):
print(f'{self.name}:影随身隐,刀至命绝;你只会察觉到最后一丝风声')

def injured(self, damage):
if random.randint(0, 6 - int(self.speed)):
self.hp -= damage
if self.hp > 0:
self.hp -= damage
self.speed = max(5, self.speed + 1)
print(f'{self.name}受到了{damage}点伤害,速度提升了,hp:{self.hp:.1f}')
else:
print(f'{self.name}({self.hp:.1f})似啦!!!丸辣!')
self.get_team().remove(self)
else:
print(f'{self.name}闪避了攻击,自身能力值提高了')
self.power *= 1.2


class Swardsman(Hero):
"""
剑客
draw:每次攻击造成1.1倍能力值的伤害并叠加剑意,每层剑意为自身提供1单位速度,两层剑意时,下次攻击清空剑意并释放二连击,造成两次1.2倍能力值的伤害,
"""

def __init__(self, name, hp=100, power=20, speed=2, team='red'):
super().__init__(name, hp, power, speed, team)
self.sword_intent = 0

def say_words(self):
print(f'{self.name}:剑随心走,影随风动。你,还不配让我用出全力')

def attack(self, target):
self.draw(target)

def draw(self, target):
"""
主要技能
:param target: 攻击目标
"""
if self.sword_intent < 2:
print(f'{self.name}:剑鸣破空,一瞬即永恒!剑指{target.name}({target.hp})!')
self.sword_intent += 1
target.injured(self.power * 1.1)
else:
print(f'{self.name}:剑心无尘,万物皆为刃;这一击,你看得清吗?剑指{target.name}({target.hp})!')
target.injured(self.power * 1.2 * 2)
# target.injured(self.power * 1.2)
self.sword_intent = 0
self.speed += self.sword_intent + 1


class Arena:
def __init__(self, team_size):
print("""'1': Mage,\n'2': Shield,\n'3': Assist,\n'4': Ninja,\n'5': Swardsman""")
for i in range(2):
if i == 0:
team = 'red'
print('-' * 10 + '红队选择英雄' + '-' * 10)
else:
team = 'blue'
print('-' * 10 + '蓝队选择英雄' + '-' * 10)
for j in range(team_size):
choice = input('请选择英雄:')
self.hero_selector(choice, name=team + choice, team=team)

print('红队阵容', end=':')
for i in Hero.red_team:
print(i, end=' ')
print()
print('蓝队阵容', end=':')
for i in Hero.blue_team:
print(i, end=' ')
print()

self.hero_list = Hero.red_team.copy()
self.hero_list.extend(Hero.blue_team)
# print('英雄选择完毕', self.hero_list)

@staticmethod
def hero_selector(choice, name, team):
heroes = {
'1': Mage,
'2': Shield,
'3': Assist,
'4': Ninja,
'5': Swardsman
}
if choice in heroes:
hero = heroes[choice](name=name, team=team)
# print(hero.red_team)
# print(hero.blue_team)
return hero
else:
print(choice, '??')

def war(self):
round_num = 1
# print(self.hero_list)
# 轮流说台词
for hero in self.hero_list:
hero.say_words()
# 轮流行动
while True:
# 每次行动前按速度排序
speed_order = sorted(self.hero_list, key=lambda x: x.speed, reverse=True)
# 速度高的先行动
for hero in speed_order:
hero.move() # 英雄行动
print('-' * 10, round_num, '-' * 10)

if round_num % 3 == 0: # 每3个回合打印一次阵容
print('红队阵容', end=':')
for i in Hero.red_team:
print(i, end=' ')
print()
print('蓝队阵容', end=':')
for i in Hero.blue_team:
print(i, end=' ')
print()

# 判断赢家
if not Hero.red_team and not Hero.blue_team:
print('无人幸免,战斗结束')
return round_num
elif not Hero.red_team or not Hero.blue_team:
if Hero.red_team:
print('红队获胜')
return round_num
else:
print('蓝队获胜')
return round_num

round_num += 1
# 回合数超过50时,强制结束
if round_num >= 50:
return 50


if __name__ == '__main__':
arena = Arena(2)
arena.war()
(87-87/437)