Что бы вы посоветовали разыграть комбинацию блэкджек? - PullRequest
2 голосов
/ 25 мая 2020

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

Мой исходный код можно найти ниже. Часть, на которой я застрял, - это когда я перехожу к классу 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):
        ?????

1 Ответ

3 голосов
/ 25 мая 2020

Я бы предложил, чтобы функция 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}

et c.


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

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

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

...