マインクラフトを例えにしたオブジェクト指向(OOP)の学習資料


「1ブロックも1オブジェクト」「家はブロックの集合で1オブジェクト」という両方の視点を含めてストーリー仕立て考えてみましょう

1️⃣ はじめに

プログラミングには 構造化プログラミング と オブジェクト指向(OOP) という考え方があります。

  • 構造化プログラミング→ 作業を「順番に手順化」する。→ 同じ処理を繰り返す場合は、同じ手順を何度も書くことになる。
  • オブジェクト指向(OOP)→ 現実世界のモノや概念を「オブジェクト(物)」として扱う。→ 似たものを「設計図(クラス)」として用意し、必要に応じて「実物(インスタンス)」を作る。

2️⃣ マインクラフトの世界をOOPで見ると?

🧱 視点①:ブロックもオブジェクト!

  • マインクラフトの1つ1つのブロックは、それぞれが「Blockクラス」のオブジェクトです。
  • 例えば:
    • 草ブロック、石ブロック、木ブロック など種類は違っても、基本は Block という設計図。
    • 座標(X,Y,Z)を持つのも属性(プロパティ)です。
    • 壊す・置く などの操作が振る舞い(メソッド)です。

🏠 視点②:家はブロックの集合体としてのオブジェクト!

  • 家を作るときは、複数のブロックを組み合わせて1つの建物を作ります。
  • この「家」も House というクラスとしてまとめると便利です。
  • House は、内部に複数の Block オブジェクトを持つ「集合オブジェクト」です。

3️⃣ OOP の重要な要素

OOP用語マイクラの例え
クラス(Class)設計図(ブロックや家の作り方)
インスタンス(Instance)実際に置かれたブロック・建てた家
プロパティ(属性)ブロックの種類、座標/家の色、窓の数
メソッド(振る舞い)壊す、置く、ドアを開ける、窓を割る

4️⃣ C# のイメージコード

🧱 Blockクラス

class Block
{
    public string Type;   // ブロックの種類
    public int X, Y, Z;   // 座標

    public Block(string type, int x, int y, int z)
    {
        Type = type;
        X = x;
        Y = y;
        Z = z;
    }

    public void Destroy()
    {
        Console.WriteLine($"{Type} を壊しました!");
    }
}

🏠 Houseクラス

class House
{
    public List<Block> Blocks = new List<Block>();

    public string Color;
    public int WindowCount;

    public House(string color, int windowCount)
    {
        Color = color;
        WindowCount = windowCount;
    }

    public void AddBlock(Block block)
    {
        Blocks.Add(block);
    }

    public void OpenDoor()
    {
        Console.WriteLine("ドアを開けました!");
    }

    public void CloseDoor()
    {
        Console.WriteLine("ドアを閉めました!");
    }

    public void DestroyHouse()
    {
        foreach (var block in Blocks)
        {
            block.Destroy();
        }
        Console.WriteLine("家を壊しました!");
    }
}

🗺️ ワールドでの使い方

// ブロックを置く
var block1 = new Block("石", 10, 64, 10);
var block2 = new Block("木", 11, 64, 10);

block1.Destroy();  // 石を壊しました!

// 家を建てる
var myHouse = new House("赤", 4);
myHouse.AddBlock(block1);
myHouse.AddBlock(block2);

myHouse.OpenDoor();      // ドアを開けました!
myHouse.DestroyHouse();  // ブロックを順に壊す+「家を壊しました!」

5️⃣ OOP の便利さはここにある!

✅ 同じ設計図(クラス)から何個でも作れる!

✅ ブロックも家も同じように「属性」と「振る舞い」を持てる!

✅ 「家を壊す」とき、ブロックもまとめて扱える!

✅ 拡張性が高い(例:村や街クラスを作って、家をまとめることも可能)


6️⃣ まとめ

  • 1ブロックもオブジェクト!
  • 家もブロックの集合体として1つのオブジェクト!
  • オブジェクト指向は現実のモノのように「パーツを組み合わせて管理できる」考え方!

🗂️ さらに応用すると…

  •  を Village クラスにする
  • 住人 を Villager クラスにする
  • プレイヤーも Player クラスのインスタンスと考える

✔️ ポイント

マイクラを思い出すと、「設計図 → 実物を何個でも作れる」「パーツを組み合わせて大きなモノを作れる」この考え方がオブジェクト指向です!

訪問数 3 回, 今日の訪問数 1回