2014-11-21 3 views
1

내기를 사용하려면이 텍스트 북에서이 프로그램을 수정해야하지만 원래 프로그램을 실행할 수 없습니다. 이 책은 각 학급이 다른 페이지에있는 것을 제외하고는 책에 나와있는 프로그램입니다. 교수님이 블랙 잭 프로그램을 가져 와서 베팅을 수락한다고 말했기 때문에 모든 수업을 타이핑해야할지 모르겠지만 갑판과 카드를 가져와 잘 모르겠습니다. 나는 그것이 잘못한 것 같지 않다고 생각했기 때문에 그들을 위해 타이핑했다.속성 오류 블랙 잭 파이썬 (고정)

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) 딜러 히트. 흉상이라면 남아있는 모든 손을 지불하고 그렇지 않으면 더 좋은 총액을 지불하십시오. –

+0

...이 코드가 교과서에서 나온 것이라면, 나는 그것이 나쁜 예라고 생각하기를 바랍니다. –

+0

나쁜 예로 사용하지 마십시오. Kenneth A. Lambert의 프로그래밍 기초는 누구라도 신경 쓰면 책의 이름입니다. – wees

관련 문제