0

プログラム ( ) があり、そのコード内でblackjack.py別のプログラムの (cards.pyおよび) にアクセスします。games.pyこれのほとんどは本からのものなので、それがどのように機能するかを理解するのに苦労しています.

のコードは次のcards.pyとおりです。

class Card(object):
    """ A playing card. """
    RANKS = ["A", "2", "3", "4", "5", "6", "7",
             "8", "9", "10", "J", "Q", "K"]
    SUITS = ["c", "d", "h", "s"]
    def __init__(self, rank, suit, face_up = True):
        self.rank = rank
        self.suit = suit
        self.is_face_up = face_up

    def __str__(self):
        if self.is_face_up:
            rep = self.rank + self.suit
        else:
            rep = "XX"
        return rep

    def flip(self):
        self.is_face_up = not self.is_face_up


class Hand(object):
    """ A Hand of playing cards. """
    def __init__(self):
        self.cards = []

    def __str__(self):
        if self.cards:
            rep = ""
            for card in self.cards:
                rep += str(card) + "\t"
        else:
            rep = "<empty>"
        return rep

    def clear(self):
        self.cards = []

    def add(self, card):
        self.cards.append(card)

    def give(self, card, other_hand):
        self.cards.remove(card)
        other_hand.add(card)


class Deck(Hand):
    """ A deck of playing cards. """
    def populate(self):
        for suit in Card.SUITS:
            for rank in Card.RANKS:
                self.add(Card(rank, suit))

    def shuffle(self):
        import random
        random.shuffle(self.cards)

    def deal(self, hands, per_hand = 1):
        for round in range(per_hand):
            for hand in hands:
                if self.cards:
                    top_card = self.cards[0]
                    self.give(top_card, hand)
                else:
                    print "Can't continue deal. Out of cards!"

if __name__ == "__main__":
    print "This is a module with classes for playing cards."
    raw_input("\n\nPress the enter key to exit.")

のエラー チェックを作成blackjack.pyしていて、これまでに使用されたカードの数を収集する必要があります。の値の数にアクセスすることでそれができると思いますcards[]。問題は、それを行う方法がわからないことです。

ただし、これはすべて理論上の話です。「blackjack.py」コードも含めますので、皆さんは私が何をしようとしているのかを見て、私のロジックに欠陥があるかどうかを判断するのに役立ててください.

blackjack.py コード

あらゆるご意見をお待ちしております。

4

1 に答える 1

1

ここで意図した構造については完全には明確ではありませんが、いくつかのオプションがあります。

まず、モジュールcards.py内の関数またはクラスを使用するために、ステートメントを使用してそれらをインポートできます。これを行うには2つのスタイルがあります。blackjack.pyimport

# blackjack.py
import cards

モジュール内のすべてにアクセスできるようになり、前に。cardsを付けて各関数/クラスを呼び出しますcards.<name>Deckしたがって、クラスのインスタンスを初期化する場合は、

# blackjack.py
import cards
mydeck = cards.Deck()

もう1つの方法はfrom <X> import <Y>、プレフィックスを追加せずに関数とクラスにアクセスできるようにするです。例:

# blackjack.py
from cards import Deck  # or, to import everything, "from cards import *"
mydeck = Deck()

cards.Deckこれらのメソッドのいずれかにより、クラスのインスタンスが提供されます。

オプション0

これはクラス内ですでにわかります。これはDeck、からサブクラス化されているため、カードHandを使用するたびに、の属性から取り出されます。したがって、配られるカードの数は単純に次のようになります。giveDeckcards

class Deck(Hand):
    # ...
    def number_cards_used(self):
         return 52 - len(self.cards)

または、編集できない場合はcards.py、次の方法で指定したカードの残り数を取得できますDeck

# blackjack.py
def get_number_cards_used_from_deck(deck):
    return 52 - len(deck.cards)

使用中で:

# blackjack.py
import cards
mydeck = cards.Deck()
# ...
# Do other operations with deck
# ...
cards_used = get_number_cards_used_from_deck(mydeck)

オプション1

同時にプレイされているすべてのハンドとそれらのハンドのみを分離できる場合は、次のメソッドを実装できますcard_count

class Hand(object):
   # ...
   # other code
   # ....

   def card_count(self):
       return len(self.cards)

次に、たとえば、すべての手のリストがある場合は、次のようにすることができます。

sum(map(lambda h: h.card_count(), list_of_hands))

オプション2

あなたのDeckクラス内では、それはサブクラスHandなので、あなたは単に、しばしば更新されるであろう、配られたカードの別の実行中のリストを保持することができます。これは次のようになります。

class Deck(Hand):
    # ...
    # other code
    # ...

    def __init__(self):
        self.populate()
        self.used_cards = []

    def give(self, card, other_hand):
        self.used_cards.append(card)
        super(Deck, self).give(card, other_hand)

    def number_cards_used(self):
        return len(self.used_cards)

もちろん、他の方法もあります。

于 2012-11-25T06:03:00.100 に答える