2020年6月4日19:19, プログラミング
ここからはクラスとインスタンスを使用します。
小難しい話は置いておいて、データとデータに対する操作をオブジェクトという一つのもので表現しようということです。
ボードゲームのシミュレーションなので、DOMEMO(ドメモ)を例にして説明していきます。
ドメモで言えば、データに対応するのは数字の書かれた札、操作に対応するのは札をランダムに配るです。
もちろん他にもたくさんありますが、まずはこの2つに絞って考えましょう。
プログラムというのは言語ですから、分かりやすさ(論理的かどうか)が求められます。特にドメモオブジェクトのように、データと操作が密接に関わりあっている場合は、別々に表現するよりもまとめて表現したほうが扱いやすいでしょう。
では詳細な話はPythonの公式ドキュメントやインターネット上に散らばっているサイトに譲り、さっそくコードを書いてみましょう。
domemo.pyに記載します。前回のコードは消してしまって構いません。
import random
class Domemo:
def __init__(self):
self.use_cards = [
1,
2, 2,
3, 3, 3,
4, 4, 4, 4,
5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7,
]
self.open_cards = []
self.closed_cards = []
言語としての文法の話になりますが、class クラス名:でDomemoクラスを作成します。これが2つあるオブジェクトのうちクラスオブジェクトです。
次にクラス名の後ろにコロン(:)をつけて改行し、半角スペース4文字で字下げ(インデント)をします。必ず行ってください。行っていないと実行時にエラーになります。
def メソッド名(self, 引数):でメソッドを定義します。これが操作に当たります。例では__init__メソッドを作成しております。
この後でさらに改行して、半角スペース4文字でインデントします。
self.変数名でインスタンス変数を定義します。これがデータに当たります。例ではuse_cards, open_cards, closed_cardsを定義しています。
__init__メソッドは初期化メソッドとも呼ばれ、クラスオブジェクトの初期化を行います。
初期化、つまり、ゲームを始めるための準備ということで、1から7までのカードのリストや、場に置くカードのリスト(はじめは空っぽ)を作っています。
STEP1ではドメモを行う準備、つまり箱から札を取り出してテーブルに広げたところまでをPythonで書きました。
次にopen_cardsとclosed_cardsへランダムに札を配るメソッドを追加しましょう。
コードは次のようになります。
import random
class Domemo:
def __init__(self):
...
def give_card_for_field(self):
random.shuffle(self.use_cards)
self.open_cards = self.use_cards[:4]
del self.use_cards[:4]
self.closed_cards = self.use_cards[:4]
del self.use_cards[:4]
同じクラス、別のメソッド(__init__とgive_card_for_field)内で定義されている変数(use_cards等)を使用する必要がある場合、selfを変数名の前に付けます。
__init__メソッドで定義しているuse_cardsなどの変数を、give_card_for_fieldメソッド内で使用できるのはselfで参照しているためです。このselfのついたデータをインスタンス変数と呼びます。
このメソッドは場へ表向きのカードと裏向きのカードを配る操作です。
random.shuffleでuse_cardsをシャッフルします。
その後、リストのスライス操作を使ってuse_cardsの0番目から3番目までの要素を取り出し、open_cardsへ代入します。
そしてdel文を使用し、取り出したリストの要素を削除します。
同じようにuse_cardsの0番目から3番目までの要素を取り出し、closed_cardsへ代入します。 すでに取り出してopen_cardsに代入された要素は削除されているため、open_cardsとは異なる要素がclosed_cardsへ代入されます。
最後に本当に場へカードが配られたのかを確認するメソッドを加えましょう。これはシミュレーションには必要ないです。
import random
class Domemo:
def __init__(self):
...
def give_card_for_field(self):
...
def show_cards_on_field(self):
print(self.open_cards)
print(self.closed_cards)
これは説明不要ですね。printしているだけです。
ではこれのオブジェクトを使ってみましょう。
PyCharmの画面の下にあるPythonコンソールを開きます。
>>>となっているところに以下のコードを打ち込んでいきましょう。
>>> from domemo import Domemo
>>> domemo = Domemo()
>>> domemo.give_card_for_field()
>>> domemo.show_cards_on_field()
これで結果が出力されるはずです。
これはdomemo.pyというファイル内にあるDomemoオブジェクトを使用するための文です。
randomというモジュールをimportした時と同じです。今回は自作したdomemo.pyの中にあるオブジェクトを使いたいのでこのように書きます。
Domemoオブジェクトをインスタンス化します。
インスタンスは次の記事で説明します。
インスタンス化した後に続けてメソッドを呼び出しています。
これもrandom.shuffleと同じ考え方です。
Domemoオブジェクトにgive_card_for_fieldやshow_cards_on_fieldメソッドがあるため、それを呼び出しているのです。
お疲れ様でした。
これでオブジェクト指向はオッケーですね。
次回はドメモオブジェクトへもう少しメソッドを追加していきます。