信長の野望はオブジェクト指向でできているのか? ゲームから学ぶオブジェクト指向入門

広告

「オブジェクト指向って難しいです。」

これは、職業訓練校で C# や Unity を教えていると、本当によく聞きます。

確かに難しいです。
なぜ難しいかというと、最初に出てくる説明が抽象的すぎるからです。

  • クラス
  • インスタンス
  • カプセル化
  • 継承
  • ポリモーフィズム

……この辺りを最初に言われても、頭に入りません。

私は授業でよく、

オブジェクト指向は「現実世界をプログラムで表現する考え方」

と説明しています。
今回は、それをゲームで考えてみましょう
題材は、信長の野望です。

信長の野望には2200人以上の武将がいる

最新作の信長の野望・新生では、2200人以上の武将が登場します。
なぜそんなに多いのか。
戦国時代を再現するには、

  • 武将
  • 大名家
  • 軍勢
  • アイテム
  • イベント

など、大量の要素が必要だからです。

ここで考えてみてください。
2200人の武将を、変数だけで管理できますか?

string name1 = "織田信長";
int leadership1 = 99;

string name2 = "徳川家康";
int leadership2 = 94;

2人ならできます。
でも2200人?
無理です。
ここでクラスが必要になります。

武将をクラスとして考える

武将には共通する属性があります。

  • 名前
  • 統率
  • 武勇
  • 知略
  • 政治

C#で書くとこうです。

class Officer
{
    public string Name;
    public int Leadership;
    public int Strength;
    public int Intelligence;
    public int Politics;
}

これは「武将の設計図」です。
まだ武将そのものではありません。
クラスは設計図です。

織田信長はインスタンス

設計図から実体を作ります。

var nobunaga = new Officer();
nobunaga.Name = "織田信長";
nobunaga.Leadership = 99;

これで織田信長という武将が作られました。
これがインスタンスです。

私は授業でよくこう言います。

クラスはプリウスの設計図
インスタンスは実際のあなたのプリウス

信長の野望でも同じです。

  • Officer = 設計図
  • 織田信長 = 実体

大名家もクラス

武将は単独では存在しません。
武将はどこかの勢力に所属します。
例えば、

  • 織田家
  • 武田家
  • 上杉家
class Clan
{
    public string Name;
    public List<Officer> Officers;
    public int Gold;
    public int Rice;
}

ここで面白いのは、

List<Officer>

です。
クラスの中に、別のクラスが入っています。
つまり、大名家は武将を持っているという関係です。
オブジェクト指向では、この「関係」を表現できるのが強い。

城もオブジェクト

class Castle
{
    public string Name;
    public Clan Owner;
    public int Defense;
}

例えば安土城は、

  • 名前がある
  • 所有者がいる
  • 防御力がある

これで1つのオブジェクトになります。

行動はメソッド

オブジェクトはデータだけではありません。
行動も持ちます。

class Officer
{
    public void Attack(Castle target)
    {
    }
}

武将は、

  • 攻撃する
  • 移動する
  • 内政する
  • 外交する

などの行動を持ちます。
これがメソッドです。

実はゲームはオブジェクト指向だらけ

ここまで見てわかると思います。
ゲームはオブジェクトの集合です。

  • プレイヤー
  • 武器
  • マップ
  • アイテム
  • UI

全部オブジェクトです。
だから、ゲーム開発とオブジェクト指向は相性がいい。
特に Unity は、その思想がかなり強いです。

  • GameObject
  • Component
  • Transform

名前からしてオブジェクト指向ですね。

ただし現代ゲームは純粋OOPではない

ここは少し実務寄りの話です。
2200人の武将が同時に思考するとします。

foreach (var officer in officers)
{
    officer.Think();
}

これを毎フレームやると重い。
そこで最近は、

  • Data-Oriented Design
  • ECS
  • DOTS

のような設計も使われます。
つまり、

設計はオブジェクト指向
実装は高速化のため別アプローチも使う

ということです。
実務は、教科書どおりではありません。

オブジェクト指向は現実をモデリングする力

私は、オブジェクト指向をこう考えています。

現実世界を整理して、プログラムに落とし込む力

クラスを書く前に考えるべきことは、

  • 何が存在するのか
  • 何を持っているのか
  • 何ができるのか

です。
信長の野望なら、武将・城・大名家が存在し、それぞれに属性と行動がある。
これが見えた時点で、もうオブジェクト指向は始まっています。

最後に

オブジェクト指向を難しく考えすぎなくていいです。
最初は、

このゲーム、クラスで表すとどうなる?

これだけで十分です。
もしゲームが好きなら、一度考えてみてください。

  • Minecraft
  • ドラゴンクエスト
  • 信長の野望

どれも、オブジェクト指向の教材になります。

そして実は——
あなた自身も、現実世界のオブジェクトの一つです。

訪問数 4 回, 今日の訪問数 4回

広告

C#

Posted by hidepon