2010-03-25 18 views
15

¿Cuál es la mejor manera de almacenar las cartas y los palos en python para que pueda mantener una referencia a estos valores en otra variable?mejor manera de implementar una baraja para un juego de cartas en python

Por ejemplo, si tengo una lista llamada mano (cartas en la mano de los jugadores), ¿cómo podría contener valores que podrían referirse a los nombres de palos y valores de cartas específicas, y cómo estos nombres y valores de palos y las tarjetas se almacenan?

+1

Sin duda puedes representar una carta usando tuplas simples o cadenas codificadas, pero la respuesta de Ned Batchelder te brinda más capacidades. Si comienzas con un simple juego de cartas como War antes de enfrentarte a algo más complicado como Poker, verás el valor de definir una clase de cartas, donde puedes definir operadores de comparación ricos, lo que facilita la comparación de un as versus un '10. 'usando métodos de clase, en lugar de crear una lógica especial funky tratando de comparar "A" con as vs. "T" con 10. Note también que algunos juegos tienen múltiples valores posibles para las cartas, como el as en 21 puede ser 1 u 11 – PaulMcG

Respuesta

7

Lo más sencillo sería utilizar una lista de tuplas, donde las cartas son enteros y los trajes son cadenas:

hand = [(1, 'spade'), (10, 'club'), ...] 

Pero más simple puede no ser lo que quieres. Tal vez desee que una clase represente una tarjeta:

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

    def __repr__(self): 
     letters = {1:'A', 11:'J', 12:'Q', 13:'K'} 
     letter = letters.get(self.rank, str(self.rank)) 
     return "<Card %s %s>" % (letter, self.suit) 

hand = [Card(1, 'spade'), Card(10, 'club')] 
1

Puede simplemente usar un número y decidir sobre una correspondencia entre el número y la "tarjeta". Por ejemplo:

número MOD 13 = valor nominal (después de una 1) traje de

número 13 DIV =

+0

Debe tenerse en cuenta que utilizará valores del 0 al 51 para este método para cada tarjeta. Entonces podría asignar a cada palo un número del 0 al 3. – JSchlather

24

servidores de póquer tienden a utilizar una cadena de 2 caracteres para identificar cada tarjeta, lo cual es bueno porque es fácil de manejar programáticamente y tan fácil de leer para un humano.

>>> import random 
>>> import itertools 
>>> SUITS = 'cdhs' 
>>> RANKS = '23456789TJQKA' 
>>> DECK = tuple(''.join(card) for card in itertools.product(RANKS, SUITS)) 
>>> hand = random.sample(DECK, 5) 
>>> print hand 
['Kh', 'Kc', '6c', '7d', '3d'] 

Editar: Esto es en realidad directamente de un módulo de póquer que escribí para evaluar las manos de póquer, se puede ver más aquí: http://pastebin.com/mzNmCdV5

+0

excelente, ¡justo lo que necesitaba! Gracias – matt1024

+5

Por lo que vale, en lugar de usar tuplas para SUITS y RANKS, puedes usar cadenas: SUITS = 'cdhs' y RANKS = '23456789TJQKA'. –

+1

Tenga en cuenta que las cartas no se toman de la baraja en este ejemplo, lo que significa que el siguiente jugador podría recibir la misma carta.Una implementación más realista haría que DECK fuera una lista, de la cual las tarjetas aleatorias se "saltan" haciendo 'DECK.pop (r)' –

1
import collections 

C, H, D, S = "CLUBS", "HEARTS", "DICE", "SPADE" 
Card = collections.namedtuple("Card", "suit value") 

hand = [] 

hand.append(Card(C, 3)) 
hand.append(Card(H, "A")) 
hand.append(Card(D, 10)) 
hand.append(Card(S, "Q")) 

for card in hand: 
    print(card.value, card.suit) 
1

Una baraja de cartas está compuesto de la misma gama de valores (1 - 13) en cada uno de los cuatro trajes, lo que sugiere un producto cartesiano . lista por comprensión es una sintaxis elegante, densa para hacer esto:

values = range(1, 10) + "Jack Queen King".split() 
suits = "Diamonds Clubs Hearts Spades".split() 

deck_of_cards = ["%s of %s" % (v, s) for v in values for s in suits] 

en Python 3:

deck_of_cards = ["{0} of {1}".format(v, s) for v in values for s in suits] 

eso es lo que son cuando se toma una marca nueva cubierta de la caja; para jugar debes mezclarlos:

from random import shuffle 

shuffle(deck_of_cards) 
Cuestiones relacionadas