Что бы вы порекомендовали для розыгрыша блэкджека?

Я новичок, и мне было поручено (в рамках курса) создать игру в блэкджек.

Мой исходный код можно найти ниже. Часть, с которой я застрял, - это когда я добираюсь до класса Deck и должен создать метод Deal. Я борюсь с тем, как раздать первые четыре карты, удалить их из доступных в колоде (для будущих попаданий), а затем сохранить их как переменные для фактической руки игрока в предстоящем классе. Цените помощь!

import random

suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')
ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')
values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,
         'Queen':10, 'King':10, 'Ace':11}

playing = True

class Card:

    def __init__(self,suit,rank,value):
        self.suit = suit
        self.rank = rank
        self.value = value

    def __str__(self):
        print(f'{rank} of {suit}')


class Deck:

    def __init__(self):
        self.deck = []  # start with an empty list
        for suit in range(len(suits)):
            for rank in range(len(ranks)):
                self.deck += [(suits[suit],values[ranks[rank]])]

    def __str__(self):
        return f'{self.deck}'

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

    def deal(self):
        ?????


person vince    schedule 25.05.2020    source источник
comment
Вы забыли опубликовать, какую часть deal вы уже проработали.   -  person Scott Hunter    schedule 25.05.2020
comment
Я действительно не знаю, с чего начать, если честно. Единственное, что я могу предположить, это то, что в какой-то момент у меня где-то там будет del self.deck[0:3]   -  person vince    schedule 25.05.2020


Ответы (1)


Мое предложение состояло бы в том, чтобы функция deal просто открывала и возвращала одну карту, так как вы будете делать это часто, когда игрокам нужно попасть:

def deal(self) -> Card:
    return self.deck.pop()

Затем, чтобы сгенерировать две руки из двух карт, вы можете сделать:

player_hand, dealer_hand = ([deck.deal() for _ in range(2)] for _ in range(2))

или возможно:

def deal_starting_hand(deck: Deck) -> List[Card]:
    """Deals a starting hand of two cards."""
    return [deck.deal() for _ in range(2)]

deck = Deck()
players = ["Player 1", "Dealer"]
player_hands = {player: deal_starting_hand(deck) for player in players}

и т.п.


Если вы действительно хотите иметь одну функцию, которая возвращает четыре карты, и вы не хотите делать это, выталкивая итеративно, вы можете сделать:

four_cards = self.deck[:4]
self.deck = self.deck[4:]
return four_cards

но IMO лучше (с точки зрения обучения и удобочитаемости) сначала иметь меньшую более простую функцию, а затем использовать ее для создания более крупных вещей.

person Samwise    schedule 25.05.2020
comment
Используя ваш ответ, я сделал следующее: ``` def Deal(self): self.playerhand = [] self.dealerhand = [] for x in range(5): if x%2 != 0: self.playerhand. append(self.deck.pop(0)) else: self.dealerhand.append(self.deck.pop(0)) ``` Мысли? - person vince; 25.05.2020
comment
Наличие двух рук в качестве атрибутов Deck кажется немного запутанным — как только карты оказываются в руках игроков, их больше нет в колоде, верно? Может быть, должен быть класс Game, который использует Deck и Cards? Также обратите внимание, что range(5) означает, что вы сдаете пять карт, поэтому playerhand будет иметь три карты! - person Samwise; 25.05.2020