原神伤害计算[python]

本文详细介绍了如何使用Python实现了一个基于特定游戏机制的伤害计算函数,包括基础伤害、增伤、暴击、增幅、防御和抗性等多个乘区的计算方法,以及激化反应的处理。附带了实际应用的链接和使用指南。

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

计算理论:

代码:

import numpy as np


def damage_cal(AE: float, DB: float, CD: float, ER: float, DF: float, RT: float) -> float:
    """
    根据六大乘区的伤害计算,这里暂时仅作为测试。
    :param AE: 基础伤害区 + 激化加成值 (攻击区 Attack × 倍率区 Damage Multipiler + 激化区 Elemental Reaction)
    :param DB: 增伤区 Damage Bonus
    :param CD: 暴击区 Critical Damage
    :param ER: 增幅区 Elemental Reaction
    :param DF: 防御区 Defense
    :param RT: 抗性区 Resistance
    :return: damage : 计算得到的伤害值
    """
    damage = AE * DB * CD * ER * DF * RT
    return damage


def AE_cal(atk=1304.1, talent=2.8325, em=500.6, catalyze_verify=1, damage_catalyze_increased: float = 0,
           catalyze_type=2, added_basedamage: float = 0, multiply_basedamage: float = 0):
    """
    乘区名称:基础伤害区 + 激化加成值\n
    计算逻辑:Attack * Damage Multiplier + Elemental Reaction 基础伤害区+激化加成值。
    :param atk: 指单一倍率角色的倍率所属属性(如可莉是atk,芙宁娜是hp)
    :param talent: 如果是单一倍率,则按倍率算。如果是多个倍率,此处赋值1,让atk处先行计算完毕。
    :param em: 元素精通
    :param catalyze_verify: 是否激化
    :param damage_catalyze_increased: 激化反应加成值(圣遗物套装)
    :param catalyze_type: 激化反应类型(0:Quicken原激化 1:Aggravate超激化 2:Spread蔓激化)
    :param added_basedamage: 基础伤害加成(加算),如申鹤
    :param multiply_basedamage: 基础伤害加成(乘算),如辰砂之纺锤
    :return: AE_cal = atk * talent + catalyze_damage
    """
    AD = atk * talent * (1 + multiply_basedamage) + added_basedamage  # 基础伤害区
    if catalyze_verify:
        catalyze_damage = Cat_cal(em, damage_catalyze_increased, catalyze_type)
        ADE = AD + catalyze_damage  # 如果激化,则算激化加成值
    else:
        ADE = AD  # 如果不激化,则基础伤害区不变
    return ADE  # 这里返回值使用的名称是ADE是为了体现激化加成是算入基础伤害区的


def DB_cal(elemental_increase: float = 0, influence_increase: float = 0, artifact_increase=0.466, skill_increase: float = 0):
    """
    乘区名称:Damage Bonus 增伤区\n
    TIP:实际简单使用时,如果分不清楚或不需要分清楚,可以只赋值给一个,因为是加算
    :param elemental_increase: 元素/物理伤害加成
    :param influence_increase: 对元素影响下的敌人伤害提高
    :param artifact_increase: (圣遗物)造成伤害提高
    :param skill_increase: 元素爆发/元素战技/普攻/重击伤害提高
    :return: DB_cal = 1 + 4个increase之和
    """
    # 圣遗物的造成伤害提高是特指全技能的伤害提高,比如磐岩拾取结晶。如果仅单独提升某一技能则归为下一类skill_increase,比如乐团。
    # 这里元素爆发/元素战技/普攻/重击伤害的区分可利用其他参数来区分
    DB = 1 + elemental_increase + influence_increase + artifact_increase + skill_increase  # 加1是因为初始为100%
    return DB


def CD_cal(cr=0.458, cd=2.294, cr100=0):
    """
    乘区名称:Critical Damage 暴击区
    :param cr: 暴击率
    :param cd: 暴击伤害
    :param cr100: 是否计算满暴击(0否1是,默认否)
    :return: CD_cal = 1 + CRIT Rate * CRIT DMG 或 CD_cal = 1 + CRIT DMG
    """
    if cr100:  # 认为满暴
        CD = 1 + cd
    else:
        CD = np.where(cr >= 1,
                      1 + cd,
                      1 + cr * cd)
    return CD


def ER_cal(em=0, elemental_magnification=1.5, increased_reaction_coefficient=0):
    """
    乘区名称:Elemental Reaction 增幅区
    :param em: 精通值
    :param elemental_magnification: 反应基础倍率(水火蒸发2.0 火水蒸发1.5 火冰融化2.0 冰火融化1.5)
    :param increased_reaction_coefficient: 反应系数提高(圣遗物套装)
    :return: ER_cal = 反应基础倍率*(1+精通提升+反应系数提高)
    """
    ER = elemental_magnification * (1 + ((2.78 * em) / (em + 1400)) + increased_reaction_coefficient)
    return ER


def DF_cal(person_lever=90, hilichurl_level=90, reduce_defenses=0, ignore_defenses=0, increase_defenses=0):
    """
    乘区名称:Defense 防御区
    :param person_lever: 角色等级
    :param hilichurl_level: 魔物等级(不知道怎么翻译所以用的丘丘人)
    :param reduce_defenses: 降低防御
    :param ignore_defenses: 无视防御
    :param increase_defenses: 增防(少见,一般见于副本中的属性强化石)
    :return: DF_cal = (人等+100)/[(人等+100)+(1-穿防)*(1-减防+增防)*(怪等+100)],即默认为190/[190+(1-穿防)*(1-减防)*190]
    """
    DF = (person_lever + 100) / ((person_lever + 100) +
                                 (1 - ignore_defenses) * (1 - reduce_defenses + increase_defenses) * (
                                             hilichurl_level + 100))
    return DF


def RT_cal(reduce_resistance=0, resistance=0.1):
    """
    乘区名称:Resistance 抗性区
    :param reduce_resistance: 降低敌人抗性
    :param resistance: 敌人抗性(默认为10%)
    :return: RT_cal = f( resistance - reduce_resistance )  (f函数见代码)
    """
    resistance -= reduce_resistance  # 原抗性减去减抗
    if resistance < 0:
        RT = 1 - (resistance / 2.0)
    elif 0 <= resistance <= 0.75:
        RT = 1 - resistance
    else:  # resistance > 0.75
        RT = 1.0 / (1 + 4 * resistance)
    return RT


def Cat_cal(em: float, damage_catalyze_increased: float, catalyze_type: int):
    """
    [子乘区]\n
    乘区名称:catalyze_damage 激化加成伤害
    :param em: 精通
    :param damage_catalyze_increased: 激化反应加成值(圣遗物套装)
    :param catalyze_type: 激化类型(0:Quicken原激化 1:Aggravate超激化 2:Spread蔓激化)
    TIP: todo 暂时只写90级激化的参考公式
    """
    type_coefficient = 1
    if catalyze_type == 1:
        type_coefficient = 1.15
    elif catalyze_type == 2:
        type_coefficient = 1.25
    cat_damage = 1446.853458 * type_coefficient * (1 + (5 * em) / (em + 1200) + damage_catalyze_increased)
    return cat_damage

界面版的伤害计算工具:

https://github.com/virtualxiaoman/Genshin-Calculator

使用方法可见B站:

virtual小满的个人空间-virtual小满个人主页-哔哩哔哩视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值