クリエイター手抜きプロジェクト[625]IoT Orange pico編 サブルーチンを使う
── 古籏一浩 ──

投稿:  著者:



今回は、Orange pico(Orangino)でサブルーチンを使ってみます。前回のタートルグラフィックスと組み合わせて、図形をアニメーションさせます。

プログラムで何か処理を行う場合、メイン(主)となる部分があります。プログラム作成に慣れていないと、とにかく上から下まで長い長いコードを書いてしまう人もいます。すべてがメインプログラムということがあります。

もちろん、短いプログラムであればメイン部分しかないこともあります。簡単なスクリプト系では、メイン処理だけで十分というのもあります。

しかし、プログラムが長くなると見通しが悪くなります。また、同じ処理を何度も描くというのは非効率的です。また、少しの修正でも全体を見渡して確認しなければならず、どこでミス(修正しなかった等)が発生するか分りません。

そんな時は、同じような処理はまとめておくのがセオリーです。多くのプログラム言語では、処理をまとめておく機能があります。それは関数だったり、クラスだったりするわけです。





古い時代のBASICにも処理をまとめておき、呼び出すことができる機能があります。それがサブルーチンです。メインルーチンに対して「サブ」のルーチンということです。

古い時代のBASICは、大規模なプログラムどころか、中規模なプログラム開発にも向いていません。多くの言語が備えている機能がないためです。特にローカル変数がないため、サブルーチンを呼び出すにしてもグローバル変数を使い回すことになります。(もちろん、工夫次第でローカル変数のようなことはできます)

逆に大規模、中規模のプログラムを作らなければ、どうにかなる範囲だともとらえることができます。BASICではメインルーチンとサブルーチンの区別がなく、自分で行番号で管理することになります。

例えば、10〜100行までがメインルーチンで、2000行以降はサブルーチンにするという感じです。サブルーチンはキリのいい番号から始めるようにすると、多少プログラムを把握しやすくなります。

サブルーチンは、gosubを使って指定した行番号以降の処理を呼び出します。呼び出した次の処理に戻るには、returnを使います。

それでは簡単なサブルーチンを作って呼び出してみましょう。以下のプログラムは、100行目以降がサブルーチンになっています。単純にaとbの変数を掛け算した結果を表示するだけの、シンプルなサブルーチンです。

10 a=2:b=5
20 gosub 100
30 a=3
40 gosub 100
50 b=10
60 gosub 100
70 end
100 print a*b
110 return

このプログラムを実行すると、以下のように表示されます。

10
15
30

この程度の処理では、サブルーチンのありがたみはありません。そこで、前回やったタートルグラフィックスと組み合わせてみましょう。以下のプログラムは、100行以降が星を描くサブルーチンです。実行するとグラフィックス画面に、ランダムに星が描かれていきます。

10 cls
20 turtle 1,rnd(320),rnd(200),0,0
30 gosub 100
40 pause 200
50 goto 20
90 ' STAR subroutine
100 for i=0 to 5
110 move 15
120 turn -72
130 move 30
140 turn 144
150 move 15
160 next
170 return

星をランダムに回転させて描画する場合、サブルーチンの変更はありません。メインルーチンで回転角度を指定するだけです。サブルーチンは、なるべく変更しないようなプログラムを書いておくのがポイントです。が、ここらへんはどうしても経験がものを言うことがあります。

10 cls
20 turtle 1,rnd(320),rnd(200),0,0
30 turn rnd(72)
40 gosub 100
50 pause 200
60 goto 20
90 ' STAR subroutine
100 for i=0 to 5
110 move 15
120 turn -72
130 move 30
140 turn 144
150 move 15
160 next
170 return

今度は星が回転するアニメーションですが、やはりサブルーチン部分の変更はありません。

10 cls
20 turtle 1,160,100,0,0
30 for deg=0 to 360
40 cls:gosub 100
50 turn 1
60 pause 10
70 next
80 goto 30
90 ' STAR subroutine
100 for i=0 to 5
110 move 15
120 turn -72
130 move 30
140 turn 144
150 move 15
160 next
170 return

星が回転し、さらに拡大するアニメーションの場合、サブルーチン側で移動量を角度に合わせて変更します。ここらへんは、どうしてもメインルーチンで使われている変数(deg)に依存してしまいます。ここらへんはBASICの仕様上、仕方ない部分もあります。

10 cls
20 turtle 1,160,100,0,0
30 for deg=0 to 90
40 cls:gosub 100
50 turn 1
60 pause 10
70 next
80 goto 30
90 ' STAR subroutine
100 for i=0 to 5
110 move 15*deg/40
120 turn -72
130 move 30*deg/40
140 turn 144
150 move 15*deg/40
160 next
170 return


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/

雨降りすぎて畑に入れず草だらけに。とにかく晴れないとどうしようもない状態です。そんな雨にもかかわらず、のこのこやってくるのが猫のマイケル。他の猫もやってくるのですが、玄関前に鎮座し俺の家だと言わんばかりの振る舞い。気が弱いのに、結構ずうずうしい。おまけに、どうにかして家の中に入ろうと目論んでる。しかし、その目論見はミッションインポッシブル(?)。無理なのだよ、マイケル。

と高笑いしていたら、何か違う事態に。玄関ドアをあけようとすると、すぐにマイケルが入ろうとするため、自分や家族が家に入れない。こっちがミッションインポッシブル!

・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram

・8K/4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/

・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/