【问题标题】:Python BlackJack game -Python 二十一点游戏 -
【发布时间】:2016-01-01 07:54:49
【问题描述】:

我想打印牌组中的所有卡片(随机)。该程序运行并打印多达 48 张卡片(每次执行程序时打印的数量不同)。我怀疑我的问题在于 get_card() 函数。这是我的第一个程序,所以请多多关照(=

import random

class Deck(object):

    def __init__(self,deck={},suit=[],suitDict={},cardValue=0,cardKey={}):
        self.deck=deck
        self.suit=suit
        self.suitDict=suitDict
        self.cardValue=cardValue
        self.cardKey=cardKey

    def create_deck(self):

        spades={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        hearts={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        diamonds={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        clubs={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        self.deck={'Spades':spades,'Clubs':clubs,'Hearts':hearts,'Diamonds':diamonds}
        print 'Deck Created'

    def get_card(self):
        while 1:
            #gets random suit
            self.suit=random.sample(self.deck,1)
            self.suitDict=self.deck[self.suit[0]]
            if self.suit[0] in self.deck:
                #get random key[CARD]
                self.cardKey=random.sample(self.suitDict,1)
                if self.cardKey[0] in self.suitDict:
                    #get card value
                    self.cardValue=self.deck[self.suit[0]].pop(self.cardKey[0])
                    break
                else:
                    self.get_card()
            else:
                self.get_card()
    def return_hand(self):
        self.get_card()
        return [self.suit,self.cardKey,self.cardValue]




d=Deck()
d.create_deck()
x = 52

while x!=0:
    print d.return_hand()
    x-=1

【问题讨论】:

  • 函数通常是一段代码,它应该做特定的事情。 get_card 做了什么(用你自己的话来说)?你注意到它是递归的吗?
  • 详细说明您要达到的目标以及问题的确切原因(预期行为与观察到的)
  • 它模拟从牌组中随机抽取一张牌。我确实将该功能分解为 3 个功能,但我认为将它们组合成一个功能会更好。
  • 我正在尝试打印所有 52 张卡片。
  • 好吧,当我运行它时,它在这条线上失败self.cardKey=random.sample(self.suitDict,1)。因为 self.suitDict 已经是空的了。

标签: python blackjack


【解决方案1】:

这个答案只是解决了您面临的特定问题,即没有从您的牌组中获得所有卡片。我进行了最低限度的更改,以使您的程序正常运行。您应该如何尝试使设计和代码更简洁。

这是代码:

import random

class Deck(object):

    def __init__(self,deck={},suit=[],suitDict={},cardValue=0,cardKey={}):
        self.deck=deck
        self.suit=suit
        self.suitDict=suitDict
        self.cardValue=cardValue
        self.cardKey=cardKey

    def create_deck(self):

        spades={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        hearts={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        diamonds={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        clubs={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
        self.deck={'Spades':spades,'Clubs':clubs,'Hearts':hearts,'Diamonds':diamonds}
        print 'Deck Created'

    def empty(self):
        return all(len(suit) == 0 for suit in self.deck.values())

    def get_card(self):
        while 1:
            if self.empty():
                break
            #gets random suit
            self.suit=random.sample(self.deck,1)
            self.suitDict=self.deck[self.suit[0]]
            if self.suitDict and self.suit[0] in self.deck:
                #get random key[CARD]
                self.cardKey=random.sample(self.suitDict,1)
                if self.cardKey[0] in self.suitDict:
                    #get card value
                    self.cardValue=self.deck[self.suit[0]].pop(self.cardKey[0])
                    break
                else:
                    self.get_card()
            else:
                self.get_card()

    def return_hand(self):
        self.get_card()
        return [self.suit,self.cardKey,self.cardValue]

d=Deck()
d.create_deck()
x = 52

while x!=0:
    print d.return_hand()
    x-=1

我建议您在此代码和您的代码之间运行一个差异,以确切了解发生了什么变化。

基本上:

  • 我添加了一个“empty()”布尔函数,用于检查牌组中是否没有剩余牌
  • 每次你选择一张新卡时,我都会检查你选择的self.suitDict 不为空,然后再尝试从中随机选择一张char。

【讨论】:

  • 这会打印每张卡片,但最后一张是重复的?
【解决方案2】:

我想通了[=

import random

class Deck(object):

def __init__(self,deck={}):
    self.deck=deck

def create_deck(self):

    spades={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
    hearts={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
    diamonds={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
    clubs={'Ace':[1,10,11],2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,'Jack':10,'Queen':10,'King':10}
    self.deck{'Spades':spades,'Clubs':clubs,'Hearts':hearts,'Diamonds':diamonds}

def get_card(self):

    while True:
        #picks random suit from deck // picks random key from deck dict.
        #returns card attr. in a tuple
        suit=random.choice(self.deck.keys())
        if len(self.deck[suit]) > 0:
            #picks random card from suit 
            card=random.sample(self.deck[suit],1)
            cardValue=self.deck[suit].pop(card[0])
            return (suit,card,cardValue)
        else:
            #deletes empty suit from deck.      
            del self.deck[suit]

然后这会随机打印出所有卡片:

deck=Deck()
deck.create_deck()
for i in range(52):
    print i,deck.get_card()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2020-05-18
    • 2014-10-22
    • 2022-11-12
    • 2012-10-16
    • 2015-06-02
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多