Spaces:
Runtime error
Runtime error
import random | |
import math | |
from utils import get_random_name, get_random_clan_name | |
from config import P_DIE_WHEN_LOSE, IMMORTAL_RANK | |
cultivation_rank_map = ["炼气期", "筑基期", "结丹期", "元婴期", "化神期", "成仙者"] | |
class Character: | |
def __init__(self, name, gender, special_constitution, spiritual_roots, clan=None, partner=None, parents=None): | |
self.name = name | |
self.gender = gender | |
self.real_age = 0 | |
self.apparent_age = 0 | |
self.cultivation_level = 0 # 等级 | |
self.cultivation_rank = 0 # 层次 | |
self.special_constitution = special_constitution | |
self.spiritual_roots = spiritual_roots | |
self.experience_points = 0 | |
self.combat_power = self.calculate_combat_power() | |
self.partner = partner | |
self.is_alive = True | |
self.is_immortal = False | |
self.buff = False | |
self.history = [] | |
self.special_history = [] | |
self.consume_spiritual_energy = 0 | |
self.parents = parents | |
self.children = [] | |
self.clan = clan # 宗族 | |
def die(self): | |
if self.is_alive and not self.is_immortal: | |
self.history.append(f"{self.real_age}岁,死亡") | |
self.special_history.append(f"{self.real_age}岁,死亡") | |
self.is_alive = False | |
def cultivate(self, experience_points): | |
if not self.is_alive: | |
print("角色已经死亡,无法进行修炼。") | |
return | |
# 成仙者不再修炼 | |
if self.is_immortal: | |
return | |
self.experience_points += experience_points | |
# 根据经验值计算等级,等级越高,升级需要的经验值就越多 | |
self.cultivation_level = math.floor(self.experience_points / ((1 + self.cultivation_rank) * 1000 + (1 + self.cultivation_level) * 100)) | |
# 判断是否达到突破修为层次的条件 | |
if self.cultivation_level >= 10: | |
# 使用一个随机数来表示突破的概率,当前rank越高,则突破成功的概率越低 | |
success_probability = 0.9 / (self.cultivation_rank * 2 + 1) | |
if random.random() < success_probability: | |
cultivation_level = self.cultivation_level | |
self.cultivation_rank += 1 | |
self.cultivation_level = 0 | |
self.experience_points = 0 | |
self.history.append(f"{self.real_age}岁,突破成功,在{cultivation_level}级, 到达{self.view_rank()}") | |
self.special_history.append(f"{self.real_age}岁,突破成功,在{cultivation_level}级, 到达{self.view_rank()}") | |
# 判断是否达到成仙的条件 | |
if self.cultivation_rank >= IMMORTAL_RANK: | |
self.is_immortal = True | |
self.history.append(f"{self.real_age}岁,成仙了") | |
self.special_history.append(f"{self.real_age}岁,成仙了") | |
else: | |
self.history.append(f"{self.real_age}岁,突破失败,在{self.cultivation_level}级") | |
def marry(self, partner): | |
# 成仙者不再结婚 | |
if self.is_immortal: | |
return | |
if not self.is_alive: | |
print("角色已经死亡,无法结婚。") | |
return | |
self.partner = partner | |
partner.partner = self | |
# 结婚合并宗族 | |
if self.clan and partner.clan: | |
if random.random() < 0.5: | |
partner.clan = self.clan | |
else: | |
self.clan = partner.clan | |
else: | |
self.clan = self.clan or partner.clan or get_random_clan_name() | |
partner.clan = self.clan | |
self.history.append(f"{self.real_age}岁,结婚了") | |
self.partner.history.append(f"{self.partner.real_age}岁,结婚了") | |
self.special_history.append(f"{self.real_age}岁,结婚了") | |
self.partner.special_history.append(f"{self.partner.real_age}岁,结婚了") | |
def give_birth(self): | |
# 成仙者不会生育 | |
if self.is_immortal: | |
return | |
if not self.is_alive: | |
print("角色已经死亡,无法生育。") | |
return | |
if not self.partner: | |
print("角色没有结婚,无法生育。") | |
return | |
# 合欢体质加buff | |
if self.special_constitution[1] == 1: | |
self.buff = True | |
# 小孩有一定几率遗传父亲或母亲的特殊体质和灵根 | |
special_constitution = [a if random.random() < 0.5 else b for (a, b) in zip(self.special_constitution, self.partner.special_constitution)] | |
spiritual_roots = [a if random.random() < 0.5 else b for (a, b) in zip(self.spiritual_roots, self.partner.spiritual_roots)] | |
# spiritual_roots 一定几率突变 | |
spiritual_roots = [random.choice([0, 1]) if random.random() < 0.01 else v for v in spiritual_roots] | |
child = Character(get_random_name(), random.choice(["男", "女"]), special_constitution, spiritual_roots, clan=self.clan, parents=[self, self.partner]) | |
self.history.append(f"{self.real_age}岁,生下小孩{child.name}") | |
self.partner.history.append(f"{self.partner.real_age}岁,生下小孩{child.name}") | |
self.children.append(child) | |
self.partner.children.append(child) | |
return child | |
def grow(self): | |
# 成仙者不会衰老 | |
if self.is_immortal: | |
return | |
self.real_age += 1 | |
# 根据修为层次 和 是否拥有木灵根 计算表观年龄 | |
# 修为层次越高,外表看起来越年轻 | |
ratio = 1 + self.cultivation_rank | |
# 灵龟和蜉蝣体质 | |
if self.special_constitution[2] == 1: # 灵龟体质 | |
ratio *= 2 | |
elif self.special_constitution[3] == 1: # 蜉蝣体质 | |
ratio *= 0.5 | |
# 根据修为层次计算加成比例,初始加成为10% | |
bonus = 0.1 * (self.cultivation_rank * 0 + 1) | |
if self.spiritual_roots[1] == 1: # 拥有木灵根(灵根的第二位),最大寿命有加成 | |
ratio *= 1 + bonus | |
self.apparent_age = math.floor(self.real_age / ratio) | |
def calculate_combat_power(self): | |
# 根据修为层次和修为等级计算战斗力参数:等级越高,各数值都越高;层次对等级是碾压效果 | |
attack_power = (self.cultivation_rank + 1) * 30 + 1 * (1 + self.cultivation_level) | |
defense_power = (self.cultivation_rank + 1) * 30 + 1 * (1 + self.cultivation_level) | |
attack_speed = (self.cultivation_rank + 1) * 30 + 1 * (1 + self.cultivation_level) | |
health_points = (self.cultivation_rank + 1) * 90 + 3 * (1 + self.cultivation_level) | |
# 根据修为层次计算加成比例,初始加成为10% | |
bonus = 0.1 * (self.cultivation_rank * 0 + 1) | |
# 根据灵根调整战斗力参数,灵根分别为:[金木水火土], 分别对以下属性有加成:攻击速度, 最大寿命, 生命值, 攻击力, 防御力 | |
if self.spiritual_roots[0] == 1: # 金 | |
attack_speed *= 1 + bonus | |
if self.spiritual_roots[2] == 1: # 水 | |
health_points *= 1 + bonus | |
if self.spiritual_roots[3] == 1: # 火 | |
attack_power *= 1 + bonus | |
if self.spiritual_roots[4] == 1: # 土 | |
defense_power *= 1 + bonus | |
return { | |
'attack_power': math.ceil(attack_power), | |
'defense_power': math.ceil(defense_power), | |
'attack_speed': math.ceil(attack_speed), | |
'health_points': math.ceil(health_points), | |
} | |
def before_battle(self): | |
self.combat_power = self.calculate_combat_power() | |
def attack(self, opponent, params={"P_CRIT": 0.2, "P_DODGE": 0.05, "P_BLOCK": 0.1, "P_COUNTER": 0.05}): | |
# 成仙者不会打架 | |
if self.is_immortal: | |
return | |
if not self.is_alive: | |
print("角色已经死亡,无法攻击。") | |
return | |
# 战斗体质加buff | |
if self.special_constitution[0] == 1: | |
self.buff = True | |
# 根据攻击速度计算攻击次数 | |
attack_times = math.ceil(self.combat_power['attack_speed'] / 10) | |
# 根据攻击力计算伤害 | |
damage = self.combat_power['attack_power'] * attack_times | |
# 根据防御力计算伤害减免 | |
damage -= opponent.combat_power['defense_power'] | |
# 伤害最小为1 | |
damage = max(1, damage) | |
# 根据概率计算暴击 | |
if random.random() < params['P_CRIT']: | |
damage *= 2 | |
print("暴击!") | |
# 根据概率计算闪避 | |
if random.random() < params['P_DODGE']: | |
print("闪避!") | |
return | |
# 根据概率计算格挡 | |
if random.random() < params['P_BLOCK']: | |
print("格挡!") | |
damage = max(1, damage // 2) | |
# 根据概率计算反击 | |
if random.random() < params['P_COUNTER']: | |
print("反击!") | |
damage = max(1, damage // 2) | |
opponent.combat_power['health_points'] -= damage | |
return | |
if damage > 0: | |
opponent.combat_power['health_points'] -= damage | |
def check_is_alive(self): | |
if self.combat_power['health_points'] <= 0: | |
# 一定概率会死亡 | |
if random.random() < P_DIE_WHEN_LOSE: | |
self.die() | |
return False | |
return True | |
def __str__(self): | |
# Display current attributes | |
history = "\n".join(self.history) | |
attributes = [ | |
f"名字: {self.name}", | |
f"性别: {self.gender}", | |
f"年龄: {self.real_age}", | |
f"表观年龄: {self.apparent_age}", | |
f"修仙阶段: ({self.cultivation_rank}){self.view_rank()}", | |
f"特殊体质: {[special_constitution for (special_constitution, is_active) in zip(['战斗体质', '合欢体质', '灵龟体质', '蜉蝣体质'], self.special_constitution) if is_active]}", | |
f"灵根: {[spiritual_root for (spiritual_root, is_active) in zip(['金', '木', '水', '火', '土'], self.spiritual_roots) if is_active]}", | |
f"伴侣: {self.partner.name if self.partner is not None else '无'}", | |
f"存活: {self.is_alive}", | |
f"宗族: {self.clan if self.clan is not None else '无'}", | |
f"父母: {[parent.name for parent in self.parents] if self.parents is not None else '无'}", | |
f"孩子: {[child.name for child in self.children]}", | |
f"Combat Power: {self.combat_power}", | |
f"Experience Points: {self.experience_points}", | |
f"Buff: {self.buff}", | |
f"历程: {history}", | |
] | |
return "\n".join(attributes) | |
def view_rank(self): | |
if self.cultivation_rank <= len(cultivation_rank_map): | |
return f"{cultivation_rank_map[self.cultivation_rank]}({self.cultivation_level})" | |
else: | |
return "天外飞仙" | |
def to_list(self): | |
numerical_attributes = [ | |
self.real_age, | |
self.apparent_age, | |
self.cultivation_level, | |
self.cultivation_rank, | |
self.experience_points, | |
self.combat_power["attack_power"], | |
self.combat_power["defense_power"], | |
self.combat_power["attack_speed"], | |
self.combat_power["health_points"], | |
*self.special_constitution, # [1, 0, 0, 0], 数组解构拼接 | |
*self.spiritual_roots, # [1, 0, 0, 0, 0], 数组解构拼接 | |
1 if self.is_alive else 0, # bool转int | |
1 if self.buff else 0, # bool转int | |
len(self.children), | |
] | |
return numerical_attributes |