2017-04-30 37 views
0

私は、オブジェクト指向プログラミングと実践カウンティングカードに慣れるために、Pythonで単純なブラックジャックシミュレータを作っています。シミュレータは、これまでAttributeError: 'NoneType'オブジェクトに属性 'pop'がありません

import random 
cardvalues = {"1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, 
"8": 8, "9": 9, "10":10, "J": 10, "Q": 10, "K": 10, "A": 11} 
class Shoe(object): 
    def __init__(self): 
     amount = input("how many decks do you want in the shoe?\n>")  
     self.shoe = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"] * amount * 4 
     self.shoe = random.shuffle(self.shoe) 
    def deal(self): 
     pcard1 = self.shoe.pop() 
     pcard2 = self.shoe.pop() 
     comcard1 = self.shoe.pop() 
     comcard2 = self.shoe.pop() 
     handworth = cardvalues[pcard1] + cardvalues[pcard2] 
     print "You have been dealt a {} and a {}. The value of your cards is {}".format(pcard1, pcard2, hadworth) 
     print "The dealer has a {} and an other card that's faced down.".format(comcard1) 
class play(object): 
    def __init__(self): 
     print "welcome to blackjack simulator!" 
     print "You shall be playing at a 100 dollar minimum table, with a wallet of $5000,00" 
     my_shoe = Shoe() 
     my_shoe.deal() 
if __name__ == '__main__': 
    play() 

ために、次のようになり、エラーが、私はすぐにここでの問題は、ライン

self.shoe = random.shuffle(self.shoe) 

は私の全体のself.shoeになっていることであることを発見した

AttributeError: 'NoneType' object has no attribute 'pop' 

ましたそれをシャッフルする代わりにNoneにリストする。誰かがなぜこれが起こったのか、それをどう修正するのか説明してください。

私は問題を自分で解決しました。結局のところ、私は間違ったrandom.shuffleコマンドを使用しました。私が "self.shoe ="を削除すると、エラーなしで実行されました。

+3

'_init_'は' __init__'でなければなりません。この場合は助けになるかどうかわかりませんが、リンターを使用しようとしましたか? Pycharmには組み込みコマンドラインがあり、 'pylint'を使うことができます。 – user1685095

+0

あなたはprint文ではなくprint文を使用しています。つまり、Python 2.xを使用しています。言い訳はありません.3.1シリーズの最新のPython、つまり3.6.1からPythonを学ぶことは、最近始まっていません。 Python3を使った最新のチュートリアルを入手してください – Anthon

+0

私はまた、 'amount'がShoeの' __init__'メソッドへの引数として渡されることをお勧めします – cosmosa

答えて

2

__init__が_init_と誤って入力されているため、コンストラクタが呼び出されないため、属性self.shoeが決して設定されません。 (OPはすでにことを固定しているほか)取引()が実行されたときに、属性が

+0

ありがとう!私はそれを見ていないとは信じられない!それは問題を解決しますが、今は別の問題があります。カードをシャッフルした後、私のリストはNoneに変わります。それがなぜ起こったのか、それをどうやって修正すべきか知っていますか? –

+1

random.shuffleが発生し、Noneが返されます。これは、変更されたバージョンの引数を返す代わりに、引数の値が変更されたことを意味します。 したがって、self.shoeに割り当てるのではなく、random.shuffle(self.shoe)を入力する必要があります。 – PMonti

+0

真剣に、必要以上の作業はしないでください。 'random.sample'を使用してください – user1685095

-2
import random 
cardvalues = {"1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, 
"8": 8, "9": 9, "10":10, "J": 10, "Q": 10, "K": 10, "A": 11} 
def deal(): 
    cards, values = zip(*random.sample(cardvalues.items(), 2))) 
    print("You have been dealt a {} and a {}. The value of your cards is {}".format(*cards, sum(values))) 

オーケー存在していない、私は私のコメントで、元の問題を指摘してきたので、私は自分自身を繰り返すことはないでしょう。 なぜ私は別の解決法を示したのですか?どうやって?

  1. functionで十分であるクラスは作成されません。
  2. それはそう要約する不要な中間データ構造(self.shoes

を作成していません - あなたのコードはより良いリンクでビデオを視聴するために、それらを必要とせずに授業をすることはありません。リストを作成し、シャッフルしてポップアップするのではなく、random.sampleを使用してください。もちろん、python3を使用してください!

+1

ちょっとした説明を追加してください。 –

+0

何の説明? 'random.sample'や' zip'のapi? – user1685095

+1

元の問題は何だったのですか?あるいは、あなたがOPの問題を解決するのを助けなかったのはなぜか、代わりのアプローチを提供することを選んだのです。 –

関連する問題