尝试制作一个准系统的 Pokemon 游戏并且切换不起作用
当尝试切换 Pokemon 时,我可以让代码识别 activePlayerMon= 在运行 switchOption() 函数时有一个值切换,但是一旦调试器离开该函数,它就会恢复当第一次提示您选择 Mon 时,返回到最初给定的值
def fight(playerlist, computerlist):
print('\n',playerlist[1].name,'\n',playerlist[2].name,'\n',playerlist[3].name,'\n')
initFight = int(input('Choose your starting Pokemon\n'))
playerlist[int(initFight)].fightPrompt(computerlist[1])
activePlayerMon = playerlist[initFight]
activeComputerMon = computerlist[1]
def switchOption(determine_user):
global activePlayerMon, activeComputerMon
if determine_user == 1:
print('\n',playerlist[1].name,'\n',playerlist[2].name,'\n',playerlist[3].name,'\n')
changeMon = int(input('Choose who you\'d like to switch to'))
activePlayerMon = playerlist[changeMon]
elif determine_user == 0:
changeMon = randint(1,3)
activeComputerMon = computerlist[changeMon]
while playerlist[1].HP != 0 and playerlist[2].HP != 0 and playerlist[3].HP != 0 or computerlist[1].HP != 0 and computerlist[2].HP != 0 and computerlist[3].HP != 0:
print('\n',activePlayerMon.name,'- \n',activePlayerMon.HP,'\ ',activePlayerMon.MHP,'\n',activeComputerMon.name,'- \n',activeComputerMon.HP,'\ ',activeComputerMon.MHP,'\n')
fightOption = int(input('Would you like to-\n 1. Fight\n 2. Heal\n 3. Switch\n'))
if fightOption == 1:
<< attacking function call >>
elif fightOption == 2:
<< healing function call >>
elif fightOption == 3:
switchOption(1)
我尝试了一种变体,其中 switchOption() 函数位于 Fight() 函数之外,使用 playerList[] 和 activePlayerMon= 的参数,但效果相同东西。
我还有一个版本,它只是硬编码为仅适用于玩家,但转向策略以使其更容易为计算机编码
我知道很多代码都没有优化,但我我真的坚持以模块化的方式进行这项工作。
简而言之,我该如何做到这一点,以便当 activePlayerMon 的值在 switchOption() 函数内切换时,它会保留更改而不是恢复回来为旧值?
如果需要,我愿意将文件上传到 GitHub
你遇到的问题与
global
关键字的使用方式有关。虽然你正确地使用了
global
关键字在
switchOption
函数内部修改全局变量,但你创建了一个名为
activePlayerMon
的
新
局部变量,该变量隐藏了全局变量。
为了解决这个问题,你需要在
fight
函数内部初始化
activePlayerMon
和
activeComputerMon
,使它们成为全局变量。然后,你可以在
switchOption
函数内部修改它们,而无需使用
global
关键字。
以下修改后的代码应该可以按预期工作:
def fight(playerlist, computerlist):
global activePlayerMon, activeComputerMon # 声明全局变量
print('\n', playerlist[1].name, '\n', playerlist[2].name, '\n', playerlist[3].name, '\n')
initFight = int(input('Choose your starting Pokemon\n'))
playerlist[int(initFight)].fightPrompt(computerlist[1])
activePlayerMon = playerlist[initFight] # 初始化全局变量
activeComputerMon = computerlist[1] # 初始化全局变量
def switchOption(determine_user):
if determine_user == 1:
print('\n', playerlist[1].name, '\n', playerlist[2].name, '\n', playerlist[3].name, '\n')
changeMon = int(input('Choose who you\'d like to switch to'))
# 现在可以直接修改全局变量
activePlayerMon = playerlist[changeMon]
elif determine_user == 0:
changeMon = randint(1, 3)
# 现在可以直接修改全局变量
activeComputerMon = computerlist[changeMon]
while playerlist[1].HP != 0 and playerlist[2].HP != 0 and playerlist[3].HP != 0 or computerlist[1].HP != 0 and computerlist[2].HP != 0 and computerlist[3].HP != 0:
print('\n', activePlayerMon.name, '- \n', activePlayerMon.HP, '\ ', activePlayerMon.MHP, '\n',
activeComputerMon.name, '- \n', activeComputerMon.HP, '\ ', activeComputerMon.MHP, '\n')
fightOption = int(input('Would you like to-\n 1. Fight\n 2. Heal\n 3. Switch\n'))
if fightOption == 1:
# << attacking function call >>
pass
elif fightOption == 2:
# << healing function call >>
pass
elif fightOption == 3:
switchOption(1)
在这个修改后的代码中,我们在
fight
函数内部使用
global
关键字声明了
activePlayerMon
和
activeComputerMon
变量。这使得
switchOption
函数可以直接修改这些全局变量,而无需再次使用
global
关键字。
请注意,过度使用全局变量通常被认为是不好的做法,因为它可能会使代码更难理解和维护。在你的情况下,将这些变量作为参数传递给函数并在函数完成时返回更新后的值可能是更好的选择。
标签:python,function,variable-assignment From: 78832082