Member 13804004 Ответов: 2

Python запускает функцию без моего вызова


если вы сделали простую игру в блэкджек на python смотрите здесь:
import random
deckOfCards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
playerHand = []
computerHand = []

def testWin():
    if sum(playerHand) == sum(computerHand):
        print("Draw")
    elif sum(playerHand) == 21:
        print("Blackjack! You win")
    elif sum(computerHand) == 21:
        print("Computer has blackjack you lose")

    if sum(playerHand) > 21:
        if sum(computerHand) < 21:
            print("You lost")
        elif sum(computerHand) > 21:
            print("Draw")
    elif sum(computerHand) > 21:
        if sum(playerHand) < 21:
            print("You win")
        elif sum(playerHand) > 21:
            print("Draw")
    elif sum(playerHand) < 21:
        if sum(computerHand) > 21:
            print("You win!")
        elif sum(computerHand) < 21 and sum(computerHand) < sum(playerHand):
            print("You win")
        elif sum(computerHand) < 21 and sum(computerHand) > sum(computerHand):
            print("You lose")


def drawPlayerCard():
        playerHand.append(deckOfCards[random.randint(0, 9)])
        print("Your Cards are:", playerHand)
        print("total:", sum(playerHand), "\n")
        if len(playerHand) < 2:
            drawPlayerCard()
        drawComputerHand()


def drawComputerHand():
    if sum(computerHand) <= 17:
        computerHand.append(deckOfCards[random.randint(0, 9)])
        print("the computer has:", computerHand)
        print("total:", sum(computerHand), "\n")
        if len(computerHand) < 2:
            drawComputerHand()
        hit_stand()
    else:
        print("the computer stands with a total of:", sum(computerHand))
        hit_stand()


def hit_stand():
        option = input("do you want to hit or stand? [h/s]")
        if option.lower() == "h":
            drawPlayerCard()
        elif option.lower() == "s":
            testWin()
        else:
            print("please say if you want to hit or stand!")
            hit_stand()


def start():
    start_gaming = input("Do you want to play Blackjack? [y/n]")
    if start_gaming == "y":
        drawPlayerCard()
    elif start_gaming == "n":
        pass
    else:
        print("please state if you want to start the game")
        start()


start()

и все работает так, как задумано, пока я не встану, чем он ведет себя действительно странно. я не знаю, как я мог бы это объяснить, так что это просто покажет это:
Цитата:
Хотите поиграть в блэкджек? [y/n]y
Ваши карты таковы: [9]
итого: 9

Ваши карты: [9, 6]
итого: 15

компьютер имеет: [8]
итого: 8

компьютер имеет: [8, 10]
итого: 18

вы хотите ударить или стоять? [h/s]h
Ваши карты: [9, 6, 9]
итого: 24

компьютер стоит в общей сложности: 18
вы хотите ударить или стоять? [h/s]s
Ты проиграл
вы хотите ударить или стоять? [h/s]s
Ты проиграл
компьютер стоит в общей сложности: 18
вы хотите ударить или стоять? [h/s]s
Ты проиграл

похоже, что python вызывает функцию drawComputerHand и функцию hit_stand 3 раза, но я не вижу, откуда она берется и как ее исправить.
поэтому если кто то видит проблему не могли бы вы объяснить ее и предложить способ исправить
извините за возможно плохой и неэффективный код но я новичок и все еще пытаюсь учиться
<pre lang="Python"><pre lang="Python"><pre lang="Python">


Что я уже пробовал:

я смотрел на свой код в течение 2 часов, я искал в google, были ли у людей те же проблемы и исправления, я опубликовал проблему на stackoverflow, но я не мог получить ответ, и теперь я пытаюсь здесь

2 Ответов

Рейтинг:
9

Richard MacCutchan

Похоже, у вас там есть рекурсивный цикл. Вы звоните hit_stand, который вызывает drawPlayerCard, который вызывает drawComputerHand, который затем вызывает hit_stand снова. Я думаю, что ваша логика нуждается в небольшой работе.


Рейтинг:
0

Patrice T

Цитата:
я смотрел на свой код в течение 2 часов

А как насчет наблюдения за выполнением кода ?
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.