我正在为可以与经典DnD地牢爬行进行比较的游戏制作代码。我已经定义了几个包含字符统计和库存的字典。它们看起来像这样:
enemy_mid = {'hp': 100,
'ag': 50,
'sp': 60,
'st': 70,
'wep': sword,
'arm': leather,
'sld': buckler}
目前,该玩家有一个字典,玩家可以面对的敌人难度级别为3。现在,当战斗开始时,功能' assign_attacker()'被召唤是为了决定玩家将面对的敌人。该函数如下所示:
def assign_attacker():
attacker = character
enemy_choice = input("Would you prefer your enemnt to be easy, medium or hard, in terms of difficulty? (easy/med/hard): ").lower()
if enemy_choice == "easy":
defender = enemy_easy
elif enemy_choice == "med":
defender = enemy_med
elif enemy_choice == "hard":
defender = enemy_hard
else:
print("invalid")
调用此功能后,程序将需要决定谁拥有主动权。它应该使用以下函数执行此操作:
def initiative():
if attacker['sp'] > defender['sp']:
init = "att"
elif attacker['sp'] == defender['sp']:
init = "null"
else:
init = "def"
print(init)
然而,当调用此函数时,会出现一个错误,说“攻击者”。没有定义。我理解'攻击者'是一个局部变量,不能在其他函数之外调用,但我不知道最好的方法是确保可以在任何地方调用此变量。我听说使用' global'是非常糟糕的做法,因为这个变量将在我的代码中使用很多,我想找出定义这个变量的最佳方法是什么。这当然也适用于'后卫'变量
答案 0 :(得分:1)
您可以简单地修改您的分配攻击者以返回(attacker,defender)
的元组,并将其作为参数传递给主动函数。
#rest of your assign function
else:
print("invalid")
return (attacker,defender)
你的倡议看起来像
def initiative( players ) :
attacker = players[0]
defender = players[1]
其中players=assign_attacker()
。
答案 1 :(得分:0)
我会为我的游戏使用一个类(也可能是defender
和attacker
之类的类。这是一个超简化的例子:
class Game:
def test(self):
self.defender = 'hello'
self.attacker = 'world'
def test2(self):
print(self.defender + self.attacker)
def test3(self):
self.defender = 'goodbye'
g = Game()
g.test() # initial values set for self.defender and self.attacker
g.test2() # prints 'helloworld'
g.test3() # changes value of self.defender to 'goodbye'
g.test2() # prints 'goodbyeworld'
这里的要点是,您的所有方法都可以访问self.defender
和self.attacker
,当您更改这些变量时,方法会知道这些更改。但是,您需要确保self.attacker
和self.defender
以及以这种方式使用的任何其他变量在访问之前已初始化。例如,在上面的课程中,如果在test2()
之前调用test3()
或test()
,则会引发错误,因为变量尚未存在。您可以在类__init__()
方法或start_game()
方法中初始化这些变量,例如:
def __init__(self):
self.defender = some_initial_value
...
或者您可以传入初始值的对象:
def __init__(self, defender):
self.defender = defender
...
当您实例化类时(例如,当您执行__init__
时,将调用g = Game()
方法,如果传入初始值,则会调用g = Game(defender_obj)
。
如果您不熟悉Python中的类,here是关于该主题的交互式教程,这里是the Official Python tutorial on them。