python中的简单纸牌游戏

时间:2017-07-12 20:13:53

标签: 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."

然而,即使这些牌都是同一套牌(例如“黑桃队中的两个”和“三个黑桃队”)或同一级别(例如“两个红心”和“两个俱乐部”),它输出{{ 1}}。我该怎么做才能解决这个问题,如何添加You Lose语句来测试玩家手中的牌是否是跑步。

4 个答案:

答案 0 :(得分:1)

要检查集合中的所有元素是否相同,一个简短而优雅的解决方案是使用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 !"

答案 1 :(得分:0)

您的主要问题是您正在尝试将单个实体与数组进行比较,而这是您无法做到的。而不是

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

做类似

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

对于ranks,您需要执行类似的操作,但需要构建一个ranks_in_hand对象。

答案 2 :(得分:0)

您想要将suits_in_hand中的元素相互比较。将它们与suits进行比较是将您的手与所有可能的套装进行比较,这是不对的。同样,您需要ranks_in_hand并将其中的元素相互比较。

要检查跑步,只需检查手牌中的牌位差是否为1。

答案 3 :(得分:0)

为了检查手中的所有套装是否相同,您可以检查从suit_in_hand创建的套装的长度是否为1。

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

可以做类似的事情来检查手牌是否包含所有相同的牌。

要检查运行,您可以尝试对列表进行排序,并检查每个元素是否大于下一个元素(简化,只需检查差异,如果您只需要支持手的大小为2)。