いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

シューティングゲームでたくさんの敵機を管理する話

 最近は数学、物理は放っておいてゲームのプログラミングばかりしています。こういう時期もあるものです。疲れたので気晴らしに書きます。

 どこの高校でも3年生が2月くらいから家庭研修に入り、家で受験勉強をします。聞いてみると「1日13時間勉強していました」という生徒が。ウソじゃないんだろうけれど、「ホントかな?」と思います。多分ぼくは無理です……。今は体力的に無理ですが、若い頃も多分そんなにやっていなかった気が。集中力が続きません。

 そういうわけで、続けているとまあ4、5時間でクタクタです。それでも作業が進んでいるときはよいのですが、パソコンの仕事はトラブルが起こるとアッという間に2、3時間かかってしまうことも少なくありません。最近ではランキングがそうでした。

www.omoshiro-suugaku.com

このランキング機能の実装で、「ああやってもこうやってもうまくいかない」というのを何時間も繰り返して、疲れ果てた……という感じです。こんなときの疲れ方は違います。少し外出でもして気晴らしすれば効率も上がると理屈では分かっているんですが、PCの前からなかなか離れられなかったり。

 さて、本題です。今作っているゲームではたくさん出てくる敵機をリストで管理しています。enemyListというリストに1機1機のデータ(現在の位置、敵のタイプ、移動ルートのパラメータ、旧位置、……)を格納しています。enemyList[0]には1機目、enemyList[1]には2機目、……というふうにしています。編隊も出現させたいですから、この敵とこの敵とこの敵は1グループの編隊である、という情報もどこかに記録しておかないといけません。少し前、これでトラブルを起こしました。例えば3番目の敵(enemyList[2])を撃ち落としたとき、そのデータはリストから削除します。するとそれ以降の敵のデータが順繰りに前に移動します(リストはこういう仕組みなのです)。つまり、今まで3機目のデータが格納されていた場所に、3機目を撃墜した後はそこに4機目のデータが入ります。だから「2番目、3番目、6番目、7番目のデータの敵機が編隊になっている」などと思っているとうまくいきません。「~番目」はコロコロ変化するのです!

 これに対し、決まった数の、例えば「50個分のデータを格納する」のような仕組みもあります。「配列」と言います。配列なら番号が変わってしまう心配は要りません。でもそうすると撃墜した敵の分のデータも走査しなければならず、計算コストがかかります。

 結局、生成する敵機に通し番号をつけて管理することにして解決しましたが、面倒でした……。前に書いたゲームでも同じようなことをやっていたはずですが、全く覚えていません。面倒だったけれど、そんなのが面白いとも言えます。常に何か問題が起こってそれを解決する、というのがプログラミング。

 さっきやっていたのはポーズの仕組みを入れることです。ゲームの途中で進行を止めたいことだってあります。お客さんが来たとか、お湯が沸いたとか。方法はいくつかあると思います。これはほぼトラブルもなく無事に完了。明日はメニュー画面からゲーム開始、ランキング表示、ヘルプの表示、……みたいなことができるようにします。できあがりが見えてきました。