2010-03-25 18 views
15

Kartlar ve takımları python'da saklamanın en iyi yolu nedir? Böylece, bu değerlere başka bir değişkende referans gösterebilirim?python'da bir kart oyunu için bir güverte uygulamak için en iyi yol

Örneğin, el olarak adlandırılan bir listem varsa (oyuncular eldeki kartlar), belirli kartların takımlarının ve değerlerinin isimlerini referans alabilecek değerleri nasıl tutabilirim ve bu adlar ve takımların değerleri ve değerleri nasıl olur? kartlar saklanabiliyor mu?

+1

Basit çekimleri veya kodlanmış dizeleri kullanarak bir kartı kesinlikle temsil edebilirsiniz, ancak Ned Batchelder'ın yanıtı size daha fazla özellik kazandırır. Poker gibi daha karmaşık bir şeyi almadan önce War gibi basit bir kart oyunuyla başlarsanız, zengin karşılaştırma operatörlerini tanımlayabileceğiniz bir Kart sınıfını tanımlamanın değerini görürsünüz. 'sınıf yöntemleri kullanarak, yerine 10 için as "T" için "A" karşılaştırmak için çalışırken bazı korkak özel mantık oluşturmak yerine, aynı zamanda bazı oyunların kartlara birden fazla olası değerlere sahip olduğunu unutmayın, 21'de as gibi 1 veya 11 olabilir – PaulMcG

cevap

7

basit şey kartları int olan küpe, bir listesini kullanmak olacaktır ve takım elbise görürsün:

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

Ama en basit istediğini olmayabilir. Belki bir sınıf bir kart temsil etmek istiyorum:

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

Sadece bir sayı kullanın ve sayı ve "karta" arasında bir eşleme karar verebilir.

sayı MOD 13 = nominal değerindeki

+0

Her bir kart için bu yöntem için 0'dan 51'e kadar değerler kullandığınızı unutmayın. Daha sonra her bir elbiseye 0'dan 3'e kadar bir sayı atayabilirsiniz. – JSchlather

24

poker sunucularının güzel her kart, tanımlamak için bir 2-karakter dizesini kullanma eğiliminde

sayı DIV 13 = takım elbise (+1 sonra): Örneğin çünkü programatik olarak ve insan için okumayı kolay bir şekilde ele almak kolaydır.

>>> 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'] 

Düzenleme: Bu düz ben poker elleri değerlendirmek yazdığı bir poker modülünden aslında, buradan daha görebilirsiniz: http://pastebin.com/mzNmCdV5 Bir deste aynı aralıkta oluşmaktadır

+0

mükemmel - tam ihtiyacım olan şey! Teşekkürler – matt1024

+5

Değeri, SUITS ve RANKS için tuples kullanmak yerine, sadece dizeleri kullanabilirsiniz: SUITS = 'cdhs' ve RANKS = '23456789TJQKA'. –

+1

Bu örnekte kartların desteden alınmadığını, yani bir sonraki oyuncunun aynı kartı alabileceğini unutmayın.Daha gerçekçi bir uygulama, DECK'in rastgele kartların "attığı" 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

dört takımının her birindeki değerlerin (1 - 13) her biri Kartezyen ürün. Eğer kutunun dışında yepyeni bir güverte alırken ne kadar That

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

;: Python

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] 

: Liste anlama bunu için zarif, yoğun sözdizimi oynamak için bunları karıştırmanız gerekiyor:

from random import shuffle 

shuffle(deck_of_cards) 
İlgili konular