「落下棒(仮)」とオブジェクト指向

2年C科 古川 史幸

はじめに

  この文章は、私が現在作っている落ちゲーの「落下棒(仮)」(*1)の簡単な紹介と、ゲーム製作に用いたオブジェクト指向についてこれまた簡単に考察するというものです。もしかすると何らかの間違いが含まれる可能性を否定できませんので、読むときは適度な緊張感を持ってお読み下さい。

(*1)もしかしたら「落下」しなくなるかも知れないので。ただし、これ以降は(仮)を省略します。

「落下棒」の紹介

  落下棒は、「落ちてくるものが長い棒である」ことをコンセプトとした落ちゲーです。少なくとも私の見てきた(*2)落ちゲーは、L字型のブロックが落っこちてきたり、ぷよぷよとしたものが横に二つ並んで落ちてきたり、縦に3つ並んだ宝石が降ってきたりと、落ちてくるものはみな小さな「部品」なのです。そこで、なんか大きいものを落とすことは出来ないかと考えた結果が、落下棒というゲームです。ゲームイメージを以下に示しましょうか。

「落下棒」のイメージ (画面は開発中のものです。公開版(完成すればではあるが)のイメージとは異なります。)

  落ちてくるものは長い棒です。上で切れていますが、無限に続きます。で、これを適当な長さに切り落として配置します。左右移動操作で長い棒全体を左右に動かし、上下移動操作でチョッパー(*3)を上下に動かし、切り落とす位置を決定します。もちろん、高速落下操作で最高速で棒を落とすことも出来ますし、強制切り落とし操作で現在のチョッパーの位置で切り落とすことだって出来ます。この「切り落とす位置を自分で決められる」ことから、プレイヤーがより多くゲームに干渉できるようになります。
  切り落とした棒を消す方法は、同じ色のエレメント(*4)を底から同じ高さに幾つかそろえることによってエレメントに変化を与えます(*5)。そして同じ棒の中に変化したエレメントが幾つか存在するようになると棒全体が消えるというものです。消去ルールとしては少し複雑かも知れませんが、基本的には同じ色のエレメントを同じ高さに持っていくだけなのでそんなに難しくはないと思います(*6)
  他にも幾つかルールがあるのですが、それは調布祭でゲームが展示できればそこで説明したいと思います。

(*2)って、私もそんなに多くのものを見ているわけではないのですが。
(*3)長い棒にくっついている三角形のカーソルのことです。
(*4)棒に含まれている色のついた丸いものです。
(*5)正式には活性化と言います。
(*6)この消去ルールはまだ実装していないので、おもしろいかどうかが未知数です。困った。


オブジェクト指向採用の経緯

  さて、このゲームはC++言語で書かれています。C++と言えばオブジェクト指向言語であるということは、現在のPCでプログラムを組んだことのある人ならばご存じかと思います。しかし、ゲーム製作の場合「C++は実行速度が遅い」とか、「手続き型プログラミングのC言語の方が簡単に書ける」とかいう理由でC++言語を使わないプログラマが、特にプログラムを飯の種にしない人に多いような気がします。
  そんな状況でも私がオブジェクト指向を採用した理由は、だいたい以下の理由によります。

  3番目の理由はともかくとして、最初の理由は重要です。大規模なゲームを作るとなれば自分一人の力ではほとんど完成は無理でしょう。そこで他の人に協力を要請するわけです。このときにだいたいの場合モジュールごとに担当を決めて、各人に責任を負わせるようになるのでしょうが、このとき手続き型プログラミングではオブジェクト指向プログラミングに比べてモジュールの結合度が強くなってしまうという問題があります。
  例えば、C言語の複数の関数で変数を共有したいときには、グローバル変数を用いなければなりません。しかしグローバル変数の管理は非常にやっかいなものです。もし二人が同じ名前のグローバル変数を宣言してしまったらどうなるでしょう。関数のインターフェースさえ要求仕様に沿っていればいいというものではなくなり、それ以外のことにも気を配らなくてはならなくなります。
  その点オブジェクト指向では、クラスというものを単位とすることで、各人がクラスの仕様に沿ったプログラムを組むことが可能になります。クラス内の複数の関数で共有したい変数がある場合は、クラスの非公開メンバとして変数を宣言すれば他に影響を与えることはありません。そのため、他のこと、例えばグローバル変数の管理などに気をとられることがなくなるのです(*8)
  2番目の理由は直接ゲーム作りには関係しませんが、でもやはりこのような動機付けは重要でしょう。オブジェクト指向を理解した上で、言語の持つ強力な機能を使いこなすことで、バグの少なく、安定したプログラムが書けるのではないかと思います。
  まぁ、今回の場合は、私が大規模プログラムを組めるかどうかの試金石となるのでしょうか。

(*7)Tucker!著, 『憂鬱なプログラマのためのオブジェクト指向開発講座 - C++による実践的ソフトウェア構築入門』 (DDJ Selection, 1998)
(*8)もっとも、使用ライブラリやコメント記述方法などに気を配らなくてもよいというわけではありませんが、少なくとも手続き型プログラミングに比べて気を配るべきところが減るということです。

果たして完成するのか

  しかし、やっぱりオブジェクト指向を理解するのは大変です。特にゲームの場合は1フレーム毎の処理など、通常のアプリケーションにはないような処理を求められるので、どのようにクラスを設計したらいいか今だに試行錯誤しています(*9)
  これを書いている時点で今だに遊ぶことができません。大学の課題や試験などと平行してプログラミングをしているので、あまり時間がないです(*10)。なんとかゲームの完成が調布祭に間に合うことを祈りつつ、この文章を締めたいと思います。

(*9)例えば、画面に描画するとき、描画されるオブジェクトに対して「指定した位置に描画しろ」と命令するのか、あるいは「描画するのに必要なオブジェクトの状態を教えろ」と命令するのか。
(*10)「学生には長い夏休みがあるではないか」という突っ込みはなしという方針で。

>> 会誌の目次に戻る