我正在通过构建一个黑杰克游戏来学习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>>
$
答案 0 :(得分:2)
我修改了你的程序。我介绍了一个构造函数,并将deck的表示形式更改为列表而不是字典,并将其设置为属于您在行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()
答案 1 :(得分:1)
你应该通过the Python tutorial。你的代码有很多问题。最基本的是,你正在使用类作为一个包来保存函数,而不是实际上将deck数据作为类实例的一部分。也就是说,您将套牌作为字典返回,然后将其传回另一个函数。最好将牌组存储在一个属性中(例如self.deck
),然后让其他函数使用它。
无论如何,它不打印字典的原因很简单。你这样做:
temp_deck = DECK()
print temp_deck
因此,您创建一个变量temp_deck
并将其设置为类DECK的新实例。然后你打印它。好吧,当然它不会打印字典。 temp_deck
不是字典。这是一个DECK对象。如果您想要使用当前代码的字典,则需要像对原始套牌一样进行temp_deck.load_deck()
,然后打印出结果。