2017-07-12 14 views
0

Ich mache ein einfaches Kartenspiel, dass der Spieler zwei Karten und wenn die Karten die gleiche Farbe, der gleiche Rang (Wert), oder ein Lauf der Spieler gewinnt. Wenn die Hand des Spielers keine dieser Eigenschaften hat, verliert der Spieler. Der Code, den ich verwende, ist wie folgt:Einfaches Kartenspiel in Python

from itertools import product 
import random 


class Card(object): 

    FACES = {11: 'Jack', 12: 'Queen', 13: 'King', 14: 'Ace'} 

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

    def __str__(self): 
     value = self.FACES.get(self.rank, self.rank) 
     return "{0} of {1}".format(value, self.suit) 

    def __lt__(self, other): 
     return self.rank < other.rank 


class Deck(object): 

    def __init__(self, ranks=None, suits=None): 
     if ranks is None: 
      ranks = xrange(2, 15) 
     if suits is None: 
      suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades'] 
     self.deck = [] 
     for r in ranks: 
      for s in suits: 
       self.deck.append(Card(r, s)) 

    def deal(self, n): 
     return random.sample(self.deck, n) 


ranks = xrange(2, 15) 
suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades'] 
deck = Deck() 
hand = deck.deal(2) 
print "Your hand is" 
print " - ".join(map(str, hand)) 

suits_in_hand = [] 
for card in hand: 
    suits_in_hand.append(card.suit) 

if all(suits_in_hand == suit for suit in suits): 
    print "\nAll cards are of the same suit" 
    print "You Win!" 
elif all(suits_in_hand == rank for rank in ranks): 
    print "\nAll cards are of the same rank" 
    print "You Win!" 
# I don't know how to test if the cards in the player's hand are a run 
else: 
    print "\nYou Lose." 

Aber auch wenn die Karten sind beide die gleiche Farbe (zB ‚zwei Pik‘ und ‚drei Pik‘) oder den gleichen Rang (zB ‚zwei Hearts 'und' Two of Clubs ') gibt You Lose aus. Was kann ich tun, um dies zu beheben und wie kann ich die elif Anweisung hinzufügen, um zu testen, ob die Karten in der Hand des Spielers ein Run sind oder nicht?

+1

Nicht 'alle (suits_in_hand == Anzug für Anzug in Anzügen)' überprüfen, ob die Liste der Klagen zu sehen in der Hand ist gleich jeder mögliche Anzug? –

Antwort

0

Um zu überprüfen, ob alle Elemente in einer Sammlung gleich, eine kurze und elegante Lösung sind, ist ein set zu verwenden:

suits_in_hand = set(card.suit for card in hand) 

if len(suits_in_hand) == 1: 
    print "\nAll cards are of the same suit" 
    print "You Win!" 

Das Gleiche gilt für Reihen.

Für läuft, können Sie den Satz von Reihen auf einen Satz von Bereich vergleichen könnte:

ranks_in_hand = set(card.rank for card in hand) 
min_rank == min(ranks_in_hand) 
if set(ranks_in_hand) == set(range(min_rank, min_rank + 2)): 
    print "\nGot a run !" 
+0

Das funktioniert gut, aber wie könnte ich den Lauftest hinzufügen? – Sekou

+0

Ich habe gerade meinen Beitrag bearbeitet, um den Lauftest zu enthalten – b1ch0u

+0

Woks, vielen Dank! – Sekou

0

Ihr Hauptproblem ist, dass Sie versuchen, eine einzelne Entität mit einem Array zu vergleichen, was Sie nicht tun können. Statt

if all(suits_in_hand == suit for suit in suits): 
    print "\nAll cards are of the same suit" 
    print "You Win!" 

etwas tun, wie

if suit in suits_in_hand for suit in suits: 
    print "\nAll cards are of the same suit" 
    print "You Win!" 

Für die ranks, müssen Sie etwas ähnliches tun, aber ein ranks_in_hand Objekt bauen.

0

Sie möchten die Elemente in suits_in_hand miteinander vergleichen. Vergleichen Sie sie mit suits vergleicht Ihre Hand mit allen möglichen Anzügen, was nicht richtig ist. Ebenso benötigen Sie eine ranks_in_hand und vergleichen Sie die Elemente miteinander.

für einen Lauf zu überprüfen, überprüfen nur, wenn die Differenz zwischen den Karten Reihen in der Hand 1.

0

Für die Überprüfung ist, wenn alle der Anzüge in der Hand sind die gleichen, können Sie überprüfen, ob die sehen Länge des Sets, das von suits_in_hand erstellt wurde, ist eins.

if len(set(suits_in_hand)) == 1: 
    # do something 

Eine ähnliche Sache könnte getan werden, um zu überprüfen, ob die Hand alle die gleiche Karte enthält.

Um nach einem Lauf zu suchen, könnten Sie versuchen, die Liste zu sortieren und zu überprüfen, ob jedes Element größer ist als das nächste (vereinfacht, überprüfen Sie einfach den Unterschied, wenn Sie nur eine Handgröße von zwei benötigen).