import random import math class Character: def __init__(self, name, lv=0, HP=100, MP=0, STR=0, WIS=0, VIT=0, SPD=0, LUK=0, ATK=0, DEF=0, exp=0, EXP=0, ptr=0, bonus=0.0): # 角色信息 self.name = name # 名字 self.lv = lv # 等级 self.exp = exp # 当前经验值 self.EXP = EXP # 升级所需经验值 # 基础属性 self.STR = STR # 力量 self.WIS = WIS # 智力 self.VIT = VIT # 体力 self.SPD = SPD # 敏捷 self.LUK = LUK # 幸运 # 面板属性 self.HP = HP + self.VIT * 2 + self.STR # 总生命 = 基础值+2体力+1力量 self.hp = self.HP # 当前生命 self.MP = MP + self.WIS * 2 # MP = 基础值+2智力 self.mp = self.MP # 当前MP self.ATK = int(ATK + self.STR * 1.5 + self.SPD) # 攻击力 = 基础值+1.5力量+1敏捷 self.DEF = int(DEF + self.VIT) # 防御力 = 基础值+1体力 self.HIT = int(self.SPD * 0.7) # 命中值 = 0.7敏捷 self.DODGE = int(self.SPD * 0.3) # 闪避值 = 0.3敏捷 # 高级属性 self.ptr = ptr # 穿透 self.crit = round(math.tan(self.check_luck(self.LUK) / 148.2), 2) # 暴击率 self.thump = round(math.tan(self.check_luck(self.LUK) / 148.2) / 3, 2) # 重击率 self.bonus = bonus # 暴伤加成 def __repr__(self): # 显示角色信息 return f"{self.name}\n" \ f"等级:{self.lv}\t经验:{self.exp}/{self.EXP}\n" \ f"HP:{self.hp}/{self.HP}\tMP:{self.mp}/{self.MP}\n" \ f"力量:{self.STR}\t智力:{self.WIS}\t体力:{self.VIT}\t敏捷:{self.SPD}\n" \ f"攻击:{self.ATK}\t防御:{self.DEF}\n" \ f"幸运:{self.LUK}\t穿透:{self.ptr}\t命中:{self.HIT}\t闪避:{self.DODGE}\n" \ f"暴击率:{self.crit}\t重击率:{self.thump}\t爆伤加成:{self.bonus}\n" def level_up(self): # 角色升级 分配属性点 if self.exp >= self.EXP: print(self.name, "升级了!!") self.lv += 1 self.exp = self.exp - self.EXP self.EXP = int((self.EXP + self.lv) / (self.lv / (self.lv + 1))) self.HP += 10 self.MP += 5 number = 7 # 总点数 while True: # number_get = input("请输入分配的点数(力量,智力,体力,敏捷,幸运):") number_get = "30211" if len(number_get) != 5: print("输入有误,请重新分配!") continue # 升级后基础属性值自动加1 n0 = int(number_get[0]) + 1 n1 = int(number_get[1]) + 1 n2 = int(number_get[2]) + 1 n3 = int(number_get[3]) + 1 n4 = int(number_get[4]) + 1 if n0 + n1 + n2 + n3 + n4 != number + 5: print("输入有误,请重新分配!") else: # 属性增加 self.STR += n0 self.WIS += n1 self.VIT += n2 self.SPD += n3 self.LUK += n4 # 关联属性值变更 self.HP = (self.HP + n2 * 2 + n0) # 总生命 = 基础值+2体力+1力量 self.MP = self.MP + n1 * 2 # MP = 基础值+2智力 self.ATK = int(self.ATK + n0 * 1.5 + n3) # 攻击力 = 基础值+1.5力量+1敏捷 self.DEF = int(self.DEF + n2) # 防御力 = 基础值+1体力 self.HIT = int(self.HIT + n3 * 0.7) # 命中值 = 0.7敏捷 self.DODGE = int(self.DODGE + n3 * 0.3) # 闪避值 = 0.3敏捷 self.crit = round(math.tan(self.check_luck(self.LUK) / 148.2), 2) # 暴击率 self.thump = round(math.tan(self.check_luck(self.LUK) / 148.2) / 3, 2) # 重击率 # 升级后血量蓝量回满 self.hp = self.HP self.mp = self.MP print(self.__repr__()) # 打印升级后信息 return True return False def update(self): # 怪物强化 self.lv += 1 self.HP += self.lv * 2 self.hp = self.HP self.exp += self.lv # 属性增加 n0 = 1 n1 = 1 n2 = 1 n3 = 1 n4 = 1 self.STR += n0 self.WIS += n1 self.VIT += n2 self.SPD += n3 self.LUK += n4 # 关联属性值变更 self.HP = (self.HP + n2 * 2 + n0) # 总生命 = 基础值+2体力+1力量 self.MP = self.MP + n1 * 2 # MP = 基础值+2智力 self.ATK = int(self.ATK + n0 * 1.5 + n3) # 攻击力 = 基础值+1.5力量+1敏捷 self.DEF = int(self.DEF + n2) # 防御力 = 基础值+1体力 self.HIT = int(self.HIT + n3 * 0.7) # 命中值 = 0.7敏捷 self.DODGE = int(self.DODGE + n3 * 0.3) # 闪避值 = 0.3敏捷 self.crit = round(math.tan(self.check_luck(self.LUK) / 148.2), 2) # 暴击率 self.thump = round(math.tan(self.check_luck(self.LUK) / 148.2) / 3, 2) # 重击率 # 升级后血量蓝量回满 self.hp = self.HP self.mp = self.MP @staticmethod def check_luck(luck): """ 校准幸运值 """ if luck > 100: # 幸运(0~100) luck = 100 return luck # ###################战斗######################### class Battle: def __init__(self, P, E): # 初始化战斗数据 P:Player E:Enemy self.P = P # 把玩家传入战斗中 self.E = E # 把敌人传入战斗中 self.d1 = 200 # 玩家伤害权重 self.d2 = 400 # 敌人伤害权重 # 数值越大减伤越低 self.start_rate = random.randint(1, 100) / 100 # 先后手概率参数 self.p_rate = self.P.SPD / (self.P.SPD + self.E.SPD) # 玩家先手概率 @staticmethod def ef_str(con1, con2): # 战斗效果文本 if con1 and con2: return "重暴击" elif con1: return "重击" elif con2: return "暴击" else: return "" def battle(self): # 战斗 if self.p_rate > self.start_rate: # 玩家先手 print(f"你遭遇了{self.E.name}") while True: hit_rate = random.randint(1, 100) / 100 # 命中率 crit_rate = random.randint(1, 100) / 100 # 暴击率 ptr_rate = random.randint(1, 100) / 100 # 重击率 ef1 = self.ef_str(self.P.thump > ptr_rate, self.P.crit > crit_rate) # 玩家伤害效果 ef2 = self.ef_str(self.E.thump > ptr_rate, self.E.crit > crit_rate) # 敌人伤害效果 ATK1 = self.P.ATK * 2 if self.P.crit > crit_rate else self.P.ATK # 玩家暴击攻击 ATK2 = self.E.ATK * 2 if self.E.crit > crit_rate else self.E.ATK # 敌人暴击攻击 DEF1 = 0 if self.E.thump > ptr_rate else self.P.DEF # 玩家受到重击后防御为0 DEF2 = 0 if self.P.thump > ptr_rate else self.E.DEF # 敌人受到重击后防御为0 r1 = DEF1 / (DEF1 + self.d1) # 玩家减伤率 r2 = DEF2 / (DEF2 + self.d2) # 敌人减伤率 HIT1 = ((self.P.lv - self.E.lv) / (self.P.lv + self.E.lv) + 1) * (self.P.HIT + 100) / ( self.E.DODGE + 100) # 玩家命中率 HIT2 = ((self.E.lv - self.P.lv) / (self.P.lv + self.E.lv) + 1) * (self.E.HIT + 100) / ( self.P.DODGE + 100) # 敌人命中率 # 玩家伤害 P_damage = int(ATK1 * (1 - r2)) Total_P_damage = P_damage # 最终伤害 if HIT1 > hit_rate: # 玩家命中 self.E.hp = self.E.hp - Total_P_damage print(f"{self.P.name}对{self.E.name}造成了{Total_P_damage}点{ef1}伤害") if self.E.hp < 0: print(self.E.name, "死亡") self.P.exp += self.E.exp print(f"{self.P.name}获得{self.E.exp}经验") if self.P.level_up(): # 是否升级 self.E.update() break else: print(f"{self.P.name}未命中{self.E.name}") # 敌人伤害 if HIT2 > hit_rate: E_damage = int(ATK2 * (1 - r1)) self.P.hp = self.P.hp - E_damage print(f"{self.E.name}对{self.P.name}造成了{E_damage}点{ef2}伤害") if self.P.hp <= 0: print(f"{self.P.name}已阵亡") self.P.exp = 0 self.P.hp = self.P.HP print(self.P) break else: print(f"{self.E.name}未命中{self.P.name}") else: # 后手 print(f"你遭遇{self.E.name}偷袭!!!!!!") while True: hit_rate = random.randint(1, 100) / 100 # 命中率 crit_rate = random.randint(1, 100) / 100 # 暴击率 ptr_rate = random.randint(1, 100) / 100 # 重击率 ef1 = self.ef_str(self.P.thump > ptr_rate, self.P.crit > crit_rate) # 玩家伤害效果 ef2 = self.ef_str(self.E.thump > ptr_rate, self.E.crit > crit_rate) # 敌人伤害效果 ATK1 = self.P.ATK * 2 if self.P.crit > crit_rate else self.P.ATK # 玩家暴击攻击 ATK2 = self.E.ATK * 2 if self.E.crit > crit_rate else self.E.ATK # 敌人暴击攻击 DEF1 = 0 if self.E.thump > ptr_rate else self.P.DEF # 玩家受到重击后防御为0 DEF2 = 0 if self.P.thump > ptr_rate else self.E.DEF # 敌人受到重击后防御为0 r1 = DEF1 / (DEF1 + self.d1) # 玩家减伤率 r2 = DEF2 / (DEF2 + self.d2) # 敌人减伤率 HIT1 = ((self.P.lv - self.E.lv) / (self.P.lv + self.E.lv) + 1) * (self.P.HIT + 100) / ( self.E.DODGE + 100) # 玩家命中率 HIT2 = ((self.E.lv - self.P.lv) / (self.P.lv + self.E.lv) + 1) * (self.E.HIT + 100) / ( self.P.DODGE + 100) # 敌人命中率 # 敌人伤害 E_damage = int(ATK2 * (1 - r1)) if HIT2 > hit_rate: self.P.hp = self.P.hp - E_damage print(f"{self.E.name}对{self.P.name}造成了{E_damage}点{ef2}伤害") if self.P.hp <= 0: print(f"{self.P.name}已阵亡") self.P.exp = 0 self.P.hp = self.P.HP print(self.P) break else: print(f"{self.E.name}未命中{self.P.name}") if HIT1 > hit_rate: # 玩家命中 P_damage = int(ATK1 * (1 - r2)) Total_P_damage = P_damage # 最终伤害 self.E.hp = self.E.hp - P_damage print(f"{self.P.name}对{self.E.name}造成了{Total_P_damage}点{ef1}伤害") if self.E.hp < 0: print(self.E.name, "死亡") self.P.exp += self.E.exp print(f"{self.P.name}获得{self.E.exp}经验") if self.P.level_up(): # 是否升级 self.E.update() break else: print(f"{self.P.name}未命中{self.E.name}") self.E.hp = self.E.HP # 怪物血量更新 print("**" * 22) # ##################初始化角色################## def init_player(name): # 初始化玩家 name = name lv = 1 hp, mp = 100, 20 STR, WIS, VIT, SPD, LUK = 2, 2, 2, 55, 50 ATK = 10 DEF = 5 EXP = 10 # (self, name, lv, HP, MP, STR, WIS, VIT, SPD, ATK, DEF, exp, EXP=0, ptr=0, luck=0, bonus=0.0) P = Character(name, lv, hp, mp, STR=STR, WIS=WIS, VIT=VIT, SPD=SPD, ATK=ATK, DEF=DEF, EXP=EXP, LUK=LUK) return P def init_enemy(name): # 初始化敌人 name = name lv = 1 hp = random.randint(10, 20) ATK = random.randint(5, 10) DEF = random.randint(1, 5) exp = 5 E = Character(name, lv, hp, ATK=ATK, DEF=DEF, exp=exp, SPD=1, LUK=1) return E if __name__ == '__main__': Aron = init_player("奈非天") Zom = init_enemy("僵尸") print(Aron) print(Zom) for i in range(1, 100): B = Battle(Aron, Zom) B.battle() print(Aron) print(Zom)
Python文字游戏:升级、打怪、属性点、装备等(二)
最新推荐文章于 2024-08-29 04:11:39 发布