Использование цикла while для неопределенного переназначения переменной, пока эта переменная больше не принадлежит списку? - PullRequest
0 голосов
/ 05 января 2019

Цель этой программы - раздать одну 5-карточную руку из стандартной колоды из 52 карт.

Я новичок в Python. В конце концов я хотел бы написать 5-карточную дро-покерную программу, но сначала хотел бы узнать, как раздавать 5 случайных неповторяющихся карт. Карты раздаются и распечатываются обратно пользователю, но иногда имеют дело с дубликатами. то есть, рука, которую я получил, это Ah 2d 8h Ah Jc. Не может быть двух туз червей.

Я пытаюсь использовать некоторое время True: конструкцию, чтобы гарантировать, что одна и та же карта не будет сдана дважды. Я изучал C некоторое время до Python и запутался здесь в синтаксисе / конструкции. Цикл do-while может показаться удобным, когда он неопределенно переназначает карту на случайное int, если эта карта еще не была извлечена.

Код также очень длинный, и я только что показал процесс назначения первых нескольких карт. Использование 52 операторов if кажется проблемой, но сначала я хотел бы посмотреть, может ли оно работать с этой конструкцией, просто исправив цикл while.

import random


# track a list of cards used
dealt_cards = ["Joker", "Joker2"]

for n in range (5):
    # generate a random int between 1 and 52 representing card
    card = random.randint(1,52)

    #check to see if this card has already been dealt,  
    #and if so, re-deal
    while True:
        if card in dealt_cards:
            card = random.randint(1,52)
        else:
            break


    #assign each random int generation to a specific card in the 
    deck,
    #and add the new card to dealt_cards

    #spades
    if card == 1:
        card = str(card)
        card = 'As'
        dealt_cards.append(card)
    if card == 2:
        card = str(card)
        card = '2s'
        dealt_cards.append(card)
    if card == 3:
        card = str(card)
        card = '3s'
        dealt_cards.append(card)
    if card == 4:
        card = str(card)
        card = '4s'
        dealt_cards.append(card)
    if card == 5:
        card = str(card)
        card = '5s'
        dealt_cards.append(card)
    if card == 6:
        card = str(card)
        card = '6s'
        dealt_cards.append(card)

Я ожидаю, что программа вернет пользователю 5 уникальных неповторяющихся игральных карт, но иногда она возвращает (раздает) одну и ту же карту дважды в одной руке.

1 Ответ

0 голосов
/ 05 января 2019

Вы можете создать все карты из 2 списков (масти, лица).

Вы можете сделать перемешанную копию колоды или взять 5 случайных карт без замены (random.sample):

import itertools
import random

suits = ['heart', 'tiles', 'clubs', 'pikes']
faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K']

deck = set(itertools.product(faces, suits))

# get a mixed sample of all cards, use get first 5 cards
mixed = random.sample(deck, len(deck)) # get sample of all cards from deck (==shuffled copy) 
five = mixed[:5]
print(five) 

# to remove the just drawn cards from availables:
mixed = mixed[5:] # to remove the drawn cards for your mixed copy

# draw 7 non-repeated cards from deck
seven = random.sample(deck, 7)  # get 7 unique cards directly from deck
print(seven)

Выход:

# five
[('6', 'pikes'), ('T', 'heart'), ('Q', 'pikes'), ('3', 'tiles'), ('J', 'clubs')]

# seven
[('A', 'tiles'), ('7', 'tiles'), ('8', 'tiles'), ('3', 'heart'), ('9', 'pikes'),
 ('6', 'heart'), ('T', 'clubs')]

Deckbuilding вдохновлен: codereview texas-holdem-poker-game

Взятие из предварительно * перетасованной копии deck облегчает раздачу карт. Просто возьмите с фронта, чтобы «иметь дело» и list.pop (0) этот элемент.

Доку:


Продукт Itertools является кратным для цикла:

d = []
for s in suits:
    for f in faces:
        d.append((s,f))

print(d)

[('heart', 'A'), ('heart', '2'), ('heart', '3'), ('heart', '4'), ('heart', '5'), 
 ('heart', '6'), ('heart', '7'), ('heart', '8'), ('heart', '9'), ('heart', 'T'), 
 ('heart', 'J'), ('heart', 'Q'), ('heart', 'K'), ('tiles', 'A'), ('tiles', '2'), 
 ('tiles', '3'), ('tiles', '4'), ('tiles', '5'), ('tiles', '6'), ('tiles', '7'), 
 ('tiles', '8'), ('tiles', '9'), ('tiles', 'T'), ('tiles', 'J'), ('tiles', 'Q'),
 ('tiles', 'K'), ('clubs', 'A'), ('clubs', '2'), ('clubs', '3'), ('clubs', '4'), 
 ('clubs', '5'), ('clubs', '6'), ('clubs', '7'), ('clubs', '8'), ('clubs', '9'), 
 ('clubs', 'T'), ('clubs', 'J'), ('clubs', 'Q'), ('clubs', 'K'), ('pikes', 'A'), 
 ('pikes', '2'), ('pikes', '3'), ('pikes', '4'), ('pikes', '5'), ('pikes', '6'), 
 ('pikes', '7'), ('pikes', '8'), ('pikes', '9'), ('pikes', 'T'), ('pikes', 'J'), 
 ('pikes', 'Q'), ('pikes', 'K')]
...