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

hand = random.sample((deck),2)
print('your hand is', hand)
deck.remove(hand)
-1
ryan lee 29 Авг 2017 в 01:23

4 ответа

Лучший ответ

Либо используйте набор для представления рук, как упомянуто @COLDSPEED, либо, если вы представляете колоду в виде списка и предполагаете, что все карты в колоде уникальны, выталкивайте их, когда вы генерируете руку.

НАПРИМЕР.

deck = ['JS','QS','KS','AS' ....]

Взять одну карту:

card = deck.pop()

< Сильный > ИЗМЕНИТЬ

Вот более полный пример, включая случайность

import random

deck = ['JS','QS','KS','AS']

def draw(num_cards,deck):
    hand = []
    for n in range(num_cards):
        card = random.choice(deck)
        hand.append(card)
        deck.remove(card)
    return hand

print(draw(2,deck))
print(deck)

И версия, использующая наборы, согласно запросу:

import random

class Poker:
    def __init__(self):
        self.deck =  {'JS','QS','KS','AS'}

    def draw(self,num_cards):
        hand = set(random.sample(self.deck,num_cards))
        self.deck = self.deck.difference(hand)
        return hand

game = Poker()
hand = game.draw(2)
print(hand)
print(game.deck)
1
Solaxun 28 Авг 2017 в 23:15

Поскольку вы берете случайную выборку с параметром 2, вы получите список из двух элементов. Поэтому лучше всего отфильтровать список так:

hand = random.sample((deck),2)
print('your hand is', hand)
deck = [i for i in deck if i not in hand]
1
Ajax1234 28 Авг 2017 в 22:29

deck.remove ожидает один элемент, который существует в deck. Вы не можете передать ему список элементов, надеясь, что он удалит каждый отдельный элемент в списке. Вместо этого он попытается найти переданный список внутри deck.

Вам нужно сделать либо:

for x in hand:
    deck.remove(x)

Или же:

deck.remove(hand[0])
deck.remove(hand[1])

Более того, сделайте это более похожим на то, как мы обычно думаем о колоде карт.

random.shuffle(deck)
hand = [deck.pop(), deck.pop()]
0
Alex Hall 28 Авг 2017 в 22:28

Вы пытаетесь найти объект списка внутри другого объекта списка. Здесь вам действительно нужно использовать цикл, поэтому вместо deck.remove(hand) вы должны сделать:

for x in hand:
  deck.remove(x)
1
MSeifert 28 Авг 2017 в 22:31