Может ли кто-нибудь помочь мне создать колоду карт для игры в покер в Pygame? - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь сделать игру в покер на python, используя pygame и ООП.Ранее я создал текстовую игру в блэкджек из курса udemy, и я пытаюсь использовать некоторые из тех же принципов для создания своей колоды, но она не работает.У меня проблема в том, что я хочу создать 52 объекта карты и хочу, чтобы у каждого объекта карты было три атрибута (масть, ранг и файл png).

class Card:

    def __init__(self, suit, rank, pic):

        self.suit = suit
        self.pic = pic
        self.rank = rank


class Deck:

    def __init__(self):

        self.deck_comp = []

    def create_deck(self):

        for suit in suits:
            for rank in ranks:
                for pic in deck:

                    self.deck_comp.append(Card(suit, rank, pic))

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

масть - это список из четырех строк масти. Ранг - это список названий карт в виде строк.а pic - это список из 52 файлов .png (по одному на каждую карту в колоде)

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

Основываясь на примере из одной из книг:

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])

class Deck:
    ranks = [str(n) for n in range(2, 11)] + ['JQKA']
    suits = ['spades', 'diamonds', 'clubs', 'hearts']
    #  dictionary of dictionaries which maps ranks and suits to the picture
    pic_mapping = {
                    'spades': {
                                '2': 'spades2',
                                '3': 'spades3'
                                ...
                              },
                    'hearts': {
                                '2': 'hearts2',
                                '3': 'hearts3'
                                ...
                              },  


    def __init__(self):
        self._cards = [Card(rank, suit, pic_mapping[suit][rank]) for suit in self.suits
                                        for rank in self.ranks]

Обратите внимание, что списки могут становиться кортежами или могут быть построены с использованием генераторов.Списки просто используются для лучшей читаемости.Кроме того, вы можете перегрузить __len__ и __getitem__ для поддержки таких операций, как:

  • индексирование [i]
  • random.choice(collection)
  • срез
  • итерация
  • reversed(collection)

Вместо наложения слов можно использовать соглашение об именовании изображений, чтобы следовать этому шаблону f '{suit} {rank}' и динамически добавлять егона объект карты.

2 голосов
/ 24 мая 2019

Разве не было бы разумнее хранить все имена png в словаре и назначать изображения в классе Card?

class Card:
    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.img = png_images[f'{value}{suit}']

class Deck:
        def __init__(self, shuffle_cards=True):
        self.cards = []
        self.shuffle_cards = shuffle_cards
        self.create()

    def create(self):
        for _ in range(number_of_decks):
            for val in (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14):
                for suit in ("Hearts", "Spades", "Clubs", "Diamonds"):
                    self.cards.append(Card(val, suit))

        if self.shuffle_cards:
            shuffle(self.cards)
0 голосов
/ 24 мая 2019

Прошло много времени с тех пор, как я сделал что-то подобное, но вы можете создать словарь соленых огурцов, возможно, для каждой масти.

Посмотрите на это: Как я могу использовать рассол, чтобы сохранить дикт?? 1004 *

И создание TRIES: Как создать TRIE в Python

Надеюсь, это поможет:)

...