属性错误21点Python

属性错误21点Python,python,attributeerror,blackjack,Python,Attributeerror,Blackjack,我不得不从我的教科书中修改这个程序来使用bets,但我甚至不能运行原来的程序。这是本书中出现的程序,除了每个类在不同的页面上。我不确定我是否需要把所有这些课程都打出来,因为我的教授说,使用21点程序并修改它以接受赌注,但它导入了牌组和卡片,所以我不确定。我把它们打出来以防万一,因为我想这不会有太大的伤害,也许我错了 class Card(object): RANKS=(1,2,3,4,5,6,7,8,9,10,11,12,13) SUITS=('Spades','Diamonds','

我不得不从我的教科书中修改这个程序来使用bets,但我甚至不能运行原来的程序。这是本书中出现的程序,除了每个类在不同的页面上。我不确定我是否需要把所有这些课程都打出来,因为我的教授说,使用21点程序并修改它以接受赌注,但它导入了牌组和卡片,所以我不确定。我把它们打出来以防万一,因为我想这不会有太大的伤害,也许我错了

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()
类卡(对象):
排名=(1,2,3,4,5,6,7,8,9,10,11,12,13)
套装=(‘黑桃’、‘钻石’、‘红心’、‘梅花’)
定义初始(自我、等级、诉讼):
self.rank=rank
西服
定义(自我):
如果self.rank==1:
王牌
elif self.rank==11:
rank='Jack'
elif self.rank==12:
女王
elif self.rank==13:
王牌
其他:
排名
返回str(秩)+of'+self.suit
随机输入
类组(卡片、对象):
定义初始(自我):
自助卡=[]
对于卡片中的套装。套装:
对于Card.RANKS中的等级:
c=卡片(等级、套装)
自我介绍卡。附加(c)
def随机播放(自):
随机。洗牌(自选卡)
def交易(自我):
如果len(self)==0:
一无所获
其他:
返回自我。\u卡。弹出(0)
定义(自我):
返回len(自卡)
定义(自我):
结果=“”
对于自助卡中的c:
result=result+str(c)+'\n'
返回结果
职业玩家(牌组、对象):
def _初始(自我,卡片):
自助卡=卡片
定义(自我):
结果=“,”.join(映射(str,self.\u卡))
结果+=“\n”+str(self.getPoints())+“points”
返回结果
def命中(自身、卡):
自身卡。附加(卡)
def获取点(自身):
计数=0
对于自助卡。\u卡:
如果卡片等级>9:
计数+=10
elif卡。等级==1:
计数+=11
其他:
计数+=卡的等级
对于自助卡。\u卡:
如果计数21:
打印(“你失败了”)
其他:
赛尔夫。经销商。命中(赛尔夫。甲板)
打印(“经销商:\n”,self.\u经销商)
dealerPoints=self.\u dealer.getpoints()
如果DealPoints>21:
打印(“经销商抓捕你赢了”)
elif DealPoints>playerPoints:
打印(“经销商获胜”)

elif dealerPoints看起来您在某些方法定义中遗漏了双下划线。它是
\uuuu init\uuuu
,而不是
\uu init\uuu
\uuuu str\uuuu
\uuu len\uuuu
和其他特殊类方法也是如此

这些特殊的方法名称必须完全书写,否则它们将无法工作。例如,如果您有一个名为
\uuuu init\uuu
的方法,那么当您实例化该类型的对象时,该方法中的代码将自动运行。因为您键入了错误,所以该方法从未运行,并且您的代码给出了错误

关于
\uuuu init\uuu
工作原理的简单说明:

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

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

你的游戏顺序也很奇怪,不像我知道的任何赌场。标准规则是:(1)庄家自然:玩家自然推,其他人输,游戏结束。(2) 球员们击球。自然付费。半身像马上就输了。(3) 经销商点击。如果破产,支付所有剩余的手,否则支付更好的总数…如果这个代码来自教科书,我当然希望它是一个坏例子。不,不要用作坏例子。Kenneth A.Lambert的《编程基础》是这本书的名字,如果有人在意的话。
class Player(object):
    def __init__(self):
        print 'new player object'

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