【问题标题】:Simple card game in pythonpython中的简单纸牌游戏
【发布时间】:2017-12-17 09:58:56
【问题描述】:

我正在制作一个简单的纸牌游戏,给玩家两张牌,如果牌的花色相同,等级(价值)相同,或者玩家获胜。如果玩家的手牌没有这些属性,玩家就输了。我使用的代码如下:

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

但是,即使牌的花色相同(例如“黑桃二”和“黑桃三”)或等级相同(例如“红心二”和“梅花二”),它也会输出 @987654322 @。我可以做些什么来解决这个问题以及如何添加elif 语句来测试玩家手中的牌是否是运行。

【问题讨论】:

  • all(suits_in_hand == suit for suit in suits) 不检查手中的花色列表是否等于所有可能的花色?

标签: python


【解决方案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 !"

【讨论】:

    【解决方案2】:

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

    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 对象。

    【讨论】:

      【解决方案3】:

      您想将suits_in_hand 中的元素相互比较。将它们与suits 进行比较就是将您的牌与所有可能的花色进行比较,这是不对的。同样,您需要一个ranks_in_hand 并将其中的元素相互比较。

      要检查是否运行,只需检查您手中的卡片等级之间的差异是否为 1。

      【讨论】:

        【解决方案4】:

        要检查手中的所有花色是否相同,您可以检查从 suits_in_hand 创建的集合的长度是否为一。

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-08-02
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 2021-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多