Попытка объединить список в подсписки для игроков в игре в блэкджек, используя python - PullRequest
0 голосов
/ 08 марта 2020

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

shuffled_deck = [['A', '♦'], ['6', '♣'], ['2', '♥'], ['Q', '♦'], ['K', '♦'], ['3', '♠'], ['8', '♠'], ['9', '♠']]

players = [[1], [2], [3], [4]]

желаемый результат >>

[[['A', '♦'], ['K', '♦']], [['6', '♣'], ['3', '♠']], [['2', '♥'], ['8', '♠']], [['Q', '♦'], ['9', '♠']]]

Это просто раздача двух карт 4 игрокам, как в блэкджеке. Я могу создать его, используя это:

#EXAMPLE 1    
for i in range(0,4):
    players[i] = [shuffled_deck[i]]

for j in range(0,4):
    players[j].append(shuffled_deck[j+4])

Но я хотел бы сделать это с чем-то вроде этого, но не могу понять, как.

count = 0
people = []

def combine_2_cards(people=[], count=count):
    while count < 8:
        people.append(shuffled_deck.pop(0))
        count += 1 
        return combine_2_cards(people, count)
    return people

players = combine_2_cards(people, count)

, который просто создает оригинальный список карт shuffled_cards. Может быть, есть даже лучший способ?

Мне нужно, чтобы он добавлялся, как в желаемом выводе.

Ответы [ 3 ]

0 голосов
/ 08 марта 2020

Вы можете использовать slice(i, None, x), чтобы получить каждый x-й элемент, начиная с i-го элемента.

Например,

[shuffled_deck[slice(i, None, 4)] for i in range(4)]

будет сдавать перетасованную колоду до 4 игроков, в соответствии с желаемым выходом. Второй аргумент slice может использоваться для управления тем, какую колоду вы хотите разыграть (здесь None, чтобы перетасовать всю колоду).

Вот более общая функция.

def deal(deck, n_players, n_cards=None):
    """Deals a deck to players.

    Args:
        n_players (int): Number of players.
        n_cards (int): Number of cards from the deck to deal.

    Returns:
        A list containing the hands for each player.

    """
    return [deck[slice(i, n_cards, n_players)] for i in range(n_players)]

Если у вас есть список, содержащий количество игроков, вы можете использовать

players = deal(shuffled_deck, len(players))

, чтобы раздать им новую руку.

0 голосов
/ 08 марта 2020

Большое спасибо @pidgeyUsedGust и @Fibi. Хотя я еще не работал с пониманиями, я думаю, что теперь я могу лучше понять их суть. Я также дважды запустил свою функцию и создал желаемый результат примерно так:

players = [[], [], [], []]
count = 0
people = []

def combine_2_cards(people=[], count=count): 
    while count < 4:
        players[count].append(shuffled_deck.pop(0))
        count += 1
        return combine_2_cards(players, count)
    return people


players = combine_2_cards(people, count)
players = combine_2_cards(people, count)
0 голосов
/ 08 марта 2020

Как это работает: во-первых, базовый случай рекурсии - это когда карты пусты, вместо класса c «if (basecase) else (do stuff)» мы проверяем, не является ли список карт пустым, мы заполняем игроков

как игроки заполняются: вытолкнуть 2 карты из списка cards, когда i равен 0, вытолкнуть первый элемент, когда i равен 1, вытолкнуть среднюю карту, а затем добавить обе карты в список карт как список

делайте это снова и снова, пока мы не достигнем базового варианта.

def combine_2_cards(players, cards):
    if cards: 
        # assign 2 cards to 1 players 
        current_cards = [card for card in [cards.pop(0 if i % 2 == 0 else len(cards) // 2) for i in range(2)]]
        players.append(current_cards)
        combine_2_cards(players, cards)
    return players

print(combine_2_cards([], shuffled_deck))
# prints: [[['A', '♦'], ['K', '♦']], [['6', '♣'], ['3', '♠']], [['2', '♥'], ['8', '♠']], [['Q', '♦'], ['9', '♠']]]
...