標準のデッキで見られるよりも複雑なトランプの種類のクラスを作る良い方法は?


9

私はオブジェクト指向プログラミングに非常に慣れていないので、単純なカードゲームを作ることでpythonでの学習を始めようとしています(伝統的なようです!)。私は正常に動作する次の例を実行し、PlayingCard()クラスのインスタンスを作成するためにクラスの複数のインスタンスを作成することについて教えてくれますDeck()

class PlayingCard(object):
    def __init__(self, suit, val):
        self.suit = suit
        self.value = val

    def print_card(self):
        print("{} of {}".format(self.value, self.suit))

class Deck(object):
    def __init__(self):
        self.playingcards = []
        self.build()

    def build(self):
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(1,14):
                self.playingcards.append(PlayingCard(s,v))

deck = Deck()



標準の52デッキだけではなく、より複雑なカードを使って何かを作りたいと思っています(値が適切に増加している)。私が念頭に置いているデッキはモノポリーカードゲームです。

ここに画像の説明を入力してください

カードには、ACTIONカード、PROPERTYカード、MONEYカードの3つの基本的なタイプがあります。アクションカードはさまざまなアクションを実行し、プロパティカードはさまざまなカラーセットに属し、マネーカードはさまざまな値を持つことができます。さらに、プロパティカードは「ワイルドカード」にすることができ、2つのセットのいずれかの一部として使用できます。最後に、すべてのカードには同等の金額値があります(各カードの上隅に示されています)。レントアクションカードでは、カードはカードに示されているカラープロパティにのみ適用できます。

私の質問は、一般的にこのような状況をどのように処理するかであり、クラスベースのpythonプログラムにこれらの異なるカードを含めるための良い方法は何でしょうか?私は単一のPlayingCard()クラスを保持し、のような多くの入力を保持する必要がありPlayingCard(type="PROPERTY", value="3M")ます。それともなど、別々のクラスを作成する方が良いだろうActionPlayingCard()PropertyPlayingCard()などを?それとももっと良い方法がありますか?私が言うように、私はここで私の学習の初めであり、より高いレベルの設計の観点からこれらのタイプの状況を整理する方法。

どうもありがとう。


異なるタイプのカードがいくつかの機能を共有していることがわかった場合は、継承、または抽象クラスを使用することもできます。ファクトリーパターンを読んで使用できるため、カードのタイプを渡すことができ、適切なクラスが使用されます
Tomerikoo

@Tomerikooそれを指摘してくれてありがとう-あなたが言及したファクトリーパターンについて少し読んだ。私が理解しているように、これは、作成する必要のあるオブジェクトのクラスが事前にわからない場合(おそらく実行時にのみ知っている場合)に最も役立ちます。ただし、この場合、デッキ全体の外観(各タイプのカードの数、各カードの機能など)がわかっているので、ここでファクトリーパターンを適用できますか?
teeeeee

回答:


3

OOPの問題に取り組む場合、通常は動作とプロパティを再利用可能な方法でモデル化する必要があります。つまり、抽象化について考え、それに基づいてクラス階層を編成する必要があります。

私は次のようなものを書きます:

class Card:
    def __init__(self, money_value=0):
        self.money_value = money_value

class ActionCard(Card):
    def __init__(self, action, money_value=0):
        super().__init__(money_value=money_value)

        self.action = action

class RentActionCard(ActionCard):
    def __init__(self, action, color, money_value=0):
        super().__init__(action, money_value=money_value)

        self.color = color

    def apply(self, property_card):
        if property_card.color != self.color:
            # Don't apply
        # Apply

class PropertyCard(Card):
    def __init__(self, color, money_value=0):
        super().__init__(money_value=money_value)

        self.color = color

class WildcardPropertyCard(PropertyCard):
    def __init__(self, color, money_value=0):
        super().__init__(color, money_value=money_value)

class MoneyCard(Card):
    def __init__(self, money_value=0):
        super().__init__(money_value=money_value)

よるPythonは動的型付け言語であること、OOPは少し難しく、我々はちょうどに頼ることができるので、私の意見で正当化することでダックタイピング動的結合あなたの階層を整理する方法はそれほど重要ではありません、。

たとえば、この問題をC#でモデル化する場合、多型に依存してさまざまなタイプを表し、分析されているカードのタイプに基づいてロジックのフローを導くことができるため、上記の階層を間違いなく使用します。

いくつかの最後の発言:

  1. Pythonには非常に強力な組み込み型がありますが、ほとんどの場合、それらに基づいて構築される新しいカスタム型を使用すると、作業が楽になります。
  2. Python 3のobject型(現在のところ維持されている唯一の型)はobjectデフォルトで継承するため、継承する必要はありません。

しかし、結局のところ、完全な答えはありません。最善の方法は、両方のアプローチを試し、より快適なものを確認することです。


7

これらは、「設計の決定」と呼ばれるものです。多くの場合、「正しい」方法は意見の問題です。初心者として、両方の実装を試して、それらがどのように機能するかを確認することは有益だと思います。どちらを選択してもトレードオフがあります。あなたはそれらのトレードオフのどれが最も重要かを決定しなければなりません。これらの種類の決定は、経験を積むにつれて通知されます。


はい、ありがとうございます。私はあなたが言うとおりにやっています-良いアプローチを本能的に知り、うまくいけばその理由を理解するのに十分な経験を積んだ人々からのガイダンスを探しています。
teeeeee

2

継承を使用できます。ここで、メインクラスを作成し、サブクラスを作成します。サブクラスには、母クラスの関数と値が含まれていますが、その特定のクラスに追加の値と関数を含めることもできます。

class Apple:
    def __init__(self, yearMade):
        pass

    def ring(self):
        print('ring ring')

class iPhone(Apple):
    def __init__(self, number)
        number = number

    def func():
        pass

これで、iPhoneクラスにAppleクラスと同じ機能と独自の機能が追加されました。継承について詳しく知りたい場合は、いくつかの調査を行うことをお勧めします。


ありがとう、私は継承とその仕組みを理解しています。しかし、モノポリーデッキの特性を考えると、私の特定の状況にそれをどのように適用できるかに興味があります。
teeeeee

@teeeeee各カードには値があるので、それらを交換してプレイすることができ、クラスで関数/手順を作成してこれらのイベントを処理し、サブクラスの特定のカードに追加の属性と関数を持つことができます。
MoriartyPy

0

独占については、ゲームの着陸の視点を設計します。カードではありません。カードは単に現実世界の着陸を表しています。


詳しく説明してください。
teeeeee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.