我在分配对象方面遇到了问题。我希望能够通过函数分配对象,但因为直到函数期间才定义变量name
,所以当我第一次调用函数(name = john)时,它说:
NameError: name 'john' is not defined
。
我在运行游戏会话时使用此脚本来帮助我,我希望能够随意创建新的NPC,但无论如何都要在没有首先使用的情况下执行此操作:
>>> blahblah = Character()
在python提示符中?
对于代码块感到抱歉,如果有简单的解决方案,我很抱歉。
import random
import math
combat_participants = []
npc_list = []
class Character():
"""Basic class for character statistics
"""
def get_stats(self):
"""Refreshes the stats after new assignment
"""
self.hp = self.st
self.will = self.iq
self.per = self.iq
self.fp = self.ht
self.bspeed = (self.ht + self.dx) / 4
self.dodge = math.floor(self.bspeed + 3)
self.bmove = math.floor(self.bspeed)
self.blift = round(self.st*self.st/5)
def get_status(self):
"""Checks the status of the character
"""
if self.hp < -self.hp:
self.status = 'Dead'
elif self.hp < 0:
self.status = 'Unconscious'
else:
self.status = 'Alive'
#Primary Attributes
st = 10
dx = 10
iq = 10
ht = 10
#Secondary Attributes
hp = st
will = iq
per = iq
fp = ht
bspeed = (ht + dx) / 4
dodge = math.floor(bspeed + 3)
bmove = math.floor(bspeed)
blift = round(st*st/5)
#Other
status = 'Alive'
weapon = 'None'
shield = 'None'
char_name = ''
def create_npc(name, str_name, level, combat):
"""
/long and irrelevant/
"""
name = Character()
name.char_name = str_name
#Randomly assigning attributes
prim_attr_list = [name.st, name.dx, name.iq, name.ht]
for attr in prim_attr_list:
attr = random.randint(7+level,9+level)
name.get_stats(name)
#Randomly assigns a weapon
temp_weapon_list = []
for weapon in weapon_list:
if weapon.st <= name.st:
temp_weapon_list += weapon
name.weapon = temp_weapon_list[random.randint(0,len(temp_weapon_list)-1)]).wep_name
#Adds them to the npc list
global npc_list
npc_list += [name]
#Adds them to combat list if they are in combat
global combat_participants
if combat:
combat_participants += [name]
编辑:编辑:用create_npc调用函数后('john','John Smithson II',2,True)
我将类对象分配为'john'
而不是john
后,我不知道如何访问它。例如:>>> john.char_name
会给我这个错误NameError: name 'john' is not defined
,>>> 'john'.char_name
会给我AttributeError: 'str' object has no attribute 'char_name'
答案 0 :(得分:0)
您不需要将名称传递给函数,从函数定义中删除该参数,您的代码应该可以正常工作。
答案 1 :(得分:0)
您要做的是在__init__()
课程中添加Character
方法。以下是简化的Character
类:
class Weapon:
def __init__(self, name, damage):
self.name = name
self.damage = damage
self.level = 1
def upgrade(self):
self.level += 1
self.damage += 10
class Character:
def __init__(self, name, level, weapon):
self.name = name
self.level = level
self.weapon = weapon
self.max_hp = self.get_max_hp()
self.hp = max_hp
def get_max_hp(self):
return 100 + self.level*10
def get_status(self):
if self.hp <= 0:
return 'Dead'
elif self.hp < self.max_hp:
return 'Unhealthy'
else:
return 'Healthy'
def level_up(self):
self.level += 1
self.max_hp = self.get_max_hp()
self.weapon.upgrade()
def attack(self, npc):
npc.hp -= self.weapon.damage
>>> sword = Weapon('sword', 15)
>>> spear = Weapon('spear', 20)
>>> npc1 = Character('john', 5, sword)
>>> npc2 = Character('james', 1, spear)
>>> npc1.name
'john'
>>> npc1.level
5
>>> npc1.max_hp
150
>>> npc1.weapon.name
'sword'
>>> npc1.weapon.damage
15
>>> npc1.weapon.upgrade()
>>> npc1.weapon.damage
25
>>> npc1.hp
150
>>> npc1.get_status()
'Healthy'
>>> npc2.attack(npc1)
>>> npc1.hp
130
>>> npc1.get_status()
'Unhealthy'
>>> for i in range(10):
npc2.attack(npc1)
>>> npc1.hp
-70
>>> npc1.get_status()
'Dead'
>>> npc1.level_up()
>>> npc1.level
6
>>> npc1.weapon.damage
35
>>> npc1.max_hp
160