Thirteenth floor

【Pythonでボードゲームシミュレーション】DOMEMO その3

2020年6月4日19:19, プログラミング

オブジェクト指向とは

ここからはクラスとインスタンスを使用します。

小難しい話は置いておいて、データデータに対する操作をオブジェクトという一つのもので表現しようということです。

ボードゲームのシミュレーションなので、DOMEMO(ドメモ)を例にして説明していきます。

ドメモ オブジェクト指向

ドメモで言えば、データに対応するのは数字の書かれた札操作に対応するのは札をランダムに配るです。

もちろん他にもたくさんありますが、まずはこの2つに絞って考えましょう。

プログラムというのは言語ですから、分かりやすさ(論理的かどうか)が求められます。特にドメモオブジェクトのように、データと操作が密接に関わりあっている場合は、別々に表現するよりもまとめて表現したほうが扱いやすいでしょう。

では詳細な話はPythonの公式ドキュメントやインターネット上に散らばっているサイトに譲り、さっそくコードを書いてみましょう。

STEP1

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__メソッド

__init__メソッドは初期化メソッドとも呼ばれ、クラスオブジェクトの初期化を行います。

初期化、つまり、ゲームを始めるための準備ということで、1から7までのカードのリストや、場に置くカードのリスト(はじめは空っぽ)を作っています。

STEP2

STEP1ではドメモを行う準備、つまり箱から札を取り出してテーブルに広げたところまでをPythonで書きました。

Python オブジェクト指向

次にopen_cardsclosed_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のついたデータをインスタンス変数と呼びます。

give_card_for_fieldメソッド

このメソッドは場へ表向きのカードと裏向きのカードを配る操作です。

random.shuffleuse_cardsをシャッフルします。

その後、リストのスライス操作を使ってuse_cardsの0番目から3番目までの要素を取り出し、open_cardsへ代入します。

そしてdelを使用し、取り出したリストの要素を削除します。

同じようにuse_cardsの0番目から3番目までの要素を取り出し、closed_cardsへ代入します。 すでに取り出してopen_cardsに代入された要素は削除されているため、open_cardsとは異なる要素がclosed_cardsへ代入されます。

STEP3

最後に本当に場へカードが配られたのかを確認するメソッドを加えましょう。これはシミュレーションには必要ないです。


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しているだけです。

STEP4

ではこれのオブジェクトを使ってみましょう。

PyCharmの画面の下にあるPythonコンソールを開きます。

PyCharm Pythonコンソール

>>>となっているところに以下のコードを打ち込んでいきましょう。


>>> from domemo import Domemo
>>> domemo = Domemo()
>>> domemo.give_card_for_field()
>>> domemo.show_cards_on_field()

これで結果が出力されるはずです。

from domemo import Domemo

これはdomemo.pyというファイル内にあるDomemoオブジェクトを使用するための文です。

randomというモジュールをimportした時と同じです。今回は自作したdomemo.pyの中にあるオブジェクトを使いたいのでこのように書きます。

domemo = Domemo()

Domemoオブジェクトをインスタンス化します。

インスタンスは次の記事で説明します。

domemo.メソッド名

インスタンス化した後に続けてメソッドを呼び出しています。

これもrandom.shuffleと同じ考え方です。

Domemoオブジェクトにgive_card_for_fieldやshow_cards_on_fieldメソッドがあるため、それを呼び出しているのです。

次回の話

お疲れ様でした。

これでオブジェクト指向はオッケーですね。

次回はドメモオブジェクトへもう少しメソッドを追加していきます。

コメント

コメント投稿ページへ