2017-07-12 2 views
0

私は、2枚のカードを扱う簡単なカードゲームを作っています。カードが同じスーツ、同じランク(値)、またはプレイで勝った場合は勝ちます。プレイヤーの手にこれらの特性がない場合、プレイヤーは負けます。次のように私が使用していたコードは次のとおりです。単純なカードゲーム(パイソン)

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." 

しかし、カードが同じスーツ(例えば「2スペードの」と「スペードの3」)または同じランクの両方であっても(例えば「2の「ハーツ」と「クラブの2つ」)は、You Loseを出力します。この問題を解決するにはどうすればいいですか?また、プレーヤーの手札にあるカードが実行されているかどうかをテストするために、elifステートメントを追加するにはどうすればよいですか。

+1

はない 'すべて(suits_in_hand ==スーツスーツスーツ)'スーツのリストかどうかを確認していすべての可能なスーツに等しいですか? –

答えて

0

コレクション内のすべての要素が同じであるかどうかを確認するには、短いとエレガントな解決策はsetを使用することです:

ランクのための同じ
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!" 

ランの

、あなたが範囲からセットにランクのセットを比較することができます:

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

これは素晴らしいですが、どのようにランテストを追加できますか? – Sekou

+0

私は実行テストを含むように自分の投稿を編集しました – b1ch0u

+0

Woks greatありがとう! – Sekou

0

あなたの主な問題は、あなたができない配列に単一のエンティティを比較しようとしていることです。代わりに

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

ranksについては

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

ような何かを、あなたは似た何かをする必要がありますが、ranks_in_handオブジェクトを構築します。

0

suits_in_handの要素を互いに比較したいとします。それらをsuitsと比較することは、あなたの手をすべての可能なスーツと比較することです。これは正しいことではありません。同様に、ranks_in_handが必要で、その要素を互いに比較します。あなたの手でカードのランクの差が、手にスーツのすべてが同じであれば、あなたがかどうかを確認することができますチェックするための1

0

であるかどうかを確認だけで、実行を確認するために

suits_in_handから作成されたセットの長さは1です。

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

同じようなことが、手に同じカードがすべて含まれているかどうかを確認するために行うことができます。

実行を確認するには、リストをソートして、各要素が次のものよりも大きいかどうかを調べることができます(簡略化して、手のサイズを2つだけサポートする必要がある場合は違いを確認してください)。