Python 无法让计算机选择手中的卡片套装

Python 无法让计算机选择手中的卡片套装,python,loops,playing-cards,Python,Loops,Playing Cards,我试图将纸牌游戏Euchre编程到python中,但我的代码遇到了一个障碍。在每一轮开始时,玩家轮流决定他们是否希望当前正面朝上的牌代表该轮的特朗普(如果红心是正面朝上的,那么红心就是有问题的特朗普) 我给玩家第一个选择,让他们决定是否要调用当前的特朗普,如果他们通过,然后让其他三名玩家(均由计算机控制)各自决定是否要调用特朗普。目前,我想让电脑至少有一张牌与他们手中的王牌牌相匹配,那么他们就会打出王牌,否则我也会让他们通过 我的问题是:即使电脑手中有一张王牌,他们也会像没有王牌一样传递王牌。因

我试图将纸牌游戏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”