Проблема Сдача карточного объекта в руку игрока в Блэкджек - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь разработать простую игру в Блэкджек с Python. Я нахожусь на стадии, когда я хочу раздать одну карту руке дилера (список в классе дилера) и руке игрока (a список в классе игрока). Когда я общаюсь с дилером, проблем не возникает, однако у меня есть игроки, которые находятся в списке playerSet, я использую для l oop, чтобы вытолкнуть карту из колоды и добавить ее в руку каждого игрока. Проблема в том, что каждый раз, когда я пытаюсь присоединить руку одного игрока, карты дублируются на руку каждого игрока.

Вот соответствующий код:

def DealCards():
    global BlackJackDeck
    Dealer1.addToHand(BlackJackDeck.drawCard())
    #Would love to know why same card is ent to both decks
    for i in range(0,len(playerSet)):
        playerSet[i].addToHand(BlackJackDeck.drawCard())
        break

Это ничья метод, расположенный в классе колоды

def drawCard(self):
        #may need to change this method
        return self.Deck.pop()

С точки зрения класса игрока, это то, как рука объявляется в виде списка

class player(object):
    name = None
    Token = int(500)
    score = 0
    bet = 0
    hand = []

    def __init__(self,name):
        self.name = name

Этот метод используется для добавления карты в рука игрока - список в классе игрока

def addToHand(self,card):
        if isinstance(card,Card):
                self.hand.append(card)
        else: 
            print("This is not a Card..")

Колода Блэкджек - это просто экземпляр класса колоды, который я добавлю ниже

BlackJackdeck =Deck()


from Card import Card
import random

class Deck():
    Deck=[]
    def __init__(self):
         self.Deck =[]
         self.build()

    def build(self):

        for s in ["Hearts", "Spades", "Diamonds","Clubs"]:
            for v in range(1,14):
                if v>10:
                    for royalty in ["Jack","Queen", "King"]:
                        self.Deck.append(Card("{} of {}".format(royalty,s),s,10))
                    break
                else:
                    self.Deck.append(Card("{} of {}".format(v,s),s,v))

    def view(self):
        for view in self.Deck:
            #view.printer()
            #print("{} of {} ".format(view.value, view.suit))
            print("{}".format(view.name))

    def drawCard(self):
        #may need to change this method
        return self.Deck.pop()


    def shuffle(self):
        random.shuffle(self.Deck)


    def returnHand(self,playerHand=[]):
        if len(self.Deck)>52:
            print(f"Player hand couldn't be added there are too many cards in the deck {playerHand}")
        elif len(self.Deck)+len(playerHand)<=52:
            self.Deck.append(playerHand)

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

1 Ответ

0 голосов
/ 15 апреля 2020

Может быть, вы можете показать больше кода? В частности, как инициализируется BlackJackDeck. Кроме того, как инициализируются руки игроков? Я обновлю этот ответ, как только мы получим больше информации. На данный момент трудно сказать, что происходит, не видя больше.

Однако, эта вещь не привлекла мое внимание: list.pop принимает необязательный целочисленный параметр, который он обрабатывает как индекс для извлечения. То, как написан ваш код, кажется, что у вас сложилось впечатление, что это число представляет количество элементов, которые вы sh извлечете, что неверно. Поэтому, когда вы говорите BlackJackDeck.drawCard(1), вы выталкиваете и возвращаете карту с индексом 1 (вторая карта). Если вы говорите BlackJackDeck.drawCard(5), вы не выталкиваете пять карточек из колоды, вы выталкиваете одну карточку - карточку с индексом 5 (шестая карточка).

РЕДАКТИРОВАТЬ - Спасибо за публикацию большего количества кода , Основная проблема, которая сразу бросается в глаза, заключается в том, что рука каждого игрока не является переменной экземпляра, это переменная класса (stati c). Посмотрите на этот фрагмент, который предназначен для имитации структуры вашего кода прямо сейчас:

class Player:
    hand = []

    def __init__(self, name):
        self.name = name

    def add_card_to_hand(self, card):
        self.hand.append(card)


player_1 = Player("Bob")
player_2 = Player("Tom")

player_1.add_card_to_hand("Ace of Spades")
player_2.add_card_to_hand("Queen of Hearts")

print(f"{player_1.name}'s hand: {player_1.hand}")
print(f"{player_2.name}'s hand: {player_2.hand}")

Вывод:

Bob's hand: ['Ace of Spades', 'Queen of Hearts']
Tom's hand: ['Ace of Spades', 'Queen of Hearts']
>>> 

hand - это единственный список в памяти, который используется всеми экземплярами Player, потому что это переменная класса. Поэтому, если вы вызываете add_card_to_hand, независимо от того, на какой объект игрока вы ссылаетесь, вы в конечном итоге добавляете в тот же список. Что вам действительно нужно, так это отдельный список для каждого игрока, поэтому hand должна быть переменной экземпляра, например:

class Player:

    def __init__(self, name):
        self.hand = []
        self.name = name

    def add_card_to_hand(self, card):
        self.hand.append(card)


player_1 = Player("Bob")
player_2 = Player("Tom")

player_1.add_card_to_hand("Ace of Spades")
player_2.add_card_to_hand("Queen of Hearts")

print(f"{player_1.name}'s hand: {player_1.hand}")
print(f"{player_2.name}'s hand: {player_2.hand}")

Вывод:

Bob's hand: ['Ace of Spades']
Tom's hand: ['Queen of Hearts']
>>> 

Я посмотрю на остальной код, который вы разместили в бит. Если я увижу что-нибудь еще, я обновлю этот пост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...