【Java】繰り返し処理

2018年1月5日

本稿ではJavaの繰り返し処理について説明します。

繰り返し処理も条件分岐と同じく重要な部分となります。

ゲームは、連続で何度も同じ処理を繰り返し画面に描画することで、アニメーションを表現しています。

メインの描画処理でも使用しますし、シューティングゲームとかならば、弾データを配列などで保持し、毎フレーム当たり判定等のチェック処理を行っています。

while文

まずは、while文について押さえておきましょう。

while文はwhile(繰り返し条件){
//繰り返す処理
}

指定する繰り返し条件がtrueであれば、中の{}ブロックを処理するという流れです。

それではサンプルソースをご覧ください。

public class Test{
	public static void main(String[] args){
		int cnt = 0;
		while(cnt < 10){
			cnt++;
			System.out.println(cnt);
		}
	}
}
実行結果

1
2
3
4
5
6
7
8
9
10

処理内容は、whileのなかでcntを1ずつ加算していき、cntが11になったらループを抜けて処理が終了する流れとなります。

whileの繰り返し条件が常にtrueとなってしまうと永遠に処理が終わらなくなってしまう(無限ループ)ので、ご注意ください。

もし、無限ループとなってしまった場合は、ctrl+cなどで処理を強制停止させましょう。

do~while文

先に処理を実行してから、もう一度繰り返し処理をするかの判定を後から判定したいときに使用します。

do{
//処理
while(繰り返し条件);

それでは、サンプルを見ていきましょう。

public class Test{
	public static void main(String[] args){
		int cnt = 0;
		do{
			cnt++;
			System.out.println(cnt);
		}while(cnt < 5);
	}
}
実行結果

1
2
3
4
5

for文

繰り返し条件に初期化と毎回実行する処理を一度に記述できる方法です。

while文よりはるかに使用頻度が高いです。

for(初期化;繰り返し条件;二回目以降に毎回実行する処理){
//処理
}

最初にfor文に処理が来たときは、まずは初期化が実行されます。次に繰り返し条件を判断し、trueならば{}ブロックの中身を処理します。

中身の処理が終了したらもう一度for文に戻り、二回目以降に毎回実行する処理を実行して、繰り返し条件を判断し、trueならば{}ブロックの中身処理

以下繰り返し・・・・

という流れで処理が実行されます。

それでは、サンプルを見ていきましょう。

public class Test{
	public static void main(String[] args){
		for ( int i = 0;i < 5;i++ ) {
			System.out.println(i);
		}
	}
}
実行結果

0
1
2
3
4

拡張for文、foreach文

配列の要素すべてにアクセスしたい場合は少し楽な記述方法もできます。

この方法を拡張for文やforeach文と読んだりします。

for( 取り出した値 : 配列型等 ) {
//処理
}

それでは、実際に拡張for文の使用方法も確認しておきましょう。

public class Test{
	public static void main(String[] args){
		String[] names = {
			"勇者"
			,"魔法使い"
			,"人外"
		};
		for ( String name : names ) {
			System.out.println(name);
		}
	}
}
実行結果

勇者
魔法使い
人外

繰り返し処理の応用

繰り返し処理は配列と一緒に使用することが多いです。

そして、条件分岐と同じく、繰り返し処理もネストで二重、三重のループ処理(繰り返し処理)ができます。

繰り返す処理の判断材料として配列の要素数を条件にしたいと思うのですが、Javaの配列には配列の要素数を取得できる手段が用意されています。

配列型変数.lengthで取得できます。

さらに二次元目の要素数は一次元目の要素.lengthで取得可能です。

実際に、要素数分繰り返すことで、配列にアクセスするプログラムを作成してみましょう。

public class Test{
	public static void main(String[] args){
		String[][] names = new String[2][3];
		names[0][0] = "俺";
		names[0][1] = "僕";
		names[1][0] = "私";
		names[1][1] = "アタイ";
		for ( int i = 0;i < names.length;i++ ) {
			for ( int j = 0;j < names[i].length;j++ ) {
				System.out.println(names[i][j]);
			}
		}
	}
}
実行結果



null

アタイ
null

names[0][0]、names[0][1]、names[0][2]を表示してnames[1][0]、names[1][1]、names[1][2]を表示する二重のループ処理となっていることがわかるでしょうか。

この配列の要素数分繰り返す処理はゲーム以外の分野でも非常によく使用するので、この例のプログラムをまずは書けるようになってください。