我正在制作一个简单的纸牌游戏,让玩家获得两张牌,如果这些牌是同一套牌,同一等级(价值),或者玩家获胜。如果玩家的手没有这些属性,则玩家输了。我使用的代码如下:
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
语句来测试玩家手中的牌是否是跑步。
答案 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)。