2017-02-01 2 views
4

Я думал о создании колоды карт для карточной игры. Я мог бы составить список всех карточек (мне все равно не нравятся костюмы), но мне было интересно, есть ли гораздо более простой способ сделать это.Каков наилучший способ создания колоды карт?

cards = ['1','1','1','1'....]

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

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

+0

Я хотел бы использовать класс Enum. –

ответ

7

Я предлагаю вам решение с использованием базового класса.

Во-первых, давайте создадим Card класс:

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

Тогда давайте создадим список цветов:

colors = ['heart', 'diamonds', 'spades', 'clubs'] 

Наконец, давайте строить свою колоду с списком понимания:

deck = [Card(value, color) for value in range(1, 14) for color in colors] 

Класс Card - это всего лишь обертка, просто для управления картами instea d кортежей, что кажется более естественным.

В этом текущем состоянии он почти эквивалентен переименованию типа tuple ... В основном он состоит только из конструктора __init__, который устанавливает атрибуты экземпляра.

Так что, когда я называю Card(value, color) в списке понимания, так, например, Card(11, 'spades'), создается новый экземпляр класса Card, который имеет свой атрибут value установлен в 11, и его атрибут color установлен в 'spades'.

Я рекомендую вам прочитать учебное пособие по ООП для углубленного понимания концепций.


Теперь вы можете попытаться улучшить эту идею, например, используя более подробный values список вместо range(1, 14):

values = ['ace', '2', ..., 'king'] 
+1

Как вы думаете, можете ли вы немного подробнее рассказать о его «классе»? Боюсь, я не понимаю, как это работает, хотя я думаю, что ваш ответ велик! – Mushy0364

+0

@ Mushy0364 Я отредактировал мой пост :) Кроме того, я не люблю делать рекламу для своих собственных сообщений, но вот сильно связанный вопрос о том, что я думаю, что ООП может принести: [планирование структуры Python OO] (http: /stackoverflow.com/q/41660924/7051394). –

+0

Огромное спасибо за очистку всего, я обязательно попробую это. Я уже сделал словарь со значениями, хранящимися, такими как 'values ​​= {1:" Ace "и т. Д.). Я обязательно буду рекомендовать чтение учебника OOP. Спасибо за помощь. – Mushy0364

0

Я думаю, что вы правы, for loop выполнит эту работу, но может и не быть самым изящным решением. Я никогда не программировал в Python, поэтому я не знаю точного синтаксиса, но я мог бы дать вам краткое описание класса psuedo для класса, который выполнит эту работу.

0
values = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'] 
suites = ['Hearts', 'Clubs', 'Diamonds', 'Spades'] 
deck = [[v + ' of ' + s,v] for s in suites for v in values] 
0

Может также сделать это:

card_deck = [] 

for i in range(3,11): 
    card_deck.extend([i]*4) 

for c in ['Jack', 'Queen', 'King', 'Ace']: 
    card_deck.extend([c]*4) 
0

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

import itertools 
import random 

vals = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king', 'ace'] 
suits = ['spades', 'clubs', 'hearts', 'diamonds'] 

deck = list(itertools.product(vals, suits)) 

random.shuffle(deck) 

for val, suit in deck: 
    print('The %s of %s' % (val, suit)) 

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

0

В этом решении используется класс enum (пакет enum34).

Два класса перечисления представляют собой Костюм и номер с обычным str Функция. Card класс принимает костюм + в номер

from enum import Enum   
from enum import unique   

@unique 
class Suit(Enum):    
    Spade = 1 
    Heart = 2 
    Dimond = 3 
    Club = 4 

    def __str__(self): 
     return self.name 

@unique 
class Number(Enum): 
    N1 = 1 
    N2 = 2 
    N3 = 3 
    N4 = 4 
    N5 = 5 
    N6 = 6 
    N7 = 7 
    N8 = 8 
    N9 = 9 
    N10 = 10 
    J = 11 
    Q = 12 
    K = 13 

    def __str__(self): 
     if self.value <= 10: 
      return str(self.value)   
     return self.name 

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

    def __str__(self): 
     return '{} {}'.format(self.suit, self.number) 

cards = [ Card(suit, number) for suit in Suit for number in Number ] 
for card in cards: 
    print card 
2

Другой подход может быть сделано с помощью namedtuple из collections модуля, как в этом примере:

from collections import namedtuple 

Card = namedtuple('Card', ['value', 'suit']) 
suits = ['hearts', 'diamonds', 'spades', 'clubs'] 
cards = [Card(value, suit) for value in range(1,14) for suit in suits] 

И вы можете получить доступ к значениям, как это:

print(cards[0]) 
>>> Card(value=1, suit='hearts') 
print(cards[0].value, cards[0].suit) 
>>> 1 hearts 
0

Первые некоторые функции полезности:

import random 
from random import shuffle 

def RANKS(): return [ "Ace", "2", "3", "4", "5", "6", "7","8", "9", "10", "Jack", "Queen", "King" ] 
def SUITS(): return [ "Clubs", "Diamonds", "Hearts", "Spades" ] 

Тогда класс карты:

class Card: 

    def __init__(self, rank, suit): 
     self.rank = rank 
     self.suit = suit 

    def __str__(self): 
     return self.rank + " of " + self.suit 

Тогда Палуба класс:

class Deck: 

    def __init__(self): 
     self.contents = [] 
     self.contents = [ Card(rank, suit) for rank in RANKS() for suit in SUITS() ] 
     random.shuffle(self.contents) 
Смежные вопросы