首页 > 解决方案 > Python随机洗牌在我的身上不起作用,即使它应该

问题描述

大家好,第一次在这里发帖。我有一个我无法解释的问题。我正在尝试复制扑克,但我的套牌洗牌功能不起作用
首先我的代码

class Start(object):
openCards = []
def __init__(self, numofplayer):
    print("started")
    finished = False
    self.deck = Deck()
    self.deck.shuffle()
    for card in self.deck:
        card.isshowing = True
        print(card)
    self.players = []
    i = 0
    while i < numofplayer:
        player = Player()
        self.players.append(player)
        i = i + 1



class Deck(list):

def __init__(self):
    self.cards = []
    suits = ["Herz", "Piek", "Karo", "Kreuz"]
    values = {
        "zwei": 2,
        "drei": 3,
        "vier": 4,
        "fünf": 5,
        "sechs": 6,
        "sieben": 7,
        "acht": 8,
        "neun": 9,
        "zehn": 10,
        "bube": 11,
        "dame": 12,
        "könig": 13,
        "ass": 14
    }

    for value in values:
        for suit in suits:
            self.cards.append(Card(value, suit))

def shuffle(self):

    random.shuffle(self)
    print("Karten gemischt")

def __repr__(self):
    cardsleft = len(self.cards)
    return "Es sind noch {0} karten übrig".format(cardsleft)

def deal(self):
    return self.cards.pop(0)

好的,所以我在 self.deck.shuffle() 的问题,因为我认为这应该随机化我的卡组的顺序,但是如果我在调试模式下查看变量,它仍然是标准顺序。为什么?

标签: pythonpython-3.xrandomshuffle

解决方案


正如每个人所说,如果您的卡片被定义为类中的列表,您可能不想从列表继承。

import random

class Card:
    def __init__(self, value, suit):
        self.suit = suit
        self.value = value

    def __repr__(self):
        return f'{self.value} von {self.suit}'

class Start:
    openCards = []

    def __init__(self, numofplayer):
        self.deck = Deck()
        self.deck.shuffle()
        # here we iterate through the cards rather than the deck object
        for card in self.deck.cards:
            card.isshowing = True
            print(card)
        self.players = []

class Deck():
    def __init__(self):
        self.cards = []
        suits = ["Herz", "Piek", "Karo", "Kreuz"]
        values = {
            "zwei": 2,
            "drei": 3,
            "vier": 4,
            "fünf": 5,
            "sechs": 6,
            "sieben": 7,
            "acht": 8,
            "neun": 9,
            "zehn": 10,
            "bube": 11,
            "dame": 12,
            "könig": 13,
            "ass": 14
        }

        for value in values:
            for suit in suits:
                self.cards.append(Card(value, suit))

    def shuffle(self):
        # we also shuffle the cards sins that's what they're assigned to
        random.shuffle(self.cards)
        print("Karten gemischt")

    def __repr__(self):
        # we also show the length of the cards
        cardsleft = len(self.cards)
        return "Es sind noch {0} karten übrig".format(cardsleft)

Start(5)

如果你真的想从列表中继承,你可以这样做。

import random

class Card:
    def __init__(self, value, suit):
        self.suit = suit
        self.value = value

    def __repr__(self):
        return f'{self.value} von {self.suit}'

class Start:
    openCards = []

    def __init__(self, numofplayer):
        self.deck = Deck()
        self.deck.shuffle()
        # inheriting from list allows you to iterate through the deck object
        # since it inherits a __next__ method from list
        for card in self.deck:
            card.isshowing = True
            print(card)
        self.players = []

class Deck(list):
    def __init__(self):
        # we send a super call to lists constructor
        super().__init__()
        suits = ["Herz", "Piek", "Karo", "Kreuz"]
        values = {
            "zwei": 2,
            "drei": 3,
            "vier": 4,
            "fünf": 5,
            "sechs": 6,
            "sieben": 7,
            "acht": 8,
            "neun": 9,
            "zehn": 10,
            "bube": 11,
            "dame": 12,
            "könig": 13,
            "ass": 14
        }

        for value in values:
            for suit in suits:
                # here we simply use the append method we inherited from list
                self.append(Card(value, suit))

    def shuffle(self):
        # doing it this way allows us to shuffle self
        random.shuffle(self)
        print("Karten gemischt")

    def __repr__(self):
        # we also need to show the length of self
        cardsleft = len(self)
        return "Es sind noch {0} karten übrig".format(cardsleft)

Start(5)

推荐阅读