前回は、
というのを行いましたが、SmallBASICではGUIも使えます。
近年の言語はウィジェットを使ったプログラミングが当たり前に行えるわけですが、
と記述すると
のような表示になり、これを
とすると、
のようになります。とりあえず、今回はGUIではなく、テキストウインドウでのプログラムになります。
■ サブルーチン
今回はサブルーチンを使ったプログラムについて紹介しようかなと思うのですが、記述自体は
のような感じで行い、それを呼び出して使うことになります。
とりあえず、サブルーチンは同じ処理を流用する場合に記述をその都度行わなくても済むようになるのですが、
のような感じで変数が変わっていて処理自体が同じ場合だと近矩史の記述ができます。コードを見てもらうとお気づきかと思いますが、
aがサブルーチン名になります。これが任意の文字というのを見てもらうと
【 _(アンダースコア)と命令に被らない名称だと大丈夫 】
になります。この辺りは、変数名と同じような感じで名前を付けることができます。
これを通常の記述で行うと
のような感じになるのですが、
な感じで記述が長くなると変数違いの同じ処理だとサブルーチンを使ったほうが、コードを短くできます。これを実行してみると
のような感じになります。また、サブルーチンですが、
のような感じで複数のサブルーチンを用意して呼び出して処理をすることができます。
■ サブルーチンを使ったプログラム
とりあえず、
のようなのを書いてみました。
【 解説 】
とりあえず、
のような感じで、最初にタイトルバーに文字を入れて、その後、回帰のポイントを作ります。これは後の処理でこのラベルが何であるかがわかりますが、その処理の後に、
【 TextWindow.Clear() 】
で画面をクリアにします。
そして、今回は変数は入力を行う仕様にしているので
【 TextWindow.ReadNumber() 】
を用いています。
そして、
に続きます。これは、数値の超過があった場合の処理になります。とりあえず、10超過(11以上)だとメッセージが出る仕様にしているのですが、これは、表示をした後に、ラベルまで戻るような処理です。つまり、
rp:のラベルからEndIfまでの構造がリピート数の範囲判定になります。ここでは0以下の数値の判定をしていませんが、この場合、上記の処理にElseIfで N<1で判定をして同じような処理をする感じです。文字列が異なるだけで処理自体はrp:に戻るような構造にすると範囲指定をしてそこから数値が超えないように指定できます。つまり、この部分というのは、
【 数値の超過という問題がある場合にそのエラー処理をしている 】
ので、条件が満たされていない場合にはそこでループが発生します。この場合、ForやWhileなどとは異なるものの条件判定でループするような構造になります。
その後 a()でサブルーチンを呼び出しています。
29行が飛んでいますが、次の行から反復処理になります。
ここは一つの処理になっていますが、処理が終わった後にループをするかそれともそのまま終わるか?という処理です。ここで 【 st: 】 のラベルへ戻るようになっていますが、これがプログラムの先頭に戻るような処理になっています。この場合、条件的に1以外は終了なので、1かそれ以外かの判定になります。
そのまま終わってもいいのですが、文字を表示させて終わらせるような仕様にしました。
そして、最後のが
のようなサブルーチンの部分になります。今回は単なる数値の表示ですが、For ~ EndForのループでそれをSub~EndSubの中に挟んでサブルーチンとして機能させています。
実際に走らせてみると
のように大きな数字だとループが発生し、条件を満たすとサブルーチンに入ってその処理が終わると処理のループをするか否かの判定を行います。とりあえず、ここは数値判定をしていないので、1意外だと終わる仕様になっていまsが、2を選ぶとこんな感じにの処理になります。
とりあえず、
のような感じで処理を行って、1を選択します。すると、このプログラムでは
のst:に戻るので、その後の行の画面の初期化が行われます。その為、1を選択するとプログラムが再度実行されるので、
のように、常に新規入力の状態にできます。
■ Appendix
今回はサブルーチンを使いましたが、今回のは初期化をして動くし仕様にしていますが、今回は変数について一番最初に
というのを掲載しました。この処理はサブルーチンを行うと最初の処理と次の処理で変数が変わっています。とりあえず、同じ変数名の場合、新規に書き換えられた数値が反映されるので、
X=X+1
のような処理が成立しますが、上記のような内容だと、変数自体が書き換えられている事例になります。その為、サブルーチンの呼び出しをすると、実行前に代入された値を参照するのでそう言った処理になります。
【 TextWindow.ReadNumber 】 については入力した値が常に変数に反映されるので、前の回に実行した数値は入力後に消えてしまいます。
こういう仕様だと変数が常にクリアされる仕様のプログラムになりますが、変数で初期値を設定してプログラム内で変動させるだけの仕様だとループをさせるとその数値は変動した結果が残るのですが、この数値はメモリーの特定のアドレスに保存されています。
その為、そう言う変数は維持できますが、今回のような仕様だと新規に入力を始めた段階でも前の変数の値は維持されないという特性があります。
また、仮にこれを別の変数に代入して保存すると仮定しても、これはメモリーでの保存ですから、そのプログラムを閉じると変数は消えてしまいます。
ゲームにおいてデータセーブが存在するのは、ゲーム内のデータというのが変数の塊で、実行時にはメモリーの特定のアドレスに保存されているだけの状態ですから、その状態でゲームを終了するとデータがすべて消えてしまうからです。
このデータの記録というのは変数が任意の形で保存されています。この時に、変数をメモリーアドレス上の数値ではなく、ファイルで保存されています。その為、揮発性のあるものではなく、ストレージ内に任意のファイル形式で保存された形式にしなければなりません。
その為、プログラムの中で使用している変数を残す必要がある場合だと、そうした機構を実装しなくてはなりません。