属性错误Blackjack Python(固定)
问题描述:
我必须从我的课本修改这个程序来使用下注,但我甚至不能让原来的程序运行。这是该书中出现的程序,除了每个课程在不同的页面上。我不确定是否需要输入所有这些课程,因为我的教授说要拿二十一点计划并修改它来接受投注,但是它会导入甲板和卡片,所以我不确定。我将它们输入以防万一,因为我认为它不会造成太大的伤害,也许我错了。属性错误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次,发现它现在运行的小拼写错误。
答
它看起来像你遗漏了你的一些方法定义的双下划线。它是__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'
您的播放顺序是太奇怪,不像我所知道的任何赌场。标准规则是:(1)经销商自然:球员自然推动,其他球员输球,比赛结束。 (2)球员击中。自然支付。胸围立即丢失。 (3)经销商点击。如果失败,请支付所有剩余的手,否则支付更好的总计。 – 2014-11-21 17:05:41
...如果这段代码来自教科书,我当然希望它的意图是一个坏榜样。 – 2014-11-21 19:29:56
没有用作不好的例子。 Kenneth A. Lambert的编程基础是任何人关心的书的名称。 – wees 2014-12-03 21:52:23