Продолжить основной цикл while изнутри вложенного цикла while в Python3.7 - PullRequest
0 голосов
/ 20 февраля 2019

Я решил сделать игру в блэкджек, у меня она закончена, единственная проблема, с которой я столкнулся, это то, что иногда, когда вы решаете играть снова, программа использует одно и то же значение для переменных.Я почти уверен, что я изолировал проблему с вложенными циклами while, мой код можно найти здесь: https://pastebin.com/9zr9qCU6 Я попытался заставить функцию resetGame() возвращать пустые объекты списка для dealer_hand иplayer_hand но это тоже не исправило, есть ли способ продолжить основной цикл while из этих вложенных циклов while?или мне пришлось бы реорганизовать каждый вложенный цикл while в отдельную функцию?

код:

# Blackjack
import random
from card_deck import Deck
from time import sleep
from sys import exit

d = Deck()
deck_of_cards = d.deck_return()
print('*' * 30)
print('*  Welcome to BlackJack!  *')
print('*    Made by: p0seidon    *')
print('*' * 30)


def shuffleDeck(deck):
    random.shuffle(deck)
    random.shuffle(deck)
    random.shuffle(deck)
    return deck


def dealCard(shuffled_deck):
    return random.sample(shuffled_deck, k=2)


def removeFromDeck(hand1, hand2):
    global deck_of_cards
    for x in hand1:
        deck_of_cards.remove(x)

    for x in hand2:
        deck_of_cards.remove(x)


def hit(deck_to_hit):
    return random.choice(deck_to_hit)


def endGame():
    print('Thanks for playing!\n'
          'Better luck next time!')
    sleep(3)
    exit()


def restartGame():
    restart = ''
    restart_list = ['y', 'n']
    while restart not in restart_list:
        restart = input('Would you like to play again? [y/n]: ')

    return restart


def resetGame():
    global deck_of_cards
    print('Loading new deck.\n'
          'Please wait...')
    sleep(3)
    deck_of_cards = d.deck_return()
    return deck_of_cards


play_again = 'y'
while play_again == 'y':
    # shuffles and deals 2 cards to dealer and player
    ready_deck = shuffleDeck(deck_of_cards)
    dealer_hand = dealCard(ready_deck)
    player_hand = dealCard(ready_deck)

    # removes the cards in players hand from the deck, making the game a little more life-like
    removeFromDeck(dealer_hand, player_hand)

    # checks to see if dealer won in the first hand
    if sum(dealer_hand) == 21:
        print('Dealer\'s first hand is', dealer_hand, 'totaling 21.\n'
                                                      'You lose!')
        play_again = restartGame()
        if play_again == 'y':
            deck_of_cards = resetGame()
            continue
        elif play_again == 'n':
            endGame()

    # check to see if player won or busted in the first hand
    if sum(player_hand) == 21:
        print('You win with the initial hand of', player_hand, '\n'
                                                               'CONGRATULATIONS!')
        play_again = restartGame()
        if play_again == 'y':
            deck_of_cards = resetGame()
            continue
        elif play_again == 'n':
            endGame()
    elif sum(player_hand) > 21:
        print('Looks like you busted in your first hand consisting of', player_hand, '\n'
                                                                                     'Better luck next time!')
        play_again = restartGame()
        if play_again == 'y':
            deck_of_cards = resetGame()
            continue
        elif play_again == 'n':
            endGame()

    # shows only one of the dealers card at random and shows the player his hand
    print('DEBUG: dealers hand:', dealer_hand)
    # print('Dealer has', dealer_hand[random.randint(0, 1)], 'the other card is hidden')
    print('You have', player_hand)

    # sums the cards in players hand and dealers hand
    player_sum = sum(player_hand)
    dealer_sum = sum(dealer_hand)

    # player logic
    while player_sum < 21:
        choice = input('Would you like to hit or stay (h/s)?: ')
        if choice == 'h':
            new_player_card = hit(ready_deck)
            player_hand.append(new_player_card)
            print('Current hand:', player_hand)
            player_sum += new_player_card
            if player_sum == 21:  # player wins on hit
                print('You win!\n'
                      'Winning hand:', player_hand)
                play_again = restartGame()
                if play_again == 'y':
                    deck_of_cards = resetGame()
                elif play_again == 'n':
                    endGame()
            elif player_sum > 21:  # player busts on hit
                print('looks like you went overboard. Your final hand was:', player_hand)
                play_again = restartGame()
                if play_again == 'y':
                    deck_of_cards = resetGame()
                    continue
                elif play_again == 'n':
                    endGame()
        elif choice == 's':
            print('You locked in at', player_sum)
            sleep(2)
            break

    # dealer logic
    while dealer_sum < 17:
        print('Dealers hand:', dealer_hand)
        print('Dealer hits..')
        sleep(1)
        new_dealer_card = hit(ready_deck)
        dealer_hand.append(new_dealer_card)
        sleep(0.5)
        dealer_sum += new_dealer_card
        if dealer_sum > 21:  # dealer busts on hit
            print('Dealer has busted!\n'
                  'You Win!')
            print('Dealers losing hand:', dealer_hand)
            play_again = restartGame()
            if play_again == 'y':
                deck_of_cards = resetGame()
                continue
            elif play_again == 'n':
                endGame()
        elif 17 < dealer_sum <= 21:  # dealer stays
            print('Dealers hand:', dealer_hand)
            print('Dealer stays..')
            sleep(1)
            break

    # compares player sum with dealer sum to determine who won
    if player_sum > dealer_sum:
        print('You win!\n'
              'Your winning hand:', player_hand, '\n'
                                                 'Dealers losing hand:', dealer_hand)
        play_again = restartGame()
        if play_again == 'y':
            deck_of_cards = resetGame()
            continue
        elif play_again == 'n':
            endGame()
    elif dealer_sum > player_sum:
        print('Looks like you were unlucky this time...Dealer won..\n'
              'Dealer winning hand:', dealer_hand)
        play_again = restartGame()
        if play_again == 'y':
            deck_of_cards = resetGame()
            continue
        elif play_again == 'n':
            endGame()
    elif player_hand == dealer_hand:
        print('Its a tie!')
        sleep(0.5)
        print('Your hand:', player_hand)
        sleep(0.5)
        print('Dealers hand:', dealer_hand)
        sleep(0.5)
        play_again = resetGame()
        if play_again == 'y':
            deck_of_cards = resetGame()
            continue
        elif play_again == 'n':
            endGame()
`

1 Ответ

0 голосов
/ 20 февраля 2019

есть ли способ продолжить основной цикл while из этих вложенных циклов while?

Нет.Смотрите, Python doc , continue всегда ограничивает самый внутренний цикл.

Должен ли я рефакторинг каждого вложенного цикла while в отдельную функцию?

Да.Так-то лучше.Я устал читать твой код, потому что он слишком длинный, чтобы быстро его понять.Лучшим примером для вашей проблемы было бы следующее:

def play():
    while your_condition:
        while another_condition:
            pass # do something
            yesno = input("yes or no?")
            if yesno == "y":
                return True

terminate = False
while not terminate:
    terminate = play()

Используя return, вы найдете способ break или continue внешнего цикла из внутреннего цикла.

...