AX

電霊ログ

私のやってるサイト、電子の言霊の活動ログ

カテゴリークラウド

タグリスト

最近のトラックバック

月別アーカイブ(タブ)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • [HSP超入門] 繰り返し10

今回は繰り返し命令でのネストを試して見ましょう。
ネストと言うのは if の時にやりましたね。

ネストはこの様に、自分の中に自分と同じ構造の物が入っている状態の事です。
if a=1	{
if b=1 {
mes "ネスト"
}
}
繰り返しのネストでは、これを repeat ~ loop でやるだけです。

repeat は loop との間を繰り返し実行しますが。その時 repeat がネストされている場合は どうなるかを考えて見ましょう。
まず「1つ目の repeat」が実行された時、HSPは「1つ目の repeat」に対応するそこから一番近い loop を探すわけですが、ネストをした場合その前に「2つ目の repeat」が出て来ます。repeat が出て来たと言う事はその分の loop を探す事になります。この「2つ目の repeat」が探すのは、「2つ目の repeat」 に対応したそこから一番近い loop です。
そして「2つ目の repeat」 に対応した loop を抜けたら、そこから一番近い loop が「1つ目の repeat」に対応する loop になります。(このまま3つ目4つ目と repeat が増えていっても同じ事です。)
repeat 10
repeat 100
loop
loop

たとえばこのようなスクリプトなら、最初の「repeat 10」を見つけたらそこから1番近い次の「loop」まで繰り返そうとしますが、その途中で新たな「repeat 100」に遭遇し、そこからまた一番近い次の loop まで繰り返そうとします。


回りくどい説明で余計分からなくならない様に、実例を見て見ましょう。
リピートでネストをすると例えばこんな事が出来る様になります。
これを実行すると、縦と横に規則正しく並んだ青紫色のボックスが表示されます

color 120,50,255

repeat 10
cnt2=cnt

repeat 10
boxf cnt*20,cnt2*20,cnt*20+10,cnt2*20+10
loop
loop


「実行結果」
20070225004658.png


一見複雑に見えるかも知れませんが、順をおって考えていれば今までの応用で出来ている事が分かります。
まずこれをネストしない状態で考えて見ましょう。

color 120,50,255

repeat 10
boxf cnt*20,0,cnt*20+10,10
loop


「実行結果」
20070225004705.png


この例ではボックスを横方向(左から右)にずらしながら表示しています。
ここまでは前にやったのと同じなので分かると思いますが 一応説明すると、repeat 内の cnt の値が変化するのを利用して 四角形の場所を少しずつ変えて表示しています。つまりは、cnt を横方向の移動量のタネに使っていると言う事です。

そしてこれをネストする訳ですが、1つ問題があります。
それはこれを実行する事で「アレ?」と気付くと思います。

repeat 10
repeat 1
mes cnt
loop
loop


そうです、mes で表示している cnt の中身がなぜか 0 のままになってしまっています。
うすうす気付いているかも知れませんが、cnt は今自分がいる repeat の回数がかくのうされているので、常に「repeat 1」の方の cnt が表示されたわけです。
ですので「repeat 10」の cnt を「repeat 1」の中で表示させるには、いったん変数に保存しておいて好きな時に使えるようにします。

repeat 10
a=cnt
repeat 1
mes a
loop
loop



それともう一つ気にしておかなければいけない事があります、たとえばプログラムはネストせずに repeat 100 と書けば100回繰り返しが行われますがこの様に、
repeat 10
repeat 100
loop
loop

ネストした場合は、100回を10回繰り返す事になるため、その結果 合計で 100×10で1000回分繰り返しているのと同じになります。まあこれは当たり前の事ですが慣れるまで気に止めて置いてください。

続いて中の動きを見て見ましょう。
といっても処理が早すぎて一瞬で終わってしまうので、前に覚えた wait 命令を入れてゆっくり確認します。

repeat 4
cnt2=cnt
repeat 10
boxf cnt * 40 , cnt2 * 60 , cnt * 40 + 30 , cnt2 * 60 + 50
wait 10
loop
loop


このサンプルを実行させると、まず横方向に1列の四角形が10個表示されて、それから下方向に四角形約1つ分ずれた所から また横方向に10個表示されて・・・と言う風に4回繰り返して停止している事が分かります。

「1つ目の repeat」の cnt2 は四角形の縦方向(上から下)の移動に使われています。(縦方向に4列表示するための物です。)
そして「2つ目の repeat」の cnt はさっきと同じで横方向の移動に使われています。(横方向に10個連続で表示される部分です。)
boxf の引数の変化が分かるように表にして見ました。(全部で 10*4=40 回分)
00 : boxf 0	, 0 	, 30	, 50
01 : boxf 40 , 0 , 70 , 50
02 : boxf 80 , 0 , 110 , 50
03 : boxf 120 , 0 , 150 , 50
04 : boxf 160 , 0 , 190 , 50
05 : boxf 200 , 0 , 230 , 50
06 : boxf 240 , 0 , 270 , 50
07 : boxf 280 , 0 , 310 , 50
08 : boxf 320 , 0 , 350 , 50
09 : boxf 360 , 0 , 390 , 50
10 : boxf 0 , 60 , 30 , 110
11 : boxf 40 , 60 , 70 , 110
12 : boxf 80 , 60 , 110 , 110
13 : boxf 120 , 60 , 150 , 110
14 : boxf 160 , 60 , 190 , 110
15 : boxf 200 , 60 , 230 , 110
16 : boxf 240 , 60 , 270 , 110
17 : boxf 280 , 60 , 310 , 110
18 : boxf 320 , 60 , 350 , 110
19 : boxf 360 , 60 , 390 , 110
20 : boxf 0 , 120 , 30 , 170
21 : boxf 40 , 120 , 70 , 170
22 : boxf 80 , 120 , 110 , 170
23 : boxf 120 , 120 , 150 , 170
24 : boxf 160 , 120 , 190 , 170
25 : boxf 200 , 120 , 230 , 170
26 : boxf 240 , 120 , 270 , 170
27 : boxf 280 , 120 , 310 , 170
28 : boxf 320 , 120 , 350 , 170
29 : boxf 360 , 120 , 390 , 170
30 : boxf 0 , 180 , 30 , 230
31 : boxf 40 , 180 , 70 , 230
32 : boxf 80 , 180 , 110 , 230
33 : boxf 120 , 180 , 150 , 230
34 : boxf 160 , 180 , 190 , 230
35 : boxf 200 , 180 , 230 , 230
36 : boxf 240 , 180 , 270 , 230
37 : boxf 280 , 180 , 310 , 230
38 : boxf 320 , 180 , 350 , 230
39 : boxf 360 , 180 , 390 , 230

ちなみに足し算より掛け算の優先順位が高いのでたとえば 2+4*6 と言う式があったら 4*6 が先に計算され、最後に 2+24 が実行されるので答えは 26 になります。

ではこれらを知った上でもう一度最初のスクリプトを見て見ましょう。

color 120,50,255

repeat 10
cnt2=cnt

repeat 10
boxf cnt*20,cnt2*20,cnt*20+10,cnt2*20+10
loop
loop


今ならこれが何をしているのかが分かるでしょう、全ては基本の積み重ねなのです。
どんなに高い山も全てはこの道にあると言う事ですね。(カッコイイ~~~!!バキ/☆д★)
関連記事

コメント

コメントの投稿

   管理者にだけ表示を許可する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。