私と一緒にクマしてください-私は、オブジェクト指向プログラミングに非常に新しいです、とシンプルなカードゲームをすることによって、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つの基本的な種類があります。アクションカードは異なるアクションを実行し、プロパティカードは、異なる色のセットに属し、マネーカードは、異なる値を持つことができます。さらに、プロパティ・カードは、「ワイルドカード」とすることができ、二組のうちの一方の一部として使用することができます。最後に、すべてのカードは、(各カードの上部の角に示されている)同等のお金の価値を持っています。家賃のアクションカードでは、カードは、カードに表記されている色のプロパティに適用することができます。
私の質問は、このような状況を処理する方法だけで、一般的に、そして何がクラスベースのPythonプログラムでこれらの異なるカードを含めるための良い方法だろうか?私は私の単一おくべきPlayingCard()
クラス、そしてちょうどのような多くの入力を、持っていますPlayingCard(type="PROPERTY", value="3M")
。それともなど、別々のクラスを作成する方が良いだろうActionPlayingCard()
、PropertyPlayingCard()
などを?またはより良い方法はありますか?私が言うように、私はここに私の学習の初めに思い、そしてどのように高いレベルのデザインの面での状況、これらの種類を整理します。
どうもありがとう。
あなたが持つ問題に近づいている場合は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#たとえば、私はに依存している可能性があるため、私は疑いも使用せずに階層は、上記示したでしょう多型の異なる種類を表し、分析されているカードの種類に基づいて、私のロジックの流れを案内します。
最終的発言のカップル:
- Pythonは非常に強力な組み込みタイプがありますが、ほとんどの時間は、それらのビルドは、あなたの人生が容易になりますことを新しいカスタムタイプを使用します。
- あなたは継承する必要はありません
object
でタイプ以来のPython 3を継承(今日のよう維持一つだけである)object
、デフォルトで。
しかし、一日の終わりに、最善の方法は、アプローチの両方を試してみて、あなたとより快適にしているかを確認するだろう、完璧な答えはありません。