1

私はブラックジャックゲームを構築することでPython(VBAのバックグラウンドを持つ)を学んでいます(はい、例としてブラックジャックを使用してたくさんの質問をしました)

これが私のコードです:

import random

class DECK():
    def load_deck(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        full_deck = {}
        i = 0
        for s in suite:
            for r in rank:
                full_deck[i] = "%s of %s" % (r, s)
                i += 1
        return full_deck

    def pick_item(self, deck):   
        card_key = random.choice(deck.keys())  
        new_card = deck[card_key] 
        del deck[card_key]  
        return (deck, new_card)

    def missing_card(self, deck):
        temp_deck = DECK()
        print temp_deck

d1 = DECK()

deck1 = d1.load_deck()

deck1, card1 = d1.pick_item(deck1)

print card1

d1.missing_card(d1)

これが私がターミナル(ファイル名hand_c.pyで取得するものです:

$ python hand_c.py
Ace of Clubs
<__main__.DECK instance at 0x10bb0d248>
$ 

なぜ一方の関数は機能するpick_itemが、もう一方は機能しないのmissing_cardですか?

最初の答えに従って、関数定義を次のように変更しました。

    def missing_card(self, deck):
    deckC1 = DECK()
    temp_deck = deckC1.load_deck
    print temp_deck

しかし今、私はターミナルから次のものを取得します:

$ python hand_c.py
Jack of Diamonds
<bound method DECK.load_deck of <__main__.DECK instance at 0x10500e248>>
$ 
4

2 に答える 2

2

プログラムを動作するように変更しました。コンストラクターを導入し、デッキの表現を辞書ではなくリストに変更し、行で作成したデッキに属するインスタンス変数にしましたd1 = DECK()。クラス内のすべてのメソッドは、デッキの内部表現を世界に公開することなく、デッキにアクセスできるようになり、1つのDECKオブジェクトを操作するだけで済みます。

import random

class DECK():
    def __init__(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        self.full_deck = []
        for s in suite:
            for r in rank:
                self.full_deck.append("%s of %s" % (r, s))

    def pick_item(self):
        card_key = random.randint(0, len(self.full_deck)-1)  
        new_card = self.full_deck[card_key] 
        del self.full_deck[card_key]  
        return new_card

    def missing_card(self):
        print self.full_deck

d1 = DECK()
card1 = d1.pick_item()

print card1

d1.missing_card()
于 2012-08-09T05:20:35.787 に答える
1

Pythonチュートリアルを実行する必要があります。コードには多くの問題があります。最も基本的には、クラスインスタンスの一部としてデッキデータを実際に保持することなく、関数を保持するためのバッグとしてクラスを使用しています。つまり、デッキを辞書として返し、それを別の関数に戻します。デッキを属性(たとえば)に格納してから、self.deck他の関数にそれを使用させる方がよいでしょう。

とにかく、辞書を印刷しない理由は非常に単純です。これをして:

    temp_deck = DECK()
    print temp_deck

したがって、変数を作成し、temp_deckそれをクラスDECKの新しいインスタンスと等しくなるように設定します。次に、それを印刷します。もちろん、辞書は印刷されません。 temp_deck辞書ではありません。これはDECKオブジェクトです。現在のコードで辞書が必要temp_deck.load_deck()な場合は、元のデッキで行ったのと同じようにして、その結果を印刷する必要があります。

于 2012-08-09T05:07:42.277 に答える