2014-11-21 45 views
1

我必須從我的課本修改這個程序來使用下注,但我甚至不能讓原來的程序運行。這是該書中出現的程序,除了每個課程在不同的頁面上。我不確定是否需要輸入所有這些課程,因爲我的教授說要拿二十一點計劃並修改它來接受投注,但是它會導入甲板和卡片,所以我不確定。我將它們輸入以防萬一,因爲我認爲它不會造成太大的傷害,也許我錯了。屬性錯誤Blackjack Python(固定)

class Card(object): 

    RANKS=(1,2,3,4,5,6,7,8,9,10,11,12,13) 
    SUITS=('Spades','Diamonds','Hearts','Clubs') 

    def _init_(self,rank,suit): 
    self.rank=rank 
    self.suit=suit 

    def _str_(self): 
    if self.rank==1: 
     rank='Ace' 
    elif self.rank==11: 
     rank='Jack' 
    elif self.rank==12: 
     rank='Queen' 
    elif self.rank==13: 
     rank='King' 
    else: 
     rank=self.rank 
    return str(rank)+ ' of ' + self.suit 

import random 

class Deck(Card,object): 

    def _init_(self): 
    self._cards=[] 
    for suit in Card.SUITS: 
     for rank in Card.RANKS: 
      c=Card(rank,suit) 
      self._cards.append(c) 

    def shuffle(self): 
    random.shuffle(self._cards) 

    def deal(self): 
    if len(self)==0: 
     return None 
    else: 
     return self._cards.pop(0) 

    def _len_(self): 
    return len(self._cards) 

    def _str_(self): 
    result='' 
    for c in self._cards: 
     result= result+str(c)+'\n' 
    return result 

class Player(Deck,object): 

    def _init_(self, cards): 
    self._cards= cards 

    def _str_(self): 
    result=",".join(map(str,self._cards)) 
    results += "\n " + str(self.getPoints()) + " points" 
    return result 

    def hit(self,card): 
    self._cards.append(card) 

    def getPoints(self): 
    count=0 
    for card in self._cards: 
     if card.rank>9: 
      count+=10 
     elif card.rank==1: 
      count+=11 
     else: 
      count+=card.rank 
    for card in self._cards: 
     if count <=21: 
      break 
     elif card.rank==1: 
      count -= 10 
    return count 

    def hasBlackjack(self): 
    return len(self._cards)==2 and self.getpoints()==21 

class Dealer(Player,object): 

    def _init_(self,cards): 
    Player._init_(self,cards) 
    self._showOneCard= True 

    def _str_(self): 
    if self._showOneCard: 
     return str(self._cards[0]) 
    else: 
     return Player._str_(self) 

    def hit(self,deck): 
    self._showOneCard= False 
    while self.getPoints() <17: 
     self.Cards.append(deck.deal()) 

class Blackjack(Player, object): 

    def _init_(self): 
    self._deck = Deck() 
    self._deck.shuffle() 

    self._player = Player([self._deck.deal(), 
          self._deck.deal()]) 
    self._dealer = Dealer([self._deck.deal(), 
          self._deck.deal()]) 

    def play(self): 
    print ("Player:\n", self._player) 
    print ("Dealer:\n", self._dealer) 
    while True: 
     choice = input("Do you want to hit? [y/n]: ") 
     if choice in ("Y","y"): 
      self._player.hit(self._deck.deal()) 
      points = self._player.getPoints() 
      print ("Player:\n", self._player) 
      if points >= 21: 
       break 
     else: 
      break 
    playerPoints = self._player.getPoints() 
    if playerPoints> 21: 
     print ("You bust and lose") 
    else: 
     self._dealer.hit(self._deck) 
     print ("Dealer:\n", self._dealer) 
     dealerPoints=self._dealer.getpoints() 
     if dealerPoints >21: 
      print ("Dealer busts you win") 
     elif dealerPoints>playerPoints: 
      print ("Dealer wins") 
     elif dealerPoints<playerPoints and playerPoints <= 21: 
      print ("You win") 
     elif dealerPoints == playerPoints: 
      if self._player.hasBlackjack() and not self._dealer.hasBlackjack(): 
       print ("You win") 
     elif not self._player.hasBlackjack() and self._dealer.hasBlackjack(): 
      print ("Dealer wins") 
     else: 
      print ("There is a tie") 

Blackjack().play() 

我得到

Traceback (most recent call last): 
File "C:\Users\Schuler\bj.py", line 151, in <module> 
Blackjack().play() 
File "C:\Users\Schuler\bj.py", line 117, in play 
print ("Player:\n", self._player) 
AttributeError: 'Blackjack' object has no attribute '_player' 

我直接複製一切從書中,我無法弄清楚什麼是錯的。

_____ 編輯 _____

因此有人指出,我忘了雙下劃線,所以我固定的。然後,我跑了10次,發現它現在運行的小拼寫錯誤。

回答

1

它看起來像你遺漏了你的一些方法定義的雙下劃線。它是__init__,而不是_init___str____len__以及其他特殊類方法也是如此。

這些特殊的方法名稱必須準確寫入否則它們將不起作用。例如,如果您有一個名爲__init__的方法,那麼當您實例化該類型的對象時,該方法中的代碼將自動運行。由於您輸入的方式錯誤,該方法從未運行且您的代碼發生了錯誤。

如何__init__作品的一個簡單的例子:

class Player(object): 
    def __init__(self): 
     print 'new player object' 

Player() # __init__() called automatically and prints 'new player object' 
+0

您的播放順序是太奇怪,不像我所知道的任何賭場。標準規則是:(1)經銷商自然:球員自然推動,其他球員輸球,比賽結束。 (2)球員擊中。自然支付。胸圍立即丟失。 (3)經銷商點擊。如果失敗,請支付所有剩餘的手,否則支付更好的總計。 – 2014-11-21 17:05:41

+0

...如果這段代碼來自教科書,我當然希望它的意圖是一個壞榜樣。 – 2014-11-21 19:29:56

+0

沒有用作不好的例子。 Kenneth A. Lambert的編程基礎是任何人關心的書的名稱。 – wees 2014-12-03 21:52:23