You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

父类attack方法在Player与Enemy子类中表现异常的原因排查

问题修复:敌人攻击玩家时生命值异常增加的解决方法

核心问题原因

敌人攻击玩家时生命值反而增加,是因为attack方法中的伤害计算可能得到负数:

target.health = target.health-(self.strength * 1.5 - target.defense)

当攻击者的strength * 1.5小于目标的defense时,self.strength * 1.5 - target.defense会是负数,此时减去负数等价于给目标增加生命值。比如敌人强度为5,玩家防御为10:5*1.5-10 = -2.5,玩家生命值就会增加2.5。

修复步骤

1. 修正攻击伤害计算逻辑

确保伤害值至少为0,避免出现反向加血的情况:

def attack(self, target):
    damage = max(self.strength * 1.5 - target.defense, 0)
    target.health -= damage

使用max()函数保证伤害不会低于0,这样即使攻击者强度不足以突破防御,也只会造成0伤害,不会加血。

2. 优化子类构造函数

Player和Enemy子类完全重复了父类Character的构造逻辑,直接调用父类构造函数即可,减少冗余代码:

class Player(Character):
    def __init__(self, level, health, strength, defense): 
        super().__init__(level, health, strength, defense)

    def get_xp(self):
        pass

    def walk(self):  # 补充缺失的self参数,避免调用报错
        pass

class Enemy(Character):
    def __init__(self, level, health, strength, defense):
        super().__init__(level, health, strength, defense)

3. 调整战斗循环逻辑

当前战斗循环存在两个小问题:攻击后生命值未即时显示、每次生成的敌人属性固定。调整后的代码如下:

import time
import random
from character import *

# 创建玩家
new_player = Player(1,10,10,10)

while True:
    # 每次生成新敌人时重新计算随机属性
    if new_player.level > 5:
        enemy_level = new_player.level - random.randint(1,5)
    else:
        enemy_level = 1

    enemy_health = enemy_level * random.randint(1,4)
    enemy_strength = enemy_level * random.randint(1,4)
    enemy_defense = enemy_level * random.randint(1,4)
    
    new_enemy = Enemy(enemy_level, enemy_health, enemy_strength, enemy_defense)
    
    while new_enemy.health > 0 and new_player.health > 0:  # 增加玩家存活判断
        print(f"Player Health is: {new_player.health:.2f}")
        print(f"Enemy Health is: {new_enemy.health:.2f}")
        
        # 玩家攻击
        new_player.attack(new_enemy)
        if new_enemy.health <= 0:
            break
        
        # 敌人攻击
        new_enemy.attack(new_player)
        time.sleep(1)
    
    if new_player.health <= 0:
        print("你被敌人击败了!")
        break
    print("Enemy has been vanquished")
    time.sleep(1)

优化点说明:

  • 将敌人属性计算移到外层循环内,每次生成新敌人时随机生成属性
  • 增加玩家生命值判断,避免玩家死后敌人仍继续攻击
  • 攻击后立即判断敌人是否死亡,避免无效攻击
  • 生命值保留两位小数,显示更整洁

额外建议

  • 可以给生命值设置下限(比如0),避免出现负数生命值
  • 可以添加暴击、闪避等随机机制,丰富战斗体验
  • 实现get_xp方法,让玩家击败敌人后获得经验、提升等级

内容的提问来源于stack exchange,提问作者Scott Burkhart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:31:13