Python 无法让计算机选择手中的卡片套装
我试图将纸牌游戏Euchre编程到python中,但我的代码遇到了一个障碍。在每一轮开始时,玩家轮流决定他们是否希望当前正面朝上的牌代表该轮的特朗普(如果红心是正面朝上的,那么红心就是有问题的特朗普) 我给玩家第一个选择,让他们决定是否要调用当前的特朗普,如果他们通过,然后让其他三名玩家(均由计算机控制)各自决定是否要调用特朗普。目前,我想让电脑至少有一张牌与他们手中的王牌牌相匹配,那么他们就会打出王牌,否则我也会让他们通过 我的问题是:即使电脑手中有一张王牌,他们也会像没有王牌一样传递王牌。因此,出于某种原因,我的代码没有正确地检查计算机手中每张卡的套色。你们中有谁能找出这里出了什么问题:Python 无法让计算机选择手中的卡片套装,python,loops,playing-cards,Python,Loops,Playing Cards,我试图将纸牌游戏Euchre编程到python中,但我的代码遇到了一个障碍。在每一轮开始时,玩家轮流决定他们是否希望当前正面朝上的牌代表该轮的特朗普(如果红心是正面朝上的,那么红心就是有问题的特朗普) 我给玩家第一个选择,让他们决定是否要调用当前的特朗普,如果他们通过,然后让其他三名玩家(均由计算机控制)各自决定是否要调用特朗普。目前,我想让电脑至少有一张牌与他们手中的王牌牌相匹配,那么他们就会打出王牌,否则我也会让他们通过 我的问题是:即使电脑手中有一张王牌,他们也会像没有王牌一样传递王牌。因
if 'h' in Trump_card[0]:
trump='h'
print("Hearts is trump.")
if 'd' in Trump_card[0]:
trump='d'
print("Diamonds is trump.")
if 's' in Trump_card[0]:
trump='s'
print("Spades is trump.")
if 'c' in Trump_card[0]:
trump='c'
print("Clubs is trump.")
Called_trump=raw_input("Will you call trump? (y/n): ").lower()
if Called_trump=='y':
print("\nPlayer calls trump.")
if Called_trump=='n':
if trump==Opp1_hand[0]:
print("First opponent calls trump.")
elif trump==Opp1_hand[1]:
print("First opponent calls trump.")
elif trump==Opp1_hand[2]:
print("First opponent calls trump.")
elif trump==Opp1_hand[3]:
print("First opponent calls trump.")
elif trump==Opp1_hand[4]:
print("First opponent calls trump.")
else:
print("First opponent passes.")
if trump in Partner_hand:
print("Partner calls trump.")
else:
print("Partner passes.")
if trump in Opp2_hand:
print("Second opponent calls trump.")
else:
print("Second opponent passes.")
我试图用Opp1_牌明确地拿着手中的每一张牌,检查是否找到了王牌,如果找到了,他们会打电话给王牌。如果Opp1通过,我的搭档就有机会看看他们是否有特朗普的官司。然后,如果合作伙伴通过,第二个对手将有机会打电话给特朗普。谢谢任何人能提供的帮助
我构造Opp1_牌和Trump_牌的方式是一个包含花色和牌值的字符串列表(例如,黑桃王牌写为)。我将在下面列出创建所有卡的代码,以及如何创建Opp1_牌和Trump_牌:
class Card(object):
'''defines card class'''
RANK=['9','10','J','Q','K','A'] #list of ranks & suits to make cards
SUIT=['c','s','d','h']
def __init__(self,rank,suit):
self.rank=rank
self.suit=suit
def __str__(self):
rep=self.rank+self.suit
return rep
class Hand(object):
def __init__(self):
self.cards=[]
def __str__(self):
if self.cards:
rep=''
for card in self.cards:
rep+=str(card)+'\t'
else:
rep="EMPTY"
return rep
def clear(self):
self.cards=[]
def add(self,card):
self.cards.append(card)
def give(self,card,other_hand):
self.cards.remove(card)
other_hand.add(card)
def remove(self,card):
self.cards.remove(card)
class Deck(Hand):
def populate(self):
for suit in Card.SUIT:
for rank in Card.RANK:
self.add(Card(rank,suit))
def shuffle(self):
random.shuffle(self.cards)
def deal(self,hands,hand_size=1):
for rounds in range(hand_size):
for hand in hands:
if self.cards:
top_card=self.cards[0]
self.give(top_card,hand)
else:
print("Out of cards.")
deck1=Deck()
player_hand=Hand()
partner_hand=Hand()
opp1_hand=Hand()
opp2_hand=Hand()
trump_card=Hand()
hands=[player_hand,opp1_hand,partner_hand,opp2_hand]
deck1.populate()
deck1.shuffle()
deck1.deal(hands,hand_size=5)
deck1.give(deck1.cards[0],trump_card) #this becomes the trump card players bid on
print("\nPrinting the current trump card: ")
print(trump_card)
#Converts all hands into lists that can have its elements removed
#I'm only including Opp1_hand and Trump_card here but the other three
#are made the same way
Opp1_hand=[str(opp1_hand.cards[0]),str(opp1_hand.cards[1]),str(opp1_hand.cards[2]),\
str(opp1_hand.cards[3]),str(opp1_hand.cards[4])]
Trump_card=[str(trump_card.cards[0])]
因此,Opp1_牌和特朗普_牌的显示示例如下:
Opp1_hand=['As','10d','9c','Kh','Jh']
Trump_card=['Qc']
让我困惑的是,当我给“特朗普”贴标签时(在顶部的第一段代码中),程序能够正确地识别出特朗普牌中的哪一套(“h”、“s”、“c”、“d”),然后据此定义特朗普。但是,当我尝试通过Opp1\u手、Partner\u手和Opp2\u手进行检查时,由于某种原因,代码无法识别每张卡的适合性。如果这不是最好的方法,你们中有谁知道更好的方法来确定每张卡的套装是什么吗?您的代码假设手的内容是套装的单个字符。看看你决定特朗普的方式,阅读欧克里的规则意味着手很可能显示为西装和价值(如钻石王牌)。如果是这种情况,那么Opp_hand[0]可以是'ad'而不是'd',这将导致==测试失败。对特朗普的检查也将失败,因为
x = ['a1', 'b2', 'c3', 'd4', 'e5']
>>> 'b' in x
False
>>> 'b2' in x
True
你还需要展示双手是如何构造的。在您的测试中,还要确保指针是用小写字母构建的。Opp1\U hand的类型和内容是什么?字符串列表?字符串是什么样子的?王牌的价值是多少。我猜它是一个字符串,但需要看看它是在哪里定义的,以及如何定义的。从使用Opp1_hand的方式来看,我猜它是一个字符串数组。但最好确定一下,你是把Opp1_hand设置为只列出西装的列表,还是列出卡片和西装的价值?例如,如果您输入的是钻石王牌的“Ad”,那么ifs将始终失败,因为您检查的是“d”,而不是“Ad”