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

我正在尝试编写一个执行以下操作的函数:


如果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_choice




player_hand = [4, 8, 8]

mana_bank = 4


print(pick_card())


忽然笑
浏览 376回答 2
2回答

慕斯709654

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

哆啦的时光机

在您的 for 循环中,您有两个条件 -if i <= mana_bank:并且if not i <= mana_bank:对于任何给定的条件i之一都是如此。因此,您的循环会在遇到大于mana_bank且不会检查所有卡片的卡片时立即停止。你想要做的是:for i in player_hand:&nbsp; &nbsp; if i <= mana_bank:&nbsp; &nbsp; &nbsp; &nbsp; print(player_hand, mana_bank, "Mana available type the name of the card you wish to play ... ")&nbsp; &nbsp; &nbsp; &nbsp; player_choice_str = input()&nbsp; &nbsp; &nbsp; &nbsp; breakif player_choice_str is 0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# no card selected at the end of the loop&nbsp; &nbsp; return "You don't have enough mana to play a card."此外,您可能希望在此行之后验证用户输入,player_choice_str = input()以检查他们输入了有效的卡。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python