为了账号安全,请及时绑定邮箱和手机立即绑定

python中的递归,不覆盖已更改的变量

python中的递归,不覆盖已更改的变量

忽然笑 2022-12-20 09:30:42
我正在尝试编写一个执行以下操作的函数:如果player_hand没有任何小于或等于mana_bank的数字,则该函数不执行任何操作。如果player_hand的数字小于或等于mana_bank,那么函数应该提示用户选择哪个数字。如果用户选择的数字小于mana_bank,它应该返回一个包含该数字的列表。如果数字大于mana_bank它应该再次调用该函数,直到他提示一个小于或等于mana_bank的数字。每当我运行该函数并且用户首先提示一个高于mana_bank的数字时,该函数就会从自身内部调用,然后即使用户提示一个小于或等于mana_bank的数字,该函数也会返回 None 而不是中的数字一个列表。我还尝试将变量player_choice 设置为全局变量,但它仍然不起作用。将不胜感激任何指导。def pick_card():    player_choice_str = 0    player_choice = []    for i in player_hand:        if i <= mana_bank:            print(player_hand, mana_bank, "Mana available type the name of the card you wish to play ... ")            player_choice_str = input()            break        if not i <= mana_bank:            return "You don't have enough mana to play a card."    if int(player_choice_str) > mana_bank:        print("That card costs " + str(player_choice_str) + " and you only have " + str(mana_bank) + " this round.")        pick_card()    if int(player_choice_str) <= mana_bank:        player_choice.append(player_choice_str)        return player_choiceplayer_hand = [4, 8, 8]mana_bank = 4print(pick_card())
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

您的第一个问题是player_choice在本地定义的。它将在每次函数调用中被覆盖。此外,在玩家选择大于 manabank 的情况下,您必须评估/返回 pick_card() 的返回值。否则递归的第一个调用函数将None由于缺少返回值而返回。



查看完整回答
反对 回复 2022-12-20
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

在您的 for 循环中,您有两个条件 -if i <= mana_bank:并且if not i <= mana_bank:对于任何给定的条件i之一都是如此。


因此,您的循环会在遇到大于mana_bank且不会检查所有卡片的卡片时立即停止。


你想要做的是:


for i in player_hand:

    if i <= mana_bank:

        print(player_hand, mana_bank, "Mana available type the name of the card you wish to play ... ")

        player_choice_str = input()

        break

if player_choice_str is 0:             # no card selected at the end of the loop

    return "You don't have enough mana to play a card."

此外,您可能希望在此行之后验证用户输入,player_choice_str = input()以检查他们输入了有效的卡。


查看完整回答
反对 回复 2022-12-20
  • 2 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信