JavaScript

8. 繰返し

プログラム的な繰返しを用いて、同じ図形を並べたりすると、プログラムを用いたヴィジュアルらしいものに近づきます。

for文で繰返し描く

繰返しを実現する方法の1つがfor文を用いることです。あらかじめ繰返しの回数が決まっている(分かっている)場合にはfor文が便利です。

for文の書式は、以下のようになります。

for( 変数の初期値; 繰返しを続ける条件; 変数の増分 ) {
繰返したい処理;
}

例えば、以下のように書くと、線を21本、描くことができます。

window.addEventListener( "load", loadFunc, false );
 
function loadFunc() {
 
	var canvas = document.getElementById( "stage" );
	var ctx = canvas.getContext( "2d" );
 
 	ctx.strokeStyle = "#339933";

 	for( var i = 0; i < 21; i++ ) {
		ctx.beginPath();
		ctx.moveTo( 50 + i * 20, 50 );
		ctx.lineTo( 50 + i * 20, 450 );
		ctx.closePath();
		ctx.stroke();
	}

}

10行目は、良く使う書き方の1つと思ってもらって構いません。繰返し回数を変える場合は、21の部分を書き換えます。

どのように繰返すかを定めるのがforの後の()の中ですが、まず繰返しの回数を数える変数iを作りその値を0にしています。

続く;の後に繰返しを終える条件を書きますが、i < 21とは、iが21より小さい間だけ、繰返しを行うという意味になります。

続く;の後には、繰返しのたびにiの値をどの程度増やすのかを書きます。i++と書けばiの値が1ずつ増えていきます。

続く{から、16行目の}までの間に処理を記述すれば、その処理が繰返されます。iの値が0から21より小さい間繰返されますので、結果として21回繰返されることになります。iの値は0から始まり、繰返しのたびごとに1ずつ増えていきます。

11行目から15行目、ここでは繰返す処理として直線を描いています。直線の描き初めのx座標とy座標の指定にiの値を利用し、繰返しのたびごとに描かれる位置を変えています。

12行目と13行目の、50 + i * 20の値は、iが0の時には50に、iが1のときには70にと、繰返しのたびごとに20ずつ増えていきます。結果として20ピクセル間隔の線が、21本引かれることになります。

for文で直線を繰返し描く

for文を書き間違え、繰返しの回数を数える変数(上記の場合はi)を繰返しのたびに増やすのを忘れたり、繰返しを終える条件を指定し間違えると、いつまでも終わりのこない繰返しを作ってしまうことになります。そうするとプログラムが止まらなくなりますので、とても注意が必要です。

ページの先頭へ↑

2重のfor文で描く

for文の中にfor文を書くことができます。図形を縦横に並べるのにも利用できます。

window.addEventListener( "load", loadFunc, false );
 
function loadFunc() {
 
	var canvas = document.getElementById( "stage" );
    var ctx = canvas.getContext( "2d" );
	
	ctx.strokeStyle = "#339933";

 	for( var i = 0; i < 9; i++ ) {
		for( var j = 0; j < 9; j++ ) {
			ctx.beginPath();
			ctx.arc( 50 + j * 50, 50 + i * 50, 20, 0, Math.PI*2, false );
			ctx.stroke();
		}
	}

}

10〜16行目のfor文の中に、もう一つのfor文(11〜15行目)が入っており、どちらも9回、繰返しています。

内側、11〜15行目のfor文は、前述の線を描くのと同様に、0〜8まで変化する変数jを円のx座標を決めるのに利用して、繰返しの度に、x座標を50ずつ増やしながら描画しています。結果として横1行に9個の円が、このfor文で描かれています。

外側のfor文では、変数iが0〜8まで変化しますが、iは円のy座標を決めるのに利用されています。結果として、1行9個の円が9行描かれることになります。

2重のfor文で図形を並べる

ページの先頭へ↑

while文で描く

繰返しを実現する方法にはwhile文というのもあります。繰返しの回数は決まっておらず、ある条件になるまで繰返しを行いたい場合などに便利です。

while文の書式は、以下のようになります。

whole( 条件 ) {
繰返したい処理;
}

例えば、以下のように書くと、円を画面の端に達するまで、描くことができます。

window.addEventListener( "load", loadFunc, false );
 
function loadFunc() {
 
	var canvas = document.getElementById( "stage" );
	var ctx = canvas.getContext( "2d" );
 
 	ctx.strokeStyle = "#339933";

	var drawPointX = 0;

 	while( drawPointX <= 500 ) {
		ctx.beginPath();
		ctx.arc( drawPointX, 250, 20, 0, Math.PI*2, false );
		ctx.stroke();
		drawPointX = drawPointX + 20;
	}

}

10行目、円を描くx座標の値を格納する変数drawPointXを作り0を代入しています。

12行目、whileの後の()の中で繰返しを終える条件を設定しています。drawPointX <= 500とは、drawPointXの値が500以下の場合、という意味になりますので、drawPointXの値が500以下の場合に繰返しが実行され、500(画面横幅のサイズ)より大きくなったら繰返しが終わります。

13〜15行目で円を描画しています。

14行目、円を描くx座標はdrawPointXで指定をしています。

16行目、drawPointXの値を変えています。=がある場合、その右側が先に計算され左側に代入されますので、この場合、現在のdrawPointXの値に20が足され、改めてdrawPointXに代入されます。つまりこのように書くと、drawPointXの値が20増えることになります。

drawPointXの値は繰返しのたびに20ずつ増えていき、いつか500を超えます。その時に繰返しが終わります。結果として、画面の端まで円が描かれることになります。

while文で円を画面の端まで描く

for文同様、while文を書き間違え、繰返しを終える条件を指定し間違えたり(上記の場合は12行目)、drawPointXのような条件に使われる変数を作らなかったり、値を増やし忘れたりすると(上記の場合は16行目)、いつまでも終わりのこない繰返しを作ってしまうことになります。そうするとプログラムが止まらなくなりますので、とても注意が必要です。

ページの先頭へ↑

< 7. 色の指定

9. 条件分岐 >