Listを理解する

前章までで、自機と弾を作りました。

次に、シューティングゲームに必要な敵を作っていきたいと思います。

完成イメージは以下の通り。

list

自機や弾と違い、シューティングでは敵は普通複数体出てきます。

複数の要素の管理、と聞いて初心者が初めに思いつくのは配列でしょう。

実際、配列を使えば複数の敵を管理することは可能です(面倒ですが)。

JavaやC#のような言語には、このような複数要素の管理を容易にするデータ構造があらかじめ用意されています。

そのうちの一つが、Listというデータ構造です。

Listは、整数値のインデックスに任意のクラスを格納できる点で配列に似ていますが、配列と違ってはじめに要素数を宣言しなくても、いつでも好きなタイミングで要素を追加できます。

また、要素をListで管理することにより、for文のような繰り返しをしたいときに、一般にforeachと呼ばれる文法を使用することができ、コードがいくらか読みやすくなります。

Listの宣言方法と初期化、および要素の追加は以下の通りです。

要素の追加については、他にも初期化のときにコンストラクタ内で一緒に追加するやり方や、既存のリストに格納されているインスタンスを同時に追加する方法があります。

今回は、このリストを使って、Enemyクラスを作ってみましょう。

Fieldクラスの冒頭でListのenemiesを宣言して、コンストラクタの中でenemiesにEnemyクラスのインスタンスを格納しています。

ここで注意していただきたいのが、以下の一文です。

Javaでは、Listで宣言したクラスに対して、ArrayListのインスタンスを代入するのが普通です。

Listは抽象クラスで、インスタンスを作れないので、new List<>();とするとコンパイルエラーになります。

次に注目してほしいのが、以下の一文です。

いわゆるforeach文です。

カッコの中に書かれたListの各要素(each)に対して、同一の処理をすることからforeach文と呼ばれています。

今回は、enemiesというListに入っている、各enemy要素に対して、draw()メソッドを呼び出しています。

このように、Listに格納されている要素の中で、特に呼び出す順序にこだわらない場合には、foreach文が威力を発揮します。

もしforeach文を使わなければ、このループは以下のように書き直す必要があります。

先ほどより、コードが冗長になっているのが分かります。

一応この書き方にも、enemiesの中に格納された順序に応じた処理を追加できるという利点はありますが、そもそもそのような処理はソースコードの可読性を下げ、あまり好ましくないので、なるべく避けましょう。

以上で、自機、弾、敵を出し、シューティングに必要な役者は揃いました。

ここで、それぞれのクラスのコードを読み比べてみてください。

xやyといった同じ名前の変数や、draw()やupdate()のような共通するメソッドが多いことに気が付いたでしょうか。

このような場合、クラスの継承を用いることで、よりコードを簡略に記述することが可能になります。

というわけで、次の章ではクラスの継承と、オブジェクト指向の華ともいえる多態性(ポリモーフィズム)について学んでいきましょう。

[転職率95.1%]最短22日で未経験からプログラマーへ『GEEK JOB 転職コース』
geekjob_to_gol_banner_sp_06

『GEEKJOB 転職コース』では未経験からでもプログラミングや仕事の進め方を学習でき、プログラマーとして転職/就職できるまでサポートします。

  • 短期集中のプログラミング学習で未経験から最短22日での転職/就職ができる

  • IT業界の採用を熟知したメンターが就活サポート

  • わからないことは現役プログラマに質問できる

  • オフィスで働く上で必要なスキルを身に付けられる

  • 紹介可能企業は500社以上


文系出身だから、全くプログラミング経験がないから、プログラミングの学習に挫折してしまったから、といった方も関係ありません。

未経験からプログラマーを目指せる環境を用意しています。

詳しく見る

この記事の内容について報告する