Почему изменение аргумента функции отражается на основном значении, которое я передал этой функции?

Я попытался создать игру BLACKJACK, используя python (на самом деле я изучаю python). В настоящее время я не установил команду ставки (она написана в моем классе Account). Я беру имя только из своего класса Account.

У меня есть главный файл: blackjack.py и два класса в файлах: deckofcards.py, account.py. Я получаю доступ только к имени из класса учетной записи, поэтому я не буду помещать здесь этот длинный беспорядок.

blackjack.py:

from account import Account

player = Account('kalaLokia')
cards = DeckOfCards()
play = False
playershand = []
dealershand = []
action = ''
blackjack = False


def showCards(items, name):
    '''
    Shows {name}'s cards and hand value
    '''
    print(f"{name}'s hand: ")
    print(f"\t{' - '.join(items)}")
    print(f"Hand value: {cards.handValue(items)}")


def bust(hand):
    '''
    Whether a someone has busted or not
    '''
    if(cards.handValue(hand) > 21):
        return True
    return False


def dealersMove():
    '''
    Dealers move: executes when player calls "stand"
    Dealer perform hit until he gets bust, wins or his hand value becomes >= 17
    When hand value is >17 and players has greater value, dealer loses ;-)
    '''
    global blackjack

    if(cards.handValue(dealershand) == 21):
        print('Dealer got a BLACKJACK')
        print('Dealer WINS')
        return
    elif(blackjack):
        print(f'{player.name} got a BLACKJACK')
        print(f'{player.name} WINS')
        blackjack=False
        return

    while(not bust(dealershand)):

        if(cards.handValue(dealershand) > cards.handValue(playershand)):
            print('Dealer WINS')
            showCards(dealershand, 'Dealer')
            break
        elif(cards.handValue(dealershand) == cards.handValue(playershand)):
            print("It's a TIE!!\n Dealer WINS")
            break
        elif(cards.handValue(dealershand) > 17):
            print(f'Dealer loses\n{player.name} has WON.')
            print(f'{cards.handValue(playershand)} > {cards.handValue(dealershand)}')
            break

        dealershand.append(cards.hit())
    else:
        print(f'Dealer busts! \n{player.name} has WON the game.')


def start():
    '''
    The actiona that can be performed
    '''
    global blackjack

    if(cards.handValue(playershand) == 21): 
        blackjack = True
        dealersMove()
        return
    while(not bust(playershand)):

        action = input(
            f"{player.name}'s turn: Do you want to hit or stand ? ").lower()
        if(action == 'hit'):
            playershand.append(cards.hit())
            showCards(playershand, player.name)
        elif(action == 'stand'):
            dealersMove()
            break
        else:
            print('Please enter a valid action !')
    else:
        print(f'{player.name} has been BUSTED')


if __name__ == "__main__":

    print(f'Hello {player.name}, Welcome to BlackJack Game')
    # Tell game rules here, may be
    response = input('Do you want to start the game (Y/n)? ').lower()
    if(response != 'y'):
        play = False
        print('You have been exited the game')
    else:
        play = True
    # Ask for bet amount later
    while(play):
        cards = DeckOfCards()
        cards.shuffle()
        print('Cards on the table is now shuffled')
        playershand = list(cards.initiate())
        dealershand = list(cards.initiate())
        print(
            f"{player.name}'s hand:\n   {playershand[0]} - {playershand[1]}\nHand value: {cards.handValue(playershand)}\n")
        print(f"Dealer's hand:\n   {dealershand[0]} - ?\n")

        start()

        if(input('Do you want to play again (Y/n)?').lower() != 'y'):
            print('The End')
            play = False

deckofcards.py:

import random

class DeckOfCards():
    '''
    All talks here is about cards
    '''
    cards = {'A':11,'K':10,'Q':10,'J':10,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10}

    def __init__(self):
        '''
        Initialize deck of cards
        '''
        self.deck = list(self.cards.keys())*4

    def shuffle(self):
        '''
        Simply shuffles the deck of cards
        '''
        return random.shuffle(self.deck)

    def handValue(self, hand):
        '''
        Calculates and returns the hand value, expecting a string value to be feeded.
        '''
        result = 0

        for element in hand:
            result = result + self.cards[element]

        while('A' in hand and result > 21):
            if(hand[0]=='A'):
                result = result - 10
            # Somehow this hand.pop is poping out from main value itself. Why ???
            hand.pop(0)

            if(hand == []):
                break  

        return result

    def hit(self):
        '''
        Pop out and returns the last card in the deck
        '''
        return self.deck.pop()

    def initiate(self):
        '''
        Pop out 2 cards from the deck and return as a tuple
        '''
        return (self.deck.pop(), self.deck.pop() )

Проблема:
когда у меня в руке ACE и значение моей руки больше 21, условие while выполняется вhandValueфункция (которая находится в классе DeckofCards) как есть. Проблема в том, что после этогоwhile условие выполняется, playershand (объявлено в основном файле) Я только что перешел к этомуhandValueфункция становится пустой. Этоhand.pop(0) на самом деле кажется, что значение выскакивает из основного объекта playershand сам (мне так кажется).

Когда я нажимаю удар после этого, я получаю одну новую карту, все остальные карты выскакивают. Я не понимаю, почему это так.

При попадании (пользователь вводит попадание): на самом деле я прохожу playershand (карты на руке игрока, это список) для работы showCards (который также находится в основном файле), где он принимает его как элементы аргумента и передает его вhandValue функция в классе DeckOfCards.

Так почему это происходит? даже если я передаю playerhand в качестве аргумента другим функциям, как функция pop() влияет на playerhand, которая имеет доступ только к объекту hand в классе handValue?

У меня есть полный код в репозитории github для тестирования, файлы в папке blackjack

0 ответов

Другие вопросы по тегам