2013-01-22 60 views
3

我目前正在通過John Zelle的Python編程:計算機科學入門,並在第10章中遇到困難。我在理解爲什麼以及如何做這個練習,並且需要一些幫助來解決這個問題。練習要求我創建一個程序,該程序顯示n使用名爲Card的類的卡片數量,並且需要以下方法。還應當調用從生成Ñ數的隨機數的應用中:作爲離譜如何按Python教程要求實現'class card'

  1. __init__(self, rank, suit):
  2. getRank(self)
  3. getSuite(self)
  4. BJValue(self)
  5. __str__(self)

容易的這應該是,我碰壁試圖實施這個類。我創建了一個簡單的應用程序,可以生成一副52張牌,提示用戶輸入他們想要的牌數,然後用這些牌填充牌。一旦手牌生成,我就無法看到卡牌特定的類別會從哪裏受益。這是我的工作到目前爲止的代碼:

import random 

class Card: 
    def __init__(self, rank, suite): 
     self.rank = rank 
     self.suite = suite 

    def getRank(self): 
     return self.rank 

    def getSuite(self): 
     return self.suite 

    def BJValue(self): 
     if self.rank == 'Ace': 
      return 1 
     elif self.rank == 'Jack' or self.rank == 'Queen' or self.rank == 'King': 
      return 10 
     else: 
     return int(self.rank) 

    def __str__(self): 
     return ('{0} of {1}'.format(self.rank, self.suite)) 


def shuffled_deck(): 
    deck = [] 
    for suite in ['Clubs', 'Diamonds', 'Hearts', 'Spades']: 
     for num in ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']: 
      deck.append([num, suite]) 
    random.shuffle(deck) 
    return deck 


def main(): 
    deck = shuffled_deck() 
    hand = [] 
    print('>> Card Generator v1 <<') 
    while True: 
     try: 
      n = int(input('Please enter the number of cards to display (1-7): ')) 
     except ValueError: 
      print('Invalid input, please enter a number!\n') 
     else: 
      if n < 1 or n > 7: 
       print('Please enter a number between 1-7!\n') 
      else: 
       break 
    print('Your hand is:') 
    for i in range(n): 
     hand.append(deck[i]) 



main() 

所以一旦我已經生成的隨機ñ手卡,我看不到我怎麼會受益於使用的卡類,或者即使來實現它。由於n是1-7之間的隨機數,我需要n存儲每個卡對象的變量數量,然後將每個變量分配給Card的實例。我可以用hand[i]來顯示每張牌,我不需要特殊的Card類就可以迭代到range(n),但這不是這個項目所期望的。我在尋找關於如何思考這個問題的建議,以便我可以使用這個必需的類。

+1

爲什麼你需要有n個變量?只需使用這些隨機卡的列表! –

+3

你爲什麼在2013學習Python中的getter和setter? –

+1

你是指「西裝」而不是「套裝」? –

回答

11

它看起來像你需要在你的代碼改變的唯一的事情就是改變行:

deck.append([num, suite]) 

deck.append(Card(num, suite)) 

這使得deck變量52個Card對象的列表。這很有用,因爲Card對象具有一些內置功能,即兩個項目的列表(如[num, suite])沒有。


兩個例子:如果你的代碼之後加入該行

print hand 

,當前的代碼將打印出類似這樣

[["Jack", "Clubs"], ["9", "Spades"]] 

,而你的新代碼將打印

[Jack of Clubs, 9 of Spades] 

(行在實踐中可能更接近你想要的)。你也可以得到你的手的總價值二十一點與線:

sum(c.BJValue() for c in hand) 
+0

太棒了!這是我需要的概念。並且非常感謝額外的總和代碼。這將是我在這之後解決的下一個問題。 –

+0

我做了你建議的改變,然後通過手中的迭代: '用於手中的卡片:print(card.getRank())'現在我看到了創建每張卡片的對象的價值。你從來不用名字叫牌,你可以用手叫牌。這是我的困惑所在,決定如何以可調用的方式識別每個卡片對象。 –

0

我想在python任何卡類應該有一個使用U「\ u2263」等一個__unicode__方法 - 只是爲了好玩。我還建議使用@ functools.total_ordering和__eq__和__gt__方法來裝飾它,以便比較卡;此外,內置的「已分類」將適當地對卡片列表進行分類。