Как создать игру в блэкджек как симуляцию между двумя игроками?

Я изо всех сил пытался понять, как преобразовать эту программу в программу для двух игроков, а не только для меня и дилера. Должен ли он каким-то образом зацикливаться, давая первую итерацию цикла игроку 1, а другую - игроку 2? Я не совсем уверен, как заставить его работать.

def main():
    deck = create_deck()

    num_cards = int(input('How many cards should I deal? '))

    deal_cards(deck, num_cards)

def create_deck():
    deck = {'Ace of Spades':1, '2 of Spades':2, '3 of Spades':3, 
            '4 of Spades':4, '5 of Spades':5, '6 of Spades':6, 
            '7 of Spades':7, '8 of Spades':8, '9 of Spades':9, 
            '10 of Spades':10, 'Jack of Spades':10, 
            'Queen of Spades':10, 'King of Spades': 10, 
            'Ace of Hearts':1, '2 of Hearts':2, '3 of Hearts':3, 
            '4 of Hearts':4, '5 of Hearts':5, '6 of Hearts':6, 
            '7 of Hearts':7, '8 of Hearts':8, '9 of Hearts':9, 
            '10 of Hearts':10, 'Jack of Hearts':10, 
            'Queen of Hearts':10, 'King of Hearts': 10, 'Ace of Clubs':1,
            '2 of Clubs':2, '3 of Clubs':3, '4 of Clubs':4, '5 of Clubs':5,
            '6 of Clubs':6,'7 of Clubs':7, '8 of Clubs':8, '9 of Clubs':9,
            '10 of Clubs':10, 'Jack of Clubs':10,
            'Queen of Clubs':10, 'King of Clubs': 10,
            'Ace of Diamonds':1, '2 of Diamonds':2, '3 of Diamonds':3, 
            '4 of Diamonds':4, '5 of Diamonds':5, '6 of Diamonds':6, 
            '7 of Diamonds':7, '8 of Diamonds':8, '9 of Diamonds':9, 
            '10 of Diamonds':10, 'Jack of Diamonds':10, 
            'Queen of Diamonds':10, 'King of Diamonds': 10}

    return deck

def deal_cards(deck, number):
    hand_value = 0

    if number > len(deck):
        number = len(deck)

    for count in range(number):
        card, value = deck.popitem()
        print(card)
        hand_value += value

        print('Value of this hand:', hand_value)

main()

person Nitsuga Arashi    schedule 20.07.2016    source источник
comment
вы не включили код, о котором спрашивали ... Мясо и картофель в этом примере, на который вы смотрите, скорее всего, находятся в функции main()   -  person Aaron    schedule 21.07.2016
comment
Не совсем понимаю, что вы имеете в виду, я изо всех сил пытался понять, как преобразовать эту программу в программу для двух игроков, а не только для меня и дилера. Это то, что я сказал.   -  person Nitsuga Arashi    schedule 21.07.2016
comment
Это проблема - каков ваш конкретный вопрос по программированию? Я не уверен, как заставить его работать - это не вопрос, на который можно ответить.   -  person takendarkk    schedule 21.07.2016


Ответы (2)


Предлагаю попробовать что-то вроде этого:

import random

deck = {'Ace of Spades':1, '2 of Spades':2, '3 of Spades':3,
        '4 of Spades':4, '5 of Spades':5, '6 of Spades':6,
        '7 of Spades':7, '8 of Spades':8, '9 of Spades':9,
        '10 of Spades':10, 'Jack of Spades':10,
        'Queen of Spades':10, 'King of Spades': 10,
        'Ace of Hearts':1, '2 of Hearts':2, '3 of Hearts':3,
        '4 of Hearts':4, '5 of Hearts':5, '6 of Hearts':6,
        '7 of Hearts':7, '8 of Hearts':8, '9 of Hearts':9,
        '10 of Hearts':10, 'Jack of Hearts':10,
        'Queen of Hearts':10, 'King of Hearts': 10, 'Ace of Clubs':1,
        '2 of Clubs':2, '3 of Clubs':3, '4 of Clubs':4, '5 of Clubs':5,
        '6 of Clubs':6,'7 of Clubs':7, '8 of Clubs':8, '9 of Clubs':9,
        '10 of Clubs':10, 'Jack of Clubs':10,
        'Queen of Clubs':10, 'King of Clubs': 10,
        'Ace of Diamonds':1, '2 of Diamonds':2, '3 of Diamonds':3,
        '4 of Diamonds':4, '5 of Diamonds':5, '6 of Diamonds':6,
        '7 of Diamonds':7, '8 of Diamonds':8, '9 of Diamonds':9,
        '10 of Diamonds':10, 'Jack of Diamonds':10,
        'Queen of Diamonds':10, 'King of Diamonds': 10}

def value(hand):
    hand_value = 0
    for i in hand:
        hand_value += deck[i]
    return hand_value


def main():
    keys = list(deck)
    random.shuffle(keys)

    player1_hand = []
    player2_hand = []
    #dealing to player 1
    while True:
        print ("Player 1's hand is ", player1_hand, "The value is ", value(player1_hand))
        response = int(input('How many cards should I deal to player1? '))
        if response == 0:
            break
        else:
            for i in range(int(response)):
                player1_hand.append(keys.pop())
    #dealing to player 2
    while True:
        print ("Player 2's hand is ", player2_hand, "The value is ", value(player2_hand))
        response = int(input('How many cards should I deal to player2? '))
        if response == 0:
            break
        else:
            for i in range(int(response)):
                player2_hand.append(keys.pop())
    print (player1_hand, value(player1_hand))
    print (player2_hand, value(player2_hand))
if __name__ == "__main__":
    main()

Некоторые изменения: 1) Функция create_deck не нужна, потому что она просто возвращает неизменную переменную, поэтому она была удалена. 2) В колоде используется random.shuffle, чтобы игра не всегда была одинаковой. 3) Добавлен if name == main. Это простая формулировка, в которой игрок 1 получает столько карт, сколько хочет, а игрок 2 делает то же самое. Вы можете перебирать циклы раздачи while или написать какую-нибудь отдельную функцию, чтобы указать количество раундов. Вы также можете попробовать напечатать много символов новой строки после того, как игрок закончит раздавать карты, чтобы другой игрок не мог видеть, что ему было роздано.

person Sarthax    schedule 20.07.2016
comment
Мне было интересно, как реализовать random в моем старом коде. По какой-то причине, когда я это сделал, вещь не заработала, когда я ее тестировал. Я не думал о сохранении значений в виде отдельных словарей для каждого игрока. Спасибо. Это значительно упрощает понимание. - person Nitsuga Arashi; 21.07.2016
comment
Я протестировал код, и по какой-то причине я не могу добраться до второго игрока, он работает только с первым игроком, а затем зацикливается. - person Nitsuga Arashi; 21.07.2016
comment
Он перейдет ко второму игроку, если первый игрок запросит раздачу 0 карт. Это проверка if response == 0: break. Ввод для «ответа» можно изменить на что-то вроде «Вы хотите еще одну карту (да / нет)?» и при ответе «да» игрок получает одну карту, а при ответе «нет» цикл прерывается. - person Sarthax; 21.07.2016

Код, который вы разместили, обрабатывает только указанное пользователем количество карт (кстати, они не раздаются случайным образом), суммирует их значение и завершает работу. Если вы хотите, чтобы эта игра постоянно раздавала карты, вам нужно добавить цикл в основную функцию, примерно так:

def main():
    deck = create_deck()
    while True:

        num_cards = int(input('How many cards should I deal? '))

        deal_cards(deck, num_cards)

Обратите внимание, что это не будет суммировать карты между сделками. Для этого вам нужно создать переменную типа p1 или p2 в основной функции и передать ее в deal_cards. Я не совсем уверен, что вы этого хотите.

person Arctic Tern    schedule 20.07.2016
comment
Спасибо, это укажет мне правильное направление. Если я импортирую случайные числа, смогу ли я раздать карты случайным образом? - person Nitsuga Arashi; 21.07.2016
comment
см. stackoverflow.com/questions/4809044/ о том, как поступать случайным образом - person Arctic Tern; 21.07.2016