3

私は現在、John Zelle の Python Programming: An Introduction to Computer Science に取り組んでいて、第 10 章で問題にぶつかっています。 . この演習では、名前付きのクラスを使用してnCard枚のカードを表示し、次のメソッドを必要とするプログラムを作成するように求められます。n個のランダム カードを生成するアプリ内からも呼び出せるようにする必要があります。

  1. __init__(self, rank, suit):
  2. getRank(self)
  3. getSuite(self)
  4. BJValue(self)
  5. __str__(self)

これはとてつもなく簡単なはずですが、このクラスを実装しようとして壁にぶつかりました。52 枚のカードのデッキを生成し、ユーザーに必要なカードの枚数を要求し、それらのカードを手札に入れる単純なアプリを作成しました。ハンドが生成されると、カード固有のクラスの恩恵を受ける場所がわかりません。これまでの作業コードは次のとおりです。

import random

class Card:
    def __init__(self, rank, suite):
        self.rank = rank
        self.suite = suite

    def getRank(self):
        return self.rank

    def getSuite(self):
        return self.suite

    def BJValue(self):
        if self.rank == 'Ace':
            return 1
        elif self.rank == 'Jack' or self.rank == 'Queen' or self.rank == 'King':
            return 10
        else:
        return int(self.rank)

    def __str__(self):
        return ('{0} of {1}'.format(self.rank, self.suite))


def shuffled_deck():
    deck = []
    for suite in ['Clubs', 'Diamonds', 'Hearts', 'Spades']:
        for num in ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']:
            deck.append([num, suite])
    random.shuffle(deck)
    return deck


def main():
    deck = shuffled_deck()
    hand = []
    print('>> Card Generator v1 <<')
    while True:
        try:
            n = int(input('Please enter the number of cards to display (1-7): '))
        except ValueError:
            print('Invalid input, please enter a number!\n')
        else:
            if n < 1 or n > 7:
                print('Please enter a number between 1-7!\n')
            else:
                break
    print('Your hand is:')
    for i in range(n):
        hand.append(deck[i])



main()

したがって、ランダムなn枚のカードの手札を生成すると、Card クラスを使用することでどのようなメリットがあるか、またはどこに実装するかさえわかりません。nは 1 ~ 7 の乱数であるため、各カード オブジェクトを格納し、各変数を のインスタンスに割り当てるにはnCard個の変数が必要です。特別なクラスを必要とせずに、手札にある各カードをhand[i]どこまで繰り返すかを示すことができましたが、それはこのプロジェクトから期待されていることではありません。この必要なクラスを利用できるように、この問題についてどのように考えるかについてのアドバイスを探しています。range(n)Card

4

2 に答える 2

11

コードで変更する必要があるのは、次の行を変更することだけのようです。

deck.append([num, suite])

deck.append(Card(num, suite))

これにより、deck変数は 52個のCardオブジェクトのリストになります。Cardオブジェクトには、2 つの項目のリスト ( など[num, suite]) にはない組み込み機能があるため、これは便利です。


2 つの例: 行を追加する場合

print hand

コードの後に​​、現在のコードは次のように出力されます

[["Jack", "Clubs"], ["9", "Spades"]]

新しいコードが印刷される間

[Jack of Clubs, 9 of Spades]

(線print "\n".join(map(str, hand)))は、実際に必要なものに近い場合があります)。次の行を使用して、ハンドのブラックジャックの合計値を取得することもできます。

sum(c.BJValue() for c in hand)
于 2013-01-22T21:10:23.783 に答える
0

Python のカード クラスには、u"\u2263" などを使用する __unicode__ メソッドが必要だと思います。カードを比較できるように、__eq__ および __gt__ メソッドとともに @functools.total_ordering で装飾することもお勧めします。さらに、「ソートされた」ビルトインは、カードのリストを適切にソートします。

于 2016-06-09T04:04:28.780 に答える