信長の野望はオブジェクト指向でできているのか? ゲームから学ぶオブジェクト指向入門
「オブジェクト指向って難しいです。」
これは、職業訓練校で 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
- ドラゴンクエスト
- 信長の野望
どれも、オブジェクト指向の教材になります。
そして実は——
あなた自身も、現実世界のオブジェクトの一つです。






ディスカッション
コメント一覧
まだ、コメントがありません