Python случайное перемешивание не работает в моем, хотя это должно - PullRequest
0 голосов
/ 05 марта 2020

Привет, ребята, впервые публикуется здесь. У меня есть проблема, которую я не могу объяснить. Я пытаюсь повторить покер, но моя функция перемешивания колоды не работает
Сначала мой код

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 (), так как я думаю, что это должно рандомизировать порядок моих колода, но если я взгляну на переменную в режиме отладки, она все еще в стандартном порядке. почему?

Ответы [ 2 ]

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

Как все говорят, вы, вероятно, не хотите наследовать от списка, если ваши карты определены как список в вашем классе.

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)
0 голосов
/ 05 марта 2020

Вы положили self (здесь пустое list) в random.shuffle. Вы должны указать список, который вы хотите перемешать, чтобы ваша функция shuffle выглядела следующим образом:

def shuffle(self):
    random.shuffle(self.cards)
    print("Karten gemischt")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...