【HSPプログラミング講座#21】多重ループを使ってみよう
タイトルとURLをコピーしました
今回のHSP言語プログラミングでは「繰り返し処理を、更に繰り返す」という多重ループについて学んでいきたいと思います。 あまりややこしい処理はやりたくなかったのですが、そろそろ多重ループを使っていかないと、プログラミングが大変面倒になってきました(汗)
多重ループとは
多重ループとは、「繰り返し処理を、更に繰り返す」ことですが、具体的に例を挙げると「15回繰り返し処理をしたいけど、3回に1回は別な処理を入れたい」みたいなときに使います。 ということでテストプログラムを書いてみましょうかね!?
このプログラムには repeat が2重に組まれていますよね? しかもわかりやすいように【TABキー】で右側に行をずらしながら書いていますね。 このような構造にする必要はないのですが、プログラムを見やすくするためにずらしています。 ちなみにこのような構造を「ネスト」とか「入れ子」と言ったりします。 頭の片隅に入れておいてくださいね。
外側が3回のループ、内側が5回のループになっています。 どのように動作するかというと、外側の1回目のループがスタートしますが、内側(2行目から4行目)のループを先に処理します。
mes で cnt の中身を表示していますね。 5回のループが終わると「あいうえお」を表示して、今度は外側の2回目のループがスタートします。これを3回繰り返します。
よって5回のループを3回繰り返すので15回繰り返されることになります。 実行結果を見てみましょう!
実行結果は予想通りでしたか? ここで疑問に思った人は鋭い! それは cnt の数値が内側ループの0から4までの5回を繰り返したあとで、外側に一度抜けるとまた0から始まるんです!
0から14までの数になると思った人は残念でした・・・(汗)
さて、更に疑問が湧きますね~ それは内側の cnt の値だけが表示されたみたいですよね? 外側で cnt を使ったらどうなるんでしょうかね?
早速実験してみましょうか!
上記のように内側の処理は一緒ですね。 cnt の値を表示しているだけです。
問題は外側の cnt です。 mesで表示するときは、内側の cnt なのか、外側の cnt なのか区別するために、外側の cnt は100を足し算してます。 では実行してみましょう!
どうでしょうか? 想像通りでしたか!?
どうやら内側の cnt と、外側の cnt は区別されているみたいですね!
ただし逆に言うと、内側のループは毎回 cnt の数字を忘れてしまうという記憶喪失な状態になってしまいますから、0から14まで数を数えさせるためには、ちょっと工夫が必要です。
例えば下記のようにループに入る前の外側で、変数を予め用意しておくとか、工夫が必要です。
上記のように変数を用意しておけば、毎回リセットされることなく数値を記憶しておいてくれますからね。 実行結果はわかりますよね。。。 一応、実行結果も載せておきますね。
はい。しっかりできましたよね? 大丈夫ですよね??
この2重ループとか、今後のプログラミングで必須になるテクニックですからね。 これをしっかり理解してから先に進みましょうね!
多重ループ その2 for ~ next
実は多重ループする命令はいくつもありまして、、、(汗)
むしろプログラミングの世界では repeat はあまり使われていないかもしれません(涙) まぁそれはワタクシの知る限りの話なので何とも言えませんがねぇ。
では一般的に使われている繰り返し命令は何かと申しますと、
for ~ next
という命令です。 使い方は似ているのですが、特徴としては自由に変数を設定することができます。 逆に cnt のような専用の変数は使えませんけどね。 それからスタートするときの値と、終わるときの値を設定することができます。 repeat命令は繰り返す回数でしたよね。 それに対して for ~ next は「3からスタートして7になったら終わり」みたいなイメージです。
まずは理解しやすいように多重ループは使わずに for ~ next だけ使ってみましょう。
使い方はなんとなく似てますよね。 for から next までの間に書かれているプログラムを繰り返します。
1行目は変数を用意しています。(変数を宣言するとも言います) 次に3行目の for で「aaa変数を3で準備しなさい」という意味になります。 なので1行目の変数宣言は無くてもいいのですが、あったほうが明確に表していて「強調」されている感じでワタクシは好きです。
このあとに aaa変数が出現するんだな!
ってことが最初の段階でわかりますからね。 プログラムが長くなってくると自分で用意した変数の名前も忘れてきますからね(笑)
話がそれましたが、aaa変数に3を入れて、7になったら終わりという意味になります。 いやもっと正確に表現すると、7以上になったら終わりです。
そして最後のパラメータの1ですが、これは増えていく数です。
繰り返す度に1ずつaaa変数の値が増える
という意味になります。 なのでここの値を2にすれば4,6,8と増えていくことになります。 これが for ~ next の使い方となりますが、repeat と比較すると「細かい設定ができる」ということですね。
ではプログラムを実行しましょう!
はい。 いかがですか? 予想外でしたよね?(笑)
3から7まで数えるんじゃないんかい!! 6までしか数えてないやんけ!!
その気持よ~くわかりますよw
repeat命令のときも似てたじゃないですか!? 3回ループをしたら cnt の値は0,1,2まででしたよね? 別な考え方をすれば7から3を引き算すれば4だから、ちゃんと4回ループしてますよね? 3,4,5,6っていうふうに。
こーゆー言い方もできるかもしれません。
「7未満の間はループする」
だから、最後のパラメータ(増える数)を2にすると、aaa変数の値が「3,5」となって2回しかループしないんですよ。
では続いて2重ループをやってみましょう!
こんな感じにプログラムを書いてみました。5回ループを3回繰り返しています。 もう説明の必要はないかもしれませんが、15回 mes命令でbbb変数の中身を表示しているだけですね。
実行結果は下記のとおりです。
変数bbbの値は0から4まで繰り返したあと、また0からスタートしますからね。わかりますよね?
多重ループと多次元配列の組み合わせ
最後に、多重ループと多次元配列の組み合わせについて説明しますね。 ちょっと難しいかもしれないので気合を入れてくださいね!!
多重ループと多次元配列なんて表現すると難しく感じるので、いま勉強した2次元ループと、以前勉強した2次元配列を組み合わせたものを作っていきます。
実はこれが一番やりたかったのですが、これができるようになるとRPGのマップ管理とか、プレーヤーごとのステータス管理がしやすくなるんです。
下記のプログラムでは、どのようなことをしているのか、最初にざっくりと説明しておくと、横5列、縦3段の箱(配列変数)を用意します。 そこに今回勉強した2重ループを使って、箱の中に順番に数字を入れていきます。 そして最後にもう一度、2重ループを使って箱の中に入れた数字を表示して、ちゃんと数字が入っているかを確認しています。 これを頭に入れて下記のプログラムを見てみましょう。
1行目は横5列、縦3段の箱(配列変数)を用意しています。 本棚のイメージですね。
6行目 aaa変数と7行目 bbb変数はループ用の変数なので説明の必要はないですね。
8行目 ccc変数はのループの中で1ずつ数字を増やしていくための変数です。
13行目の xy(aaa,bbb) の部分が最大のポイントです。 ループで使っているaaa変数とbbb変数をうまく利用して、全ての配列変数を順番に呼び出して、ccc変数の中身を配列変数に入れています。
もしループを使わなければひたすら、
xy(0,0) = ccc
xy(0,1) = ccc
xy(0,2) = ccc
xy(0,3) = ccc
xy(0,4) = ccc
xy(1,0) = ccc
xy(1,1) = ccc
xy(1,2) = ccc
xy(1,3) = ccc
xy(1,4) = ccc
xy(2,0) = ccc
xy(2,1) = ccc
xy(2,2) = ccc
xy(2,3) = ccc
xy(2,4) = ccc
というふうに書かないといけませんからね。 ループと組み合わせてaaa変数とbbb変数が変わっていく動作を利用して、この面倒な作業をしているわけです。
わかりましたかね? これ、ウルトラスーパー重要事項なので、分からなければ、色々いじくり倒して動作確認して理解を深めてくださいね! 今後めちゃ出現しますからね!!
多重ループのまとめ
今回のプログラミング講座はとっても長くなってしまいましたが、コレを理解するとプログラム技術が飛躍的に向上しますから必ず覚えてくださいね。
この2重ループと2次元配列変数は、オセロとか将棋とか、テトリスとかRPGのマップとか、縦横のブロックになっているような構造のときによく使いますからね。
それから3Dとかやると縦・横・奥行き(x,y,z)の座標管理で3次元配列を使ったりしますから、もっと難しくなりますよ~
それではまた~