飞机射击游戏中循环重复相同HP/弹药值,无法归零的问题求助
问题修复方案
核心问题分析
- 数值更新逻辑错误:你当前是用
target.hp = target.maxHp - damage直接重置敌方血量为「最大血量-单次伤害」,而非在当前剩余血量基础上扣除;弹药更新同理,self.ammo = self.maxAmmo - damage * 2也是重置操作,不是递减。 - 循环逻辑错位:现有while循环仅重复打印10次同一计算结果,没有在循环内执行新的射击动作,数值自然不会变化。
- 终止条件不符需求:需求是一方HP归0即停止,而非固定执行10次迭代。
修复后的完整代码
import random class Airplane: def __init__(self, name, maxHp, maxAmmo): self.name = name self.maxHp = maxHp self.hp = maxHp self.maxAmmo = maxAmmo self.ammo = maxAmmo def shoot(self, target): # 生成单次射击的随机伤害值 randomAmt = random.randrange(10, 25) # 扣除敌方当前血量,确保不低于0 target.hp = max(target.hp - randomAmt, 0) # 扣除射手双倍弹药,确保不低于0 self.ammo = max(self.ammo - randomAmt * 2, 0) def is_alive(self): # 判断飞机是否存活 return self.hp > 0 # 初始化两架飞机 plane1 = Airplane(input("Enter name: "), 100, 250) plane2 = Airplane(input("Enter name: "), 100, 250) counter = 1 # 循环对战直到一方被击落 while plane1.is_alive() and plane2.is_alive(): # 飞机1射击飞机2 plane1.shoot(plane2) print(f"{counter} {plane1.name} │ {plane1.ammo}/{plane1.maxAmmo} │ {plane1.hp}/{plane1.maxHp} : {plane2.name} │ {plane2.ammo}/{plane2.maxAmmo} │ {plane2.hp}/{plane2.maxHp}") if not plane2.is_alive(): break # 飞机2反击飞机1 plane2.shoot(plane1) counter += 1 print(f"{counter} {plane1.name} │ {plane1.ammo}/{plane1.maxAmmo} │ {plane1.hp}/{plane1.maxHp} : {plane2.name} │ {plane2.ammo}/{plane2.maxAmmo} │ {plane2.hp}/{plane2.maxHp}") counter += 1 # 输出最终结果 if plane1.is_alive(): print(f"\n{plane1.name} 获胜!") else: print(f"\n{plane2.name} 获胜!")
关键修改说明
- 修正数值更新方式:通过
max(当前值-扣除量, 0)实现剩余数值的递减,同时避免出现负数。 - 分离射击与循环逻辑:
shoot方法仅负责单次射击的数值计算,外部循环控制对战回合,直到一方HP归0。 - 新增存活判断方法:
is_alive方法简化了循环内的存活检查逻辑,代码更简洁。 - 补充回合制反击:添加敌方反击逻辑,符合双方对战的游戏逻辑(若不需要可删除该部分)。
内容的提问来源于stack exchange,提问作者abeCamelCase
相关产品推荐
相关产品推荐

