マインクラフトにみるオブジェクト指向

2023年2月13日

オブジェクト指向は、プログラミングの方法論の1つで、オブジェクトを抽象化してモデル化することを基本としています。

マインクラフト(Minecraft)をご存知の方を前提にしていますが今は、YouTubeにも多くのゲーム実況動画があがっていますので、Youtubeで検索して事前に確認していただくことでこの内容を把握することができると思います

ブロック

例えば、Minecraft のブロックはオブジェクトであり、このブロックは色、配置、形状などのプロパティを持つことができます。また、このブロックにはメソッドもあり、例えば、ブロックを破壊することができることなどが含まれます。

このブロックオブジェクトは、ゲーム内の他のオブジェクトと同様に、ゲーム内で使用される他のオブジェクトとともに一緒に設計されます。このような設計により、Minecraft のゲームエンジンは、ブロックオブジェクトを再利用可能な部品として扱い、ゲームを進めることができます。

このように、Minecraft では、オブジェクト指向の考え方を使用することにより、より効率的かつ再利用可能なコードを作成することができます。

遊ぶ立場の人は

プログラミングの知識がなくても遊ぶことはできます。その人たちはゲーム内でのアクションやインタラクションを通じて、ブロックオブジェクトや他のゲームオブジェクトを操作することができます。例えば、ブロックを破壊したり、新しいブロックを配置したりすることができます。

しかし、ゲームを遊ぶ人は、どのようにブロックオブジェクトや他のゲームオブジェクトが実際に動作するのかについての知識は必要ありません。彼らは、単にそれらを使ってゲームを遊ぶことができます。このような立場にある人は、オブジェクト指向によって作られたコードを直接的には操作することはできませんが、それらを間接的に使ってゲームを楽しむことができます。

アイテムを作成するサンプル(Java)

では、Minecraftの内部構造はどのようになっているのでしょう
ここでは、アイテムを作成するサンプルを Java で書いてみます
実際、Java版はもちろんJavaでコーディングされてます


以下は、アイテムのクラスを作成する例です

public class Item {
  private String name;
  private int damage;
  private int maxStackSize;

  public Item(String name, int damage, int maxStackSize) {
    this.name = name;
    this.damage = damage;
    this.maxStackSize = maxStackSize;
  }

  public String getName() {
    return name;
  }

  public int getDamage() {
    return damage;
  }

  public int getMaxStackSize() {
    return maxStackSize;
  }
}

このクラスには、アイテムの名前、ダメージ値、最大スタックサイズなどのプロパティがあります。このクラスを使用して、特定のアイテムオブジェクトを作成することができます。

以下は、このクラスを使用してアイテムオブジェクトを作成する例です。

Item sword = new Item("Sword", 10, 1);

この例では、「Sword」という名前、ダメージ値が10、最大スタックサイズが 1 のアイテムオブジェクトが作成されます。

これらのアイテムオブジェクトを使用することで、Minecraft のゲーム内でアイテムを作成し、利用することができます。

利用する方法のイメージ

  1. アイテムをインベントリに保存する:作成されたアイテムオブジェクトを、プレイヤーのインベントリに保存することで、ゲーム内で使用することができます。
  2. アイテムを売買する: 作成されたアイテムオブジェクトをゲーム内のショップなどで売買することができます。

これらは一般的な例ですが、ゲーム内でのアイテムの使い方はゲームの設計によって異なります。例えば、ゲームに応じてアイテムを使って新しいブロックを配置することもできます

持ち物クラスのイメージ

作成されたアイテムオブジェクトを使用するサンプルコードを提供します。

まず、作成されたアイテムオブジェクトを保存するクラスを作成する必要があります。以下は、インベントリクラスの例です。

import java.util.ArrayList;

public class Inventory {
  private ArrayList<Item> items;

  public Inventory() {
    items = new ArrayList<Item>();
  }

  public void addItem(Item item) {
    items.add(item);
  }

  public Item getItem(int index) {
    return items.get(index);
  }

  public int getNumItems() {
    return items.size();
  }
}

このクラスは、アイテムオブジェクトを保存するための ArrayList を持っています。addItem メソッドを使ってアイテムを追加し、getItemメソッドを使って特定のアイテムを取得することができます。

次に、このインベントリクラスを使用してアイテムオブジェクトを使用する例を示します。

使うイメージ

public class Main {
  public static void main(String[] args) {
    Inventory inventory = new Inventory();

    Item sword = new Item("Sword", 10, 1);
    Item pickaxe = new Item("Pickaxe", 5, 1);

    inventory.addItem(sword);
    inventory.addItem(pickaxe);

    System.out.println("Number of items in inventory: " + inventory.getNumItems());

    Item firstItem = inventory.getItem(0);
    System.out.println("First item name: " + firstItem.getName());
    System.out.println("First item damage: " + firstItem.getDamage());
  }
}

この例では、まず Inventory クラスを作成します。次に、「Sword」と「Pickaxe」という名前のアイテムオブジェクトを作成し、それらをインベントリに追加します。最後に、インベントリ内のアイテムの数と、インベントリ内のの最初のアイテムの名前とダメージ値を表示しています。

このサンプルコードは単純な例であり、より複雑なゲームを作成するためにはさらに多くのクラスやメソッドが必要になることがあります。さらに、このサンプルコードを使用する前に必要なJavaの予備知識を学ぶことが推奨されます。

攻撃するサンプル

public class Weapon {
  private String name;
  private int damage;
  
  public Weapon(String name, int damage) {
    this.name = name;
    this.damage = damage;
  }
  
  public String getName() {
    return name;
  }
  
  public int getDamage() {
    return damage;
  }
}

public class Player {
  private String name;
  private Weapon weapon;
  
  public Player(String name, Weapon weapon) {
    this.name = name;
    this.weapon = weapon;
  }
  
  public String getName() {
    return name;
  }
  
  public Weapon getWeapon() {
    return weapon;
  }
  
  public void attack(Player target) {
    int damage = getWeapon().getDamage();
    System.out.println(getName() + "は" + target.getName() + "に" + damage + "のダメージを与えた");
  }
}

この例では、武器とプレイヤーの2つのクラスを定義しています。プレイヤーは名前と武器を持ち、攻撃するメソッドを持っています。また、攻撃するメソッドはターゲットプレイヤーを受け取り、自分の武器からダメージ値を取得して、ターゲットにダメージを与えます。

このサンプルコードは単純な例であり、より複雑なゲームを作成するためにはさらに多くのクラスやメソッドが必要になることがあります。さらに、このサンプルコードを使用する前に必要なJavaの予備知識を学ぶことが推奨されます。

参考

公開されているソースの一部

これは、MinecraftがMojangでアカウントとプロファイルを処理するために新しく展開されたパブリックAPIと対話するために使用するJavaクライアントライブラリです。現在、非常に限られており、プレイヤー名->IDの解決のみを許可していますが、将来的にはこれを追加することを目指しています。唯一のドキュメントはコードであり、特に奇妙なものを見つけた場合、それはおそらくマインクラフトに不要な依存関係を導入したくないことと、やり過ぎないことの組み合わせです。このコードは礼儀として提供されており、コミュニティと共有するために別の言語でクライアントを自由に構築してください。