游戏中的伤害计算问题 | 豆包MarsCode AI刷题

65 阅读4分钟

小C在玩一个回合制格斗游戏,她需要挑战boss。游戏的规则如下:

  • 每回合小C先攻击boss,然后boss攻击小C。
  • 小C有时能够闪避boss的攻击,成功闪避时她不会受到伤害。
  • 小C的攻击会累积“连击点”,每次攻击时的伤害由公式 伤害=a+kb 计算,其中 a 是基础攻击力,b 是基础连击伤害,k 是连击次数。
  • 每次攻击后,连击次数 k 增加 1。如果小C未能闪避boss的攻击,连击次数重置为0。

给定一场战斗的回合s,小C想知道她在这场战斗中对boss造成的总伤害是多少。在字符串s中,'1'代表本回合闪避成功,'0'代表闪避失败。

测试样例

样例1:

输入:n = 3, a = 5, b = 2, s = "101"
输出:17

样例2:

输入:n = 5, a = 6, b = 3, s = "11010"
输出:42

样例3:

输入:n = 4, a = 4, b = 1, s = "0011"
输出:17

解题思路

问题理解

首先,我们需要理解游戏的规则和题目要求:

  1. 回合制战斗:每回合小C先攻击,然后boss攻击。
  2. 闪避机制:小C有时能够闪避boss的攻击,成功闪避时不会受到伤害。
  3. 连击机制:小C的攻击会累积连击点,每次攻击的伤害由公式 伤害=a+kb 计算,其中 a 是基础攻击力,b 是基础连击伤害,k 是连击次数。
  4. 连击重置:如果小C未能闪避boss的攻击,连击次数重置为0。

数据结构选择

为了实现这个问题的解决方案,我们可以使用以下数据结构:

  • 整数变量:用于记录当前的连击次数 combo
  • 整数变量:用于累加总伤害 total_damage

算法步骤

  1. 初始化

    • 初始化总伤害 total_damage 为0。
    • 初始化连击次数 combo 为0。
  2. 遍历字符串 s

    • 对于每个字符,计算当前攻击的伤害 damage,公式为 a + combo * b

    • 将当前攻击的伤害累加到 total_damage 中。

    • 根据闪避情况更新连击次数:

      • 如果字符是 '1',表示闪避成功,连击次数增加1。
      • 如果字符是 '0',表示闪避失败,连击次数重置为0。
  3. 返回总伤害

    • 遍历完所有回合后,返回累加的总伤害 total_damage

代码实现

def solution(n: int, a: int, b: int, s: str) -> int:
    # 初始化总伤害和连击次数
    total_damage = 0
    combo = 0
    
    # 遍历字符串 s 中的每个字符
    for char in s:
        # 计算当前攻击的伤害
        damage = a + combo * b
        
        # 累加总伤害
        total_damage += damage
        
        # 根据闪避情况更新连击次数
        if char == '1':
            # 闪避成功,连击次数增加
            combo += 1
        else:
            # 闪避失败,连击次数重置
            combo = 0
    
    # 返回总伤害
    return total_damage

代码解释

  1. 初始化

    • total_damage 初始化为0,用于累加小C对boss造成的总伤害。
    • combo 初始化为0,用于记录当前的连击次数。
  2. 遍历字符串 s

    • 使用 for 循环遍历字符串 s 中的每个字符。
    • 对于每个字符,计算当前攻击的伤害 damage,公式为 a + combo * b
    • 将当前攻击的伤害累加到 total_damage 中。
  3. 根据闪避情况更新连击次数

    • 如果字符是 '1',表示闪避成功,连击次数增加1。
    • 如果字符是 '0',表示闪避失败,连击次数重置为0。
  4. 返回总伤害

    • 遍历完所有回合后,返回累加的总伤害 total_damage

测试样例

在 if __name__ == '__main__': 部分,我们添加了一些测试样例来验证代码的正确性:

  • solution(3, 5, 2, "101") == 17
  • solution(5, 6, 3, "11010") == 42
  • solution(4, 4, 1, "0011") == 17

总结

通过遍历字符串 s,我们可以根据每个回合的闪避情况更新连击次数,并计算每次攻击的伤害,最终累加得到总伤害。这个问题的关键在于理解连击机制和闪避机制,并通过遍历字符串来模拟每回合的战斗过程。