1

我正在通过构建二十一点游戏来学习 python(具有 VBA 背景)(是的,我以二十一点为例提出了很多问题)

这是我的代码:

import random

class DECK():
    def load_deck(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        full_deck = {}
        i = 0
        for s in suite:
            for r in rank:
                full_deck[i] = "%s of %s" % (r, s)
                i += 1
        return full_deck

    def pick_item(self, deck):   
        card_key = random.choice(deck.keys())  
        new_card = deck[card_key] 
        del deck[card_key]  
        return (deck, new_card)

    def missing_card(self, deck):
        temp_deck = DECK()
        print temp_deck

d1 = DECK()

deck1 = d1.load_deck()

deck1, card1 = d1.pick_item(deck1)

print card1

d1.missing_card(d1)

这是我在终端中得到的(文件名hand_c.py

$ python hand_c.py
Ace of Clubs
<__main__.DECK instance at 0x10bb0d248>
$ 

为什么一个功能起作用pick_item,而另一个不起作用missing_card

根据第一个答案,我将函数定义更改为:

    def missing_card(self, deck):
    deckC1 = DECK()
    temp_deck = deckC1.load_deck
    print temp_deck

但现在我从终端得到以下信息:

$ python hand_c.py
Jack of Diamonds
<bound method DECK.load_deck of <__main__.DECK instance at 0x10500e248>>
$ 
4

2 回答 2

2

我修改了你的程序来工作。我引入了一个构造函数,并将您的牌组的表示更改为列表而不是字典,并将其设置为属于您在行中创建的牌组的实例变量d1 = DECK()。现在,您类中的每个方法都可以访问您的套牌,而无需向世界透露您对套牌的内部表示,您只需使用一个 DECK 对象。

import random

class DECK():
    def __init__(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        self.full_deck = []
        for s in suite:
            for r in rank:
                self.full_deck.append("%s of %s" % (r, s))

    def pick_item(self):
        card_key = random.randint(0, len(self.full_deck)-1)  
        new_card = self.full_deck[card_key] 
        del self.full_deck[card_key]  
        return new_card

    def missing_card(self):
        print self.full_deck

d1 = DECK()
card1 = d1.pick_item()

print card1

d1.missing_card()
于 2012-08-09T05:20:35.787 回答
1

您应该阅读Python 教程。你的代码有很多问题。基本上,您只是将类用作保存函数的包,而实际上并未将卡片组数据保存为类实例的一部分。也就是说,您将卡片组作为字典返回,然后将其传递回另一个函数。最好将卡片组存储在一个属性中(例如self.deck),然后让其他功能使用它。

无论如何,它不打印字典的原因很简单。你来做这件事:

    temp_deck = DECK()
    print temp_deck

因此,您创建一个变量temp_deck并将其设置为等于 DECK 类的一个新实例。然后你打印它。好吧,它当然不会打印字典。 temp_deck不是字典。这是一个甲板对象。如果您想要使用当前代码的字典,则需要temp_deck.load_deck()像使用原始牌组一样进行操作,然后打印结果。

于 2012-08-09T05:07:42.277 回答