文字格斗游戏:闪避后未达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!")
问题根源
- 战斗循环逻辑错误:
while battles is True循环中,仅当一方HP≤0时执行break,如果双方都闪避攻击且HP未归零,代码会执行完当前一轮攻击后直接退出循环,没有继续触发下一轮战斗的逻辑。 - 角色HP未重置:每次战斗复用同一个角色实例,HP会继承上一次战斗后的状态,导致后续战斗逻辑混乱。
- 闪避概率计算不合理:使用
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
相关产品推荐
相关产品推荐

