Python3文本冒险游戏敌玩家战斗函数的属性错误问题排查
问题排查与解决方案
核心错误原因
出现AttributeError: 'function' object has no attribute 'creature_health_gen'的直接原因是:你用来指代Creature实例的变量creature被错误定义成了函数对象,或者直接用Creature类名调用实例方法(未先创建类的实例),导致Python无法找到对应的实例方法。
除此之外,代码还有几处逻辑错误需要修正:
random.choices()返回的是列表类型(比如[80]),直接用于计算会引发类型错误- 扣血操作仅做减法计算,但未将结果赋值回敌人的生命值属性,相当于无实际效果
- 战斗函数中
yes变量未定义,会引发NameError - 打印语句中使用了不存在的属性
enemy_calchealth
分步修复方案
1. 修正Creature类实现
把属性生成逻辑放到__init__方法中,实例化敌人时自动生成随机属性,同时处理random.choices的返回值(取列表第一个元素):
import random class Creature: def __init__(self): enemy_health_options = [75, 80, 85, 90, 100, 110] self.enemy_health = random.choices( enemy_health_options, weights=(5, 30, 20, 30, 10, 5), k=1)[0] enemy_attack_options = [15, 20, 25, 30, 35, 40] self.enemy_attack = random.choices( enemy_attack_options, weights=(5, 30, 20, 30, 10, 5), k=1)[0]
2. 正确创建类实例
确保creature变量名不与函数重名,正确实例化类:
# 假设Player类是你已实现的,这里给出基础示例 class Player: def __init__(self): self.attack = 20 # 基础攻击值 self.add_attack = 30 # 先手攻击值 player = Player() creature = Creature() # 正确创建敌人实例
3. 修复战斗函数逻辑
定义yes变量,修正扣血赋值逻辑,修正打印的属性名:
def fight(): yes = {'y', 'yes'} choice7 = input('Take first swing? (Y/N)') if choice7.lower() in yes: damage = player.add_attack creature.enemy_health -= damage print(f'The creature took {damage} damage. Their health is now {creature.enemy_health}') else: damage = player.attack creature.enemy_health -= damage print(f'The creature took {damage} damage. Their health is now {creature.enemy_health}')
4. 调用战斗函数
fight()
额外优化建议
可以给Creature类添加take_damage方法,封装扣血逻辑,避免生命值出现负数:
class Creature: def __init__(self): # 同之前的初始化代码 enemy_health_options = [75, 80, 85, 90, 100, 110] self.enemy_health = random.choices( enemy_health_options, weights=(5, 30, 20, 30, 10, 5), k=1)[0] enemy_attack_options = [15, 20, 25, 30, 35, 40] self.enemy_attack = random.choices( enemy_attack_options, weights=(5, 30, 20, 30, 10, 5), k=1)[0] def take_damage(self, damage): self.enemy_health = max(0, self.enemy_health - damage) return self.enemy_health
战斗函数中可改为:
creature.take_damage(damage)
内容的提问来源于stack exchange,提问作者Melissa Hookey
相关产品推荐
相关产品推荐

