我目前正在使用python tkinter库制作一个RPG风格的游戏。 我正在努力研究战斗系统但是我遇到了破坏性系统的问题
我正在尝试将函数中的变量更改为参数,但当然我不能这样做..我已经尝试过查看其他解决方案而且由于tkinter的工作原理它们根本无济于事与其他代码不同。
这是我的代码:
def Attack(EnemyHP,EnMax,GuiEnemyHP,EnemyHPBar,Width):
Dmg = AtkDmg()
EnemyHP = EnemyHP - Dmg
GuiEnemyHP['text'] = Enemy + ": " + str(EnemyHP)+ '/' + str(EnMax)
Loss = (Width / EnMax) * Dmg
Width = EnemyBar_Width - Loss
EnemyBar.place(x=110,y=0,width=Width,height=20)
答案 0 :(得分:2)
如果你继续这样做,你的代码将变得非常混乱。
Python是一种面向对象的语言,因此您可能应该使用类和实例来描述它们之间的字符和交互。
这是角色的一个非常基本的实现:
class Character:
def __init__(self, name, hp_max):
self.name = name
self.xp = 0
self.hp_max = hp_max
self.hp = hp_max
# TODO: define hp_bar here
def is_dead(self):
return self.hp <= 0
def attack(self, opponent, damage):
opponent.hp -= damage
self.xp += damage
def __str__(self):
return '%s (%d/%d)' % (self.name, self.hp, self.hp_max)
hero = Character('Mario', 1000)
enemy = Character('Goomba', 100)
print(enemy)
# Goomba (100/100)
hero.attack(enemy, 50)
print(enemy)
# Goomba (50/100)
hero.attack(enemy, 50)
print(enemy)
# Goomba (0/100)
print(enemy.is_dead())
# True
print(hero.xp)
# 100
答案 1 :(得分:0)
据我所知,对象作为引用被传递,因此你可以在函数内修改它们。正如其他人所指出的那样,即使将对象作为参数传递的pythonic方式也不是通过引用,它可以从函数内部改变对象的属性。
如果您不想创建对象,另一种绕过此限制的方法是传递列表,因为它们是可变的 - 您可以替换函数内的列表项,然后调用者将看到新修改的列表函数返回时,元素而不是旧元素。 (虽然不是一个好的解决方案。)
答案 2 :(得分:0)
正如您已经注意到的,在函数中重新绑定参数不会像您预期的那样在这里工作,因为参数名称是函数的本地。这为您提供了两种解决方案:
功能方式:从函数中返回新的/更新的值:
def foo(arg1, arg2, argN):
arg1 += 42
arg2 = arg1 + argN
argN -= arg2
return arg1, arg2, argN
arg1, arg2, argN = foo(arg1, arg2, argN)
OO方式:传递一个可变对象并改变它:
class Arg(object):
def __init__(self, arg1, arg2, argN):
self.arg1 = arg1
self.arg2 = arg2
self.argN = argN
def foo(arg):
arg.arg1 += 42
arg.arg2 = arg.arg1 + arg.argN
arg.argN -= arg.arg2
arg = Arg(x, y, z)
foo(arg)
# now arg.arg1, arg.arg2 and arg.argN have been updated
# - but NOT x, y and z which are untouched
请注意,在第二个示例中,更好的设计是让Arg
上的方法执行有效更新,并直接使用此方法或(如果需要)从foo()
调用它。 / p>
作为旁注:我发现你的Attack
函数中发生了很多不相关的事情 - 至少有一部分是域相关的(计算损坏和更新EnemyHP
)而另一部分是演示文稿相关(更新GuiEnemyHP
和EnemyBar
)。这两个部分可以在应用程序的两个不同层中得到更好的处理(分别是模型层 - 它不应该对表示有任何了解 - 以及UI层)。