2017-07-27 4 views
2

カードを扱うプログラムを作成しようとしていますが、カードオブジェクトを1人のプレイヤーに渡すと、属性 "手"1つしか指定されていない場合、オブジェクトは複数のオブジェクトクラス属性に追加されます

コードは以下のとおりです。ご了承ください! stackoverflowインデント形式を正しく実行しなかった場合は、私の謝罪します。質問を投稿するのは初めてのことです。

import random 

    class Player(object): 
     def __init__(self,name,balance=100,hand=[]): 
      self.name = name 
      self.balance = balance 
      self.hand = hand 

     def reveal_all(self): 
      ''' 
      This method prints out a player's hand. 
      ''' 
      reveal = [] 
      for x in self.hand: 
       reveal = reveal + [x.name] 
      print(reveal) 

    class Card(object): 
     def __init__(self,name,val): 
      self.name = name 
      self.val = val 

    card_ob1 = Card('2 of Hearts',2) 
    card_ob2 = Card('3 of Hearts',3) 
    card_ob3 = Card('4 of Hearts',4) 
    card_ob4 = Card('5 of Hearts',5) 
    card_ob5 = Card('6 of Hearts',6) 
    card_ob6 = Card('7 of Hearts',7) 
    card_ob7 = Card('8 of Hearts',8) 
    card_ob8 = Card('9 of Hearts',9) 

    deck = [card_ob1,card_ob2,card_ob3,card_ob4,card_ob5,card_ob6,card_ob7,card_ob8] 

    def plyr1_geta_card(): 
     card = random.choice(deck) 
     player1obj.hand += [card] 
     deck.remove(card) 

    def dealer_geta_card(): 
     card = random.choice(deck) 
     dealerobj.hand.append(card) 
     deck.remove(card) 

    player1obj = Player('Me',100) 
    dealerobj = Player('The House') 

    # Player 1 gets a card 
    plyr1_geta_card() 

    # The card is added to both the dealer and player hand attribute for some reason! 
    dealerobj.reveal_all() 

    player1obj.reveal_all() 

答えて

1

問題はPlayerオブジェクトのあなたの__init__から来て、あなたの方法で、handは、プレーヤーのすべてのインスタンス間で共有されます:セクション9.3.5. Class and Instance Variableshttps://docs.python.org/3/tutorial/classes.htmlに見られるように。

def plyr_geta_card(player): 
    card = random.choice(deck) 
    player.hand.append(card) 
    deck.remove(card) 
:クイックフィックスは、それはあなたが何をするかのようにプレイヤーにカードを追加するための関数を書くのは良い習慣ではありません、ところで

def __init__(self,name,balance=100,hand=[]): 
     self.hand = [] 
     self.name = name 
     self.balance = balance 
     self.hand.extend(hand) 

する必要があり、代わりにのようなプレイヤオブジェクトを受信するための関数であるべき

+0

ありがとうございますminhhn2910。それが私の問題を解決し、私はチュートリアルのリンクを読むでしょう。私のplyr1_geta_card機能を改善してくれてありがとう。私がそれをやっていた方法は、各選手オブジェクトのための別の機能が必要になります。あなたの道ははるかにクリーンです。 –

+0

@black_lab_fan可能であればupvoteを考えてみるか、正解としてください:) – minhhn2910

+0

私は投票しました。私はそれが記録されたことを通知されましたが、公開されていません。私はチェックボックスを逃しました...それを今クリックしてください。 –

関連する問題