2013-05-08 71 views
1

我得到一個讀取這個錯誤的錯誤,無論我做什麼我都無法擺脫這段代碼。在python中遇到類問題

Traceback (most recent call last): 
    File "C:\Users\Ian\Desktop\BlackJack.py", line 226, in <module> 
    main() 
    File "C:\Users\Ian\Desktop\BlackJack.py", line 225, in main 
    blackjack.playgame() 
    File "C:\Users\Ian\Desktop\BlackJack.py", line 145, in playgame 
    self.firstround() 
    File "C:\Users\Ian\Desktop\BlackJack.py", line 83, in firstround 
    a=self.dealer.hand.append(DeckofCards.deal(DeckofCards.shuffledeck)) 
AttributeError: type object 'DeckofCards' has no attribute 'shuffledeck' 

以下是我寫的實際代碼(我爲了一起移動的錯誤發生了很大變化,但不能弄清楚是怎麼回事),我真的只是想有人脫脂在這裏告訴我有關明顯的錯誤,我確信有很多,我很抱歉,但我們的教授並沒有教導如何做事,然後只是期望我們知道如何。

from random import* 


class Card(object): 
    def __init__(self,suit,number): 
     self.suit=suit 
     self.number=number 

class DeckofCards(object): 
    def __init__(self,deck): 
     self.deck=deck 
     self.shuffledeck=self.shuffle() 
     #print(self.shuffledeck) 
    def shuffle(self): 
     #print('This is shuffle function') 
     b=[] 
     count=0 
     while count<len(self.deck): 
      a=randrange(0,len(self.deck)) 
      if a not in b: 
       b.append(self.deck[a]) 
       count+=1 
     return(b) 

    def deal(self): 
     if len(self.shuffledeck)>0: 
      return(self.shuffledeck.pop(0)) 
     else: 
      shuffle(self) 
      return(self.shuffledeck.pop(0)) 
class Player(object): 
    def __init__(self,name,hand,inout,money,score,bid): 
     self.name=name 
     self.hand=hand 
     self.inout=inout 
     self.money=money 
     self.score=score 
     self.bid=bid 
    def __str__(self): 
     x = self.name + ":\t" 
     x += "Card(s):" 
     for y in range(len(self.hand)): 
      x +=self.hand[y].face + self.hand[y].suit + " " 
     if (self.name != "dealer"): 
      x += "\t Money: $" + str(self.money) 
     return(x) 

class Game(object): 
    def __init__(self,deck, player): 
     self.player=Player(player,[],True,100,0,0) 
     self.dealer=Player("Dealer",[],True,100,0,0) 
     self.deck=DeckofCards(deck) 
     self.blackjack= False #self.blackjacksearch() 
    def blackjacksearch(self):#this is where it says there is an error we moved this because she said it needed to be in this class to get the Getot function 
     if self.player.hand.gettot()==21: 
      return True 
     else: 
      return False  
    def firstround(self): 
     self.player.inout=True 
     self.player.hand=[] 
     self.dealer.hand=[] 
     a=self.dealer.hand.append(DeckofCards.deal(DeckofCards.shuffledeck)) 
     print(a) 
     playerbid=int(input('How much would you like to bet?')) 
     self.player.bid=playerbid 
    def playturn(self): 
     while self.player.blackjack!=True or hit=='yes': 
      print(self.player.hand) 
      a=self.player.hand.append(deal()) 
      print('The card that you just drew is ' + str(a)) 
      print(gettot()) 
      hit=input('Would you like to hit? ') 
      if hit=='yes': 
       return(self.player.hand.append(deal())) 
      else: 
       return() #might need to change this 
     if self.player.blackjack==True: 
      print(self.player.name + " has blackjack ") 
     if hit=='no': 
      print (self.player.hand.gettot()) 
    def playdealer(self): 
     while self.dealer.hand<17: 
      self.dealer.hand.append(deal()) 
      dealerhand=self.dealer.hand.gettot() #confused 
      print(dealerhand) 
     if self.dealer.hand==21: 
      self.dealer.blackhjack=True 
     dealerhand1=self.dealer.hand.gettot() 
     print(dealerhand1) 

    def gettot(self,hand): 
     total=0 
     for x in self.hand: 
      if x==Card('H','A'): 
       b=total+x 
       if b>21: 
        total+=1 
       else: 
        total+=11 
      if x==Card('D','A'): 
       b=total+x 
       if b>21: 
        total+=1 
       else: 
        total+=11 
      if x==Card('S','A'): 
       b=total+x 
       if b>21: 
        total+=1 
       else: 
        total+=11 
      if x==Card('C','A'): 
       if b>21: 
        total+=1 
       else: 
        total+=11 
      else: 
       total+=x 
     return(total) 

    def playgame(self): 
     play = "yes" 
     while (play.lower() == "yes"): 
      self.firstround() 
      self.playturn() 
      if self.player.blackjack == True: 
       print(self.player.name + " got BLACKJACK! ") 
       self.player.money += self.player.bid * 1.5 
       print (self.player.name + " now has " + str(self.player.money)) 
       print("\n") 
       self.player.inout = False 
      if self.player.score > 21: 
       print(self.player.name + " lost with a tot of " + str(self.player.score)) 
       self.player.money -= self.player.bid 
       print (self.player.name + " now has " + str(self.player.money)) 
       print ("\n\n") 
       self.player.inout = False 
      self.playdealer() 
      if self.dealer.blackjack == True: 
       print("Dealer got blackjack, dealer wins\n") 
       self.player.money -= self.player.bid 
       print("Round\n") 
       print("\t",self.dealer) 
       print("\t",self.player) 
       print("\t Dealer has " + str(self.dealer.score) + ", " + self.player.name + " has " + str(self.player.score)) 
      elif self.player.inout == True: 
       print("Round\n") 
       print("\t",self.dealer) 
       print("\t",self.player) 
       print("\n\t Dealer has " + str(self.dealer.score) + ", " + self.player.name + " has " + str(self.player.score)) 
       if self.dealer.score > 21: 
        print("\t Dealer lost with a total of " + str(self.dealer.score)) 
        self.player.money += self.player.bid 
        print(self.player.name + " now has " + str(self.player.money)) 
       elif self.player.score > self.dealer.score: 
        print("\t" +self.player.name + " won with a total of " + str(self.player.score)) 
        self.player.money += self.player.bid 
        print("\t"+self.player.name + " now has " + str(self.player.money)) 
       else: 
        print("\t Dealer won with a total of " + str(self.dealer.score)) 
        self.player.money -= self.player.bid 
        print("\t"+self.player.name + " now has " + str(self.player.money)) 
      else: 
       print("Round") 
       print("\t",self.dealer) 
       print("\t",self.player) 
       if self.player.blackjack == False: 
        print("\t "+ self.player.name + " lost") 
       else: 
        print("\t "+self.player.name + " Won!") 

      if self.player.money <= 0: 
       print(self.player.name + " out of money - out of game ") 
       play = "no" 
      else: 
       play = input("\nAnother round? ") 
       print("\n\n") 
     print("\nGame over. ") 
     print(self.player.name + " ended with " + str(self.player.money) + " dollars.\n") 
     print("Thanks for playing. Come back soon!") 



ls= [Card('H','A'),Card('H','2'),Card('H','3'),Card('H','4'),Card('H','5'),Card('H','6'),Card('H','7'),Card('H','8'),Card('H','9'),Card('H','10'), 
Card('H','J'),Card('H','Q'),Card('H','K'), 
Card('S','A'),Card('S','2'),Card('S','3'),Card('S','4'),Card('S','5'), 
Card('S','6'),Card('S','7'),Card('S','8'),Card('S','9'),Card('S','10'), 
Card('S','J'),Card('S','Q'),Card('S','K'), 
Card('C','A'),Card('C','2'),Card('C','3'),Card('C','4'),Card('C','5'), 
Card('C','6'),Card('C','7'),Card('C','8'),Card('C','9'),Card('C','10'), 
Card('C','J'),Card('C','Q'),Card('C','K'), 
Card('D','A'),Card('D','2'),Card('D','3'),Card('D','4'),Card('D','5'), 
Card('D','6'),Card('D','7'),Card('D','8'),Card('D','9'),Card('D','10'), 
Card('D','J'),Card('D','Q'),Card('D','K')] 

'''tom=Card('Heart','Queen') 
print(tom.suit) 
print(DeckofCards(ls)) 
print(ls.suit)''' 

def main(): 
    x = input("Player's name? ") 
    blackjack = Game(ls,x) 
    blackjack.playgame() 
main() 
+0

最小工作示例總是優於發佈的代碼205線... – 2013-05-08 20:11:41

+1

你爲什麼不使用'shuffed = random.shuffe(甲板[:])' – 2013-05-08 20:11:57

+0

@JochenRitzel:'隨機的。 shuffle()'就地。 – Blender 2013-05-08 20:17:40

回答

0

shuffledeck屬性只存在的DeckOfCards實例中,改變DeckOfCards.shuffledeckDeckOfCards().shuffledeck

3

這行權是一個問題:

a=self.dealer.hand.append(DeckofCards.deal(DeckofCards.shuffledeck)) 
  • append回報None(不管你追加的),所以aNone
  • DeckofCards對象,而不是一個類的實例。您可能想要使用self.deck而不是DeckofCards

x==Card('S','A'):也不會工作。您尚未爲Card對象定義__eq__,因此比較不起作用(您將始終得到False)。

+0

我不知道__eq__是什麼,這是否與__init__不同,並且這也解釋了爲什麼當它返回一些我得到的: [<__ main __。0x025A4E50處的卡對象>]? – 2013-05-08 20:39:39

0
class Game(object): 
    def __init__(self,deck, player): 
     self.player=Player(player,[],True,100,0,0) 
     self.dealer=Player("Dealer",[],True,100,0,0) 
     self.deck=DeckofCards(deck) 
     self.blackjack= False #self.blackjacksearch() 
    def blackjacksearch(self):#this is where it says there is an error we moved this because she said it needed to be in this class to get the Getot function 
     if self.player.hand.gettot()==21: 
      return True 
     else: 
      return False  
    def firstround(self): 
     self.player.inout=True 
     self.player.hand=[] 
     self.dealer.hand=[] 
     a=self.dealer.hand.append(DeckofCards.deal(DeckofCards.shuffledeck)) 

您正在使用該類錯誤。 DeckofCards從未創建。

 a=self.dealer.hand.append(self.deck.deal(self.deck.shuffledeck))