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

文字格斗游戏:闪避后未达HP终止条件,while循环仍终止如何修复?

问题修复:文字格斗游戏战斗循环提前结束问题

问题描述

开发的文字格斗游戏中,当敌人或玩家闪避攻击后,尽管双方HP都未≤0,战斗循环仍会提前结束,无法继续战斗。

问题代码

import random

class Character:
    def __init__(self, name, hp, attack, dodge):
        self.name = name
        self.hp = hp
        self.attack = attack
        self.dodge = dodge
    
    def take_damage(self, damage):
        self.hp -= damage
    
    def hit(self, target):
        damage = self.attack
        miss = random.randint(1, 10 - self.dodge)
        if miss == random.randint(1, 10 - self.dodge):
          print(f"{target.name} dodged the attack!")
        else:
          target.take_damage(damage)
          print(f"{self.name} attacks {target.name} for {damage} damage!")

        
class Player(Character):
    def __init__(self, name, hp, attack, dodge):
        super().__init__(name, hp, attack, dodge)
        
class Enemy(Character):
    def __init__(self, name, hp, attack, dodge):
        super().__init__(name, hp, attack, dodge)

    fighter = Player("Fighter", 5, 3, 2)
    mage = Player("Mage" ,1, 5, 6)
    thief = Player("Thief" ,4, 3, 8)
    i = 1
    
    print("Welcome to Fighter Arena")
    x = input("Enter Your Name: ")
    print("Choose Your Character (fighter = 1 | mage = 2 | thief = 3)")
    choice = input()
    
    if choice == '1':
      user = fighter
    
    if choice == '2':
      user = mage
    
    if choice == '3':
      user = thief

    while True:
      ai = random.randint(1,3)
      if ai == 1:
        ai = fighter
        print("\nYou are fighting a fighter!")
        break
      if ai == 2:
        ai = mage
        print("\nYou are fighting a mage!")
        break
      if ai == 3:
        ai = thief
        print("\nYou are fighting a thief!")
        break
        
    player = user
    enemy = ai
    userCount = 0
    targetCount = 0

    for i in range(100):
      battles = True
      while battles is True:
          player = user
          enemy = ai
          print("\nRound", i)
          first = random.randint(1, 2)
          if first == 1:
            player.hit(enemy)
            if enemy.hp <= 0:
              print("You win!")
              userCount+=1
              break

              
            enemy.hit(player)
            if player.hp <= 0:
              print("You lose!")
              targetCount+=1
              break

              
          if first == 2:
            enemy.hit(player)
            if player.hp <= 0:
              print("You lose!")
              targetCount+=1
              break

              
            player.hit(enemy)
            if enemy.hp <= 0:
              print("You win!")
              userCount+=1
              break


    print(f"\nYou won", userCount, "times!")
    print(f"AI won", targetCount, "times!")

问题根源

  1. 战斗循环逻辑错误:while battles is True循环中,仅当一方HP≤0时执行break,如果双方都闪避攻击且HP未归零,代码会执行完当前一轮攻击后直接退出循环,没有继续触发下一轮战斗的逻辑。
  2. 角色HP未重置:每次战斗复用同一个角色实例,HP会继承上一次战斗后的状态,导致后续战斗逻辑混乱。
  3. 闪避概率计算不合理:使用miss == random.randint(1, 10 - self.dodge)判断闪避,两个随机数相等的概率远低于预期的闪避概率,逻辑不符合设计意图。

修复方案与代码

修改点说明

  • 给Character类添加max_hp属性与reset_hp方法,用于保存并重置初始HP。
  • 修正闪避概率计算:用单个随机数与闪避阈值比较,确保概率符合dodge属性的设计(数值越高,闪避概率越高)。
  • 重构战斗循环:移除冗余的break逻辑,确保双方存活时会持续进入下一轮战斗。
  • 每次战斗前重置角色HP,避免状态污染。

修复后的代码

import random

class Character:
    def __init__(self, name, hp, attack, dodge):
        self.name = name
        self.max_hp = hp  # 保存初始HP
        self.hp = hp
        self.attack = attack
        self.dodge = dodge
    
    def take_damage(self, damage):
        self.hp -= damage
        if self.hp < 0:
            self.hp = 0  # 防止HP变为负数
    
    def reset_hp(self):
        # 重置HP为初始值
        self.hp = self.max_hp
    
    def hit(self, target):
        damage = self.attack
        # 修正闪避概率:1-10的随机数≤闪避值则触发闪避
        dodge_chance = random.randint(1, 10)
        if dodge_chance <= target.dodge:
            print(f"{target.name} dodged the attack!")
        else:
            target.take_damage(damage)
            print(f"{self.name} attacks {target.name} for {damage} damage!")

class Player(Character):
    def __init__(self, name, hp, attack, dodge):
        super().__init__(name, hp, attack, dodge)
        
class Enemy(Character):
    def __init__(self, name, hp, attack, dodge):
        super().__init__(name, hp, attack, dodge)

# 定义角色模板,方便创建新实例
CHARACTER_TEMPLATES = {
    "fighter": ("Fighter", 5, 3, 2),
    "mage": ("Mage", 1, 5, 6),
    "thief": ("Thief", 4, 3, 8)
}

print("Welcome to Fighter Arena")
player_name = input("Enter Your Name: ")
print("Choose Your Character (fighter = 1 | mage = 2 | thief = 3)")
choice = input()

# 选择并创建玩家角色
if choice == '1':
    user = Player(*CHARACTER_TEMPLATES["fighter"])
elif choice == '2':
    user = Player(*CHARACTER_TEMPLATES["mage"])
elif choice == '3':
    user = Player(*CHARACTER_TEMPLATES["thief"])
else:
    print("Invalid choice, defaulting to Fighter")
    user = Player(*CHARACTER_TEMPLATES["fighter"])

# 随机选择敌人角色
ai_choice = random.randint(1,3)
if ai_choice == 1:
    enemy = Enemy(*CHARACTER_TEMPLATES["fighter"])
    print("\nYou are fighting a fighter!")
elif ai_choice == 2:
    enemy = Enemy(*CHARACTER_TEMPLATES["mage"])
    print("\nYou are fighting a mage!")
else:
    enemy = Enemy(*CHARACTER_TEMPLATES["thief"])
    print("\nYou are fighting a thief!")

userCount = 0
targetCount = 0

# 进行100次战斗
for battle_num in range(100):
    print(f"\n=== Battle {battle_num + 1} ===")
    # 每次战斗前重置双方HP
    user.reset_hp()
    enemy.reset_hp()
    battle_active = True
    round_num = 1
    
    while battle_active:
        print(f"\nRound {round_num}")
        # 随机决定先手
        first = random.randint(1, 2)
        
        if first == 1:
            # 玩家先手
            user.hit(enemy)
            if enemy.hp <= 0:
                print("You win!")
                userCount += 1
                battle_active = False
                continue
            
            # 敌人反击
            enemy.hit(user)
            if user.hp <= 0:
                print("You lose!")
                targetCount += 1
                battle_active = False
                continue
        else:
            # 敌人先手
            enemy.hit(user)
            if user.hp <= 0:
                print("You lose!")
                targetCount += 1
                battle_active = False
                continue
            
            # 玩家反击
            user.hit(enemy)
            if enemy.hp <= 0:
                print("You win!")
                userCount += 1
                battle_active = False
                continue
        
        round_num += 1

print(f"\nFinal Results:")
print(f"You won {userCount} times!")
print(f"AI won {targetCount} times!")

修复后的效果

  • 当双方闪避攻击且HP均未归零,战斗会自动进入下一轮,直到一方HP耗尽。
  • 每次战斗前会重置角色HP,确保每场战斗都是公平的初始状态。
  • 闪避概率逻辑更合理,dodge数值越高,角色闪避攻击的概率越高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:30:16