Python文字游戏:升级、打怪、属性点、装备等(二)

该代码定义了一个Character类用于创建角色,包括属性如等级、生命值、攻击力等,并实现了升级、属性分配等功能。另外,还有一个Battle类用于模拟战斗过程,包括计算伤害、命中率、暴击等战斗效果。程序通过初始化玩家和敌人角色进行多轮战斗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值