質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

717閲覧

親クラスの変数を子クラスで共有したい

ataoka

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/17 14:44

前提・実現したいこと

簡単なトランプゲームを作ろうとしています。
山札クラス1つと、プレイヤークラスを複数定義して、プレイヤーがドローしたカードを山札から削ることを考えています。

その時の、子クラスのプレイヤーでライブラリーを共有する方法を教えていただけないでしょうか。

発生している問題・エラーメッセージ

子クラスで、ライブラリーを共有する方法がわかりません。

該当のソースコード

python

1class deck: 2 def __init__(self): 3 cards = [] 4 #簡略化のため、ライブラリーは5枚にしています 5 for i in range(1,6): 6 cards.append(i) 7 random.shuffle(cards) 8 self.cards_ = cards 9 10 def draw_cards(self, num=1): 11 self.cards_ = self.cards_[num:] 12 return self.cards_[:num] 13 14class player(deck): 15 def __init__(self, num=2): 16 super().__init__() 17 self.hand_ = self.draw_cards(num)

イメージとしては、以下のような動作をさせたいと考えています。

python

1player1 = player(2) 2player2 = player(2)#player1,2で異なるカードを引く 3 4lib = [1] #二人のプレイヤーが2枚ずつカードを引いて、残りの1枚のライブラリーを取得する

補足情報

クラスの勉強を始めたところで、クラスを使いたいと考えています。
単語や質問内容に不備がありましたらすみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

註: 直接的な回答ではありません

そもそも論になってしまいますが、継承関係が変です。
継承しているということは、**『PlayerはDeckの一種である』**と言っているようなものだからです。

Deckがshuffleメソッドを提供していたなら、
Playerも同じようにshuffleメソッドを持つことになります。なんか変ですよね。


PlayerにDeckインスタンスを渡すのが適当でしょう。

Python

1deck = Deck() 2 3player1 = Player('太郎') 4player2 = Player('次郎') 5 6player1.draw(2, deck) 7player2.draw(2, deck)

Python

1class Cards: 2 ... 3 4 def shuffle(...): 5 ... 6 7class Deck(Cards): 8 ... 9 10class Hands(Cards): 11 ... 12 13 def pick_from(self, frm, n): 14 ... 15 16class Player: 17 def __init__(self) 18 self._hand = Hand() 19 20 def draw(self, deck, n): 21 self._hand.pick_from(deck, n)

このようにDeckとHandsに共通の親を持たせてやると、
『Playerの手札をシャッフルする』とか『ソートする』といった処理が簡単に書けます。

これは一つの案に過ぎません。
正解などありませんから、いろいろと設計を考え、しっくり来るものを選んでみて下さい。

投稿2020/02/17 14:51

編集2020/02/17 15:11
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataoka

2020/02/18 13:29

ありがとうございます。 確かに、PlayerはDeckの一種である、というのはおかしいですね。 インスタンスを渡すという形で一旦検討してみようと思います。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問