仮想ペットシミュレーターを作ろう!Pythonで学ぶオブジェクト指向プログラミング

今回は、Pythonを使って 仮想ペットシミュレーター を作成する方法を解説します。このプログラムは、ユーザーがペットの種類(犬、猫、鳥)を選んで名前と年齢を設定し、ペットのお世話を楽しむことができるシミュレーターです。

この記事で学べること:

  • Pythonのオブジェクト指向プログラミング(クラスと継承)
  • スレッド処理を利用した時間経過のシミュレーション
  • ユーザーインターフェースをコンソールで実装

プログラムの概要

この仮想ペットシミュレーターは、以下の機能を持っています。

  1. ペットの作成(犬、猫、鳥から選択)
  2. ペットに餌を与える
  3. ペットと遊ぶ
  4. ペットの状態を確認する
  5. 時間経過によるペットの状態変化
  6. ゲームの終了

プログラムの全体構造

まずは、プログラムの全体構造を把握しましょう。

import time
import threading


class Pet:
    def __init__(self, name, age):
        self.name = name  # ペットの名前
        self.age = age  # ペットの年齢
        self.hunger = 0  # 空腹度(0が満腹、100が最大空腹)
        self.happiness = 100  # 幸福度(100が最高、0が最低)

    def feed(self):
        """ペットに餌を与える"""
        if self.hunger > 0:
            self.hunger -= 10
            print(f"{self.name}に餌をあげました。空腹度: {self.hunger}.")
        else:
            print(f"{self.name}はまだお腹が空いていません。")

    def play(self):
        """遊ぶ - 子クラスでオーバーライド"""
        pass

    def update_status(self):
        """時間経過による状態の変化"""
        self.hunger += 5
        self.happiness -= 5
        print(f"{self.name}の状態が変化しました。空腹度: {self.hunger}, 幸福度: {self.happiness}.")
        if self.hunger >= 100:
            print(f"{self.name}はお腹が空きすぎています!")
        if self.happiness <= 0:
            print(f"{self.name}はとても悲しそうです!")

    def status(self):
        """現在の状態を表示"""
        print(f"{self.name} - 空腹度: {self.hunger}, 幸福度: {self.happiness}")


class Dog(Pet):
    def play(self):
        self.happiness += 20
        print(f"{self.name}はボールを追いかけて楽しそうに尻尾を振っています!")


class Cat(Pet):
    def play(self):
        self.happiness += 15
        print(f"{self.name}はレーザーポインターを追いかけて満足そうに喉を鳴らしています!")


class Bird(Pet):
    def play(self):
        self.happiness += 10
        print(f"{self.name}は楽しそうに飛び回った後、元気にさえずっています!")


def simulate(pet):
    """時間経過による状態のシミュレーション"""
    while True:
        time.sleep(10)  # 10秒ごとに状態を更新
        pet.update_status()


def main():
    print("仮想ペットシミュレーターへようこそ!")
    pet_type = input("ペットの種類を選んでください(犬、猫、鳥): ").lower()
    name = input("ペットの名前は何にしますか?: ")
    age = int(input("ペットの年齢はいくつですか?: "))

    if pet_type == "犬":
        pet = Dog(name, age)
    elif pet_type == "猫":
        pet = Cat(name, age)
    elif pet_type == "鳥":
        pet = Bird(name, age)
    else:
        print("無効なペットの種類です。デフォルトのペットを作成します。")
        pet = Pet(name, age)

    print(f"{name}という名前の{age}歳の{pet_type}を迎えました。")
    
    # 状態更新を別スレッドで管理
    threading.Thread(target=simulate, args=(pet,), daemon=True).start()

    while True:
        print("\n次に何をしますか?")
        print("1. ペットに餌をあげる")
        print("2. ペットと遊ぶ")
        print("3. ペットの状態を確認する")
        print("4. ゲームを終了する")
        choice = input("番号を入力してください: ")

        if choice == "1":
            pet.feed()
        elif choice == "2":
            pet.play()
        elif choice == "3":
            pet.status()
        elif choice == "4":
            print(f"{pet.name}を大切にしてください!さようなら!")
            break
        else:
            print("無効な入力です。もう一度選んでください。")

if __name__ == "__main__":
    main()

クラス設計

1. Pet クラス(親クラス)

Pet クラスは、すべてのペットに共通する基本的なプロパティとメソッドを定義しています。

  • __init__(self, name, age):
    • ペットの名前、年齢、空腹度 (hunger)、幸福度 (happiness) を初期化します。
  • feed(self):
    • 餌を与えて空腹度を10減らします。空腹でない場合はメッセージを表示。
  • play(self):
    • 抽象メソッド。子クラスでオーバーライドして使用。
  • update_status(self):
    • 時間経過による空腹度の増加と幸福度の減少を管理。
  • status(self):
    • ペットの現在の状態(空腹度と幸福度)を表示。

2. 継承クラス (Dog, Cat, Bird)

  • Dog クラス:
    • play(self) メソッドで幸福度を 20 増加。
  • Cat クラス:
    • play(self) メソッドで幸福度を 15 増加。
  • Bird クラス:
    • play(self) メソッドで幸福度を 10 増加。

ポイント:

  • それぞれの動物が特有の遊び方を持っており、幸福度の増加量も異なります。
  • オーバーライドを使用して親クラスの play() メソッドをカスタマイズしています。

3.スレッド処理と時間経過

def simulate(pet):
    while True:
        time.sleep(10)  # 10秒ごとに状態を更新
        pet.update_status()
  • threading モジュールを使用して、時間経過による状態の変化 を実装。
  • 10秒ごとに空腹度が +5、幸福度が -5 されます。

4. ユーザーインターフェース

main() 関数でユーザーとの対話を管理しています。

  • ペットの種類、名前、年齢を入力してペットを作成。
  • 餌を与える、遊ぶ、状態確認、終了の選択肢を提供。

まとめ

このプログラムは、オブジェクト指向プログラミング の基本である クラス継承 を理解するのに最適な例です。また、スレッド処理 を用いてリアルタイムのシミュレーションを実現しています。

Pythonで楽しい仮想ペットシミュレーターを作りながら、オブジェクト指向の基礎をマスターしましょう!