このページはIE6.0で表示確認しました。




tips top   ひまわりのススメ top   top


プログラムがすごく長くなっちゃった…


とても長くなってしまったので一つページを作ってしまいました。

あんまりプログラムが長いと掲示板に投稿できないし、長いせいで実行が遅くなることも。
メンテナンスも大変になるし、できるだけソースは簡潔にしたいですよね。
そこでプログラムを短くするためのポイントを。
プログラム作成時にコピー&ペーストしませんでしたか?
プログラムを短くするコツはコピー&ペーストしないの一言につきます。
コピー&ペーストしないためにはどうするかというと、ラベルと「反復」命令を活用します。
特にラベルを使う方法はお勧め。
とても簡単だし、速さも損ないません。

では早速、方法を。
…良い例が浮かばないなぁ。
とりあえず、こんなプログラムをサンプルにしてみます。
長いですぞー。
タブ1ラベルを、ラベルとして、作成。
その、テキストは、「 タブ1 」
その、イベントは、(
 もし、元オブジェクト=「タブ1ラベル」ならば、戻る。
 元オブジェクト=「タブ1ラベル」。
 「タブ一パネル」の、可視は、オン。
 「タブにパネル」の、可視は、オフ。
 )

タブ2ラベルを、ラベルとして、作成。
その、テキストは、「 タブ2 」
その、位置は、タブ1ラベルの、右側。
その、イベントは、(
 もし、元オブジェクト=「タブ2ラベル」ならば、戻る。
 元オブジェクト=「タブ2ラベル」。
 「タブにパネル」の、可視は、オン。
 「タブ一パネル」の、可視は、オフ。
 )

タブにパネルを、パネルとして、作成。
その、テキストは、タブに。
その、位置は、(タブ1ラベルの、下側)。
その、Yは、(その、Y)+3
タブ一パネルを、パネルとして、作成。
その、テキストは、タブ一。
その、位置は、タブにパネルの、位置。

タブ1ラベルの、イベント。
待機。
見たことがある方もいらっしゃると思いますが、「簡易タブシステム」みたいなプログラムです。
少しでも短くするために、いろいろと削ったので見た目はあまり良くありませんが、一応動きます。
部品のラベルをクリックすると、特定のパネルが見えるようになるプログラムです。
このプログラムを短くするポイントは、各ラベルのイベントです。
イベント内容は可視をオンにするパネルとオフにするパネルが違うだけでほぼ一緒です。
同じ部分だけ、抜き出すと、こんな感じになります。
 もし、元オブジェクト=「***」ならば、戻る。
 元オブジェクト=「***」。
 「***」の、可視は、オン。
 「***」の、可視は、オフ。
***の部分は決まっていないので、***に当たる部分を適当な変数に置き換えておきましょう。
すると、こんな感じに。
 可視パネルは、「***」
 不可視パネルは、「***」
 もし、元オブジェクト=(イベントオブジェクトの、名前)ならば、戻る。
 元オブジェクト=(イベントオブジェクトの、名前)。
 可視パネルの、可視は、オン。
 不可視パネルの、可視は、オフ。
二行増えてしまったけれど、これなら後ろ四行が全く同じになります。
そこで、全く同じになったところをサブルーチンとして別のラベルにしてしまいましょう。
*タブイベント
 もし、元オブジェクト=(イベントオブジェクトの、名前)ならば、戻る。
 元オブジェクト=(イベントオブジェクトの、名前)。
 可視パネルの、可視は、オン。
 不可視パネルの、可視は、オフ。
 戻る。
…これだと短くなった気がしない?
そうですねぇ。確かに。
このプログラムでは、重なっている部分が二つと少ないのであまり短くなった気はしないけれど、重なっている部分が三つ以上ある場合は、確実にこの方法を使うと短くできます。
ただし、このプログラムに限り、後もう1行、構造を見直すことにより、減らすことが出来ます。
と、言うわけで、もう少し、シェイプアップしてみましょう。
タブ1ラベルを、ラベルとして、作成。
その、テキストは、「 タブ1 」
その、イベントは、(可視パネルは、「タブ一パネル」。タブイベント。)

タブ2ラベルを、ラベルとして、作成。
その、テキストは、「 タブ2 」
その、位置は、タブ1ラベルの、右側。
その、イベントは、(可視パネルは、「タブにパネル」。タブイベント。)

タブにパネルを、パネルとして、作成。
その、テキストは、タブに。
その、位置は、(タブ1ラベルの、下側)。
その、Yは、(その、Y)+3
タブ一パネルを、パネルとして、作成。
その、テキストは、タブ一。
その、位置は、タブにパネルの、位置。

タブ1ラベルの、イベント。
元オブジェクト=「タブ1ラベル」
待機。

*タブイベント
 もし、元オブジェクト=(イベントオブジェクトの、名前)ならば、戻る。
 元オブジェクト=「{イベントオブジェクトの、名前}」。
 可視パネルの、可視は、オン。
 不可視パネルの、可視は、オフ。
 不可視パネルは、可視パネル。'<==追加
戻る。
元は29行、シェイプアップ後は28行。
うーん、あんまり変わってないや…
でも、見やすくなったでしょう?
今のままだとタブが二つしかないから効果がいまいちだけど、三つ以上だと、確実に行数が減ったことを確認できます。
また、処理の数が多ければ多いほど行数は減ります。
反対に、ラベルを使っても、行数が変わらない場合や、増えてしまう場合もあります。
そんなときは「反復」命令を使いましょう。
と、言うわけで、「反復」説明用のサンプルプログラム。
「昔あるところに、おじいさんとおばあさんがいました。」と、表示。
1秒、待つ。
「おばあさんが拾ったモモの中から男の子が出てきました。」と、表示。
1秒、待つ。
「男の子の名前を桃太郎に決めました。」と、表示。
1秒、待つ。
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
「桃太郎はマッハで成長して鬼退治に出かけました。」と、表示。
1秒、待つ。
「途中で犬・猿・キジを仲間にしました。」と、表示。
1秒、待つ。
「鬼を退治して宝を奪い返しました。」と、表示。
1秒、待つ。
「めでたしめでたし。」と、表示。
1秒、待つ。
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
終わり。
なんだか似たような命令がずらり、ですね…。
当然、コピー&ペーストをしまくって作りました。
一応、長い文章を1行ずつ表示して、ある程度になったらページをめくって次の文章を表示するというプログラムのつもり。
紙芝居みたいなものかな?
基本的に、「文章を表示させ、1秒待つ。」という動作を繰り返しています。
そして、ある程度表示させたら、「画面クリアして、演奏。」
これが基本的な流れですね。
このプログラムを短くするには、反復を使います。
ラベルを使うこともできますが、かえって行数を増やすだけ。
試しにラベルを使ってみましょう。
文章=「昔あるところに、おじいさんとおばあさんがいました。」
文章表示。
文章=「おばあさんが拾ったモモの中から男の子が出てきました。」
文章表示。
文章=「男の子の名前を桃太郎に決めました。」
文章表示。
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
文章=「桃太郎はマッハで成長して鬼退治に出かけました。」
文章表示。
文章=「途中で犬・猿・キジを仲間にしました。」
文章表示。
文章=「鬼を退治して宝を奪い返しました。」
文章表示。
文章=「めでたしめでたし。」
文章表示。
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
終わり。

*文章表示
文章と、表示。
1秒、待つ。
戻る。
設定したラベルの分、行数が増えてしまいました。

ここで一応、「反復」命令のおさらいをしておきましょう。
分かっている方は、次の行間までとばしちゃってかまいません。
反復命令は、こんな風に使います。(マニュアルより抜粋)
{配列変数に、値を代入する}
あ#0=「寿司」
あ#1=「天ぷら」
あ#2=「うどん」
あ#3=「牛丼」
{配列の各要素を、それに列挙しながら反復する}
あを、反復(
  「客¥「今日{それ}は、美味しい?¥」」を、表示。
)。
前半の、「配列変数に値を代入する」部分は、こんな風に書いた方が簡単です。
あ=「寿司
天ぷら
うどん
牛丼」
更に、改行の部分を、「¥n」に書き換えるとこんな風になります。
あ=「寿司¥n天ぷら¥nうどん¥n牛丼」
あを、反復(
  「客¥「今日{それ}は、美味しい?¥」」を、表示。
)。
つまり、四行で書ける内容だと言うことが分かります。(更に短くすると二行になります。)
ちなみに、反復命令を使わないと、こうなります。
「客¥「今日寿司は、美味しい?¥」」を、表示。
「客¥「今日天ぷらは、美味しい?¥」」を、表示。
「客¥「今日うどんは、美味しい?¥」」を、表示。
「客¥「今日牛丼は、美味しい?¥」」を、表示。
なんだかどこかで見たような感じだなぁ。
行数は同じですが、先ほどのプログラムを打ち込む方が簡単そうです。
「反復」命令のメリットは記述が楽になる、プログラムのサイズが減るの二つ。
なんとなーく、分かっていただけましたか?
使い方も分かっていただけたかと思います。

さて。先ほどのサンプル(桃太郎)に戻ります。
マニュアル通りに反復命令を使うと、こんな感じになるかな。
文章=「昔あるところに、おじいさんとおばあさんがいました。
おばあさんが拾ったモモの中から男の子が出てきました。
男の子の名前を桃太郎に決めました。」
文章を、反復(
それを、表示。
1秒、待つ。)
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
文章=「桃太郎はマッハで成長して鬼退治に出かけました。
途中で犬・猿・キジを仲間にしました。
鬼を退治して宝を奪い返しました。
めでたしめでたし。」
文章を、反復(
それを、表示。
1秒、待つ。)
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
だいぶ短くなりました。
でも、同じことを書いてある部分があります。
文章を、反復(
それを、表示。
1秒、待つ。)
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
この部分です。
全く同じ、と言うことは、先ほどのラベルのテクニックが使えます。
文章=「昔あるところに、おじいさんとおばあさんがいました。
おばあさんが拾ったモモの中から男の子が出てきました。
男の子の名前を桃太郎に決めました。」
文章表示。

文章=「桃太郎はマッハで成長して鬼退治に出かけました。
途中で犬・猿・キジを仲間にしました。
鬼を退治して宝を奪い返しました。
めでたしめでたし。」
文章表示。

終わり。

*文章表示
文章を、反復(
それを、表示。
1秒、待つ。)
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
戻る。
だいぶ分かりやすくなりました。
ところで、更に短くする方法があります。
分かりますか?
ちょっと難しい目です。
文章1=「昔あるところに、おじいさんとおばあさんがいました。
おばあさんが拾ったモモの中から男の子が出てきました。
男の子の名前を桃太郎に決めました。」

文章2=「桃太郎はマッハで成長して鬼退治に出かけました。
途中で犬・猿・キジを仲間にしました。
鬼を退治して宝を奪い返しました。
めでたしめでたし。」

2回(
「文章{回数}を、反復(
それを、表示。
1秒、待つ。)」を、ひまわりする。
画面クリア。
ランタイムのパス&「tools\\n.wav」を、演奏。
)
終わり。
このサンプルにしか使えない方法、ですね。
ちょっとずるっぽいかもしれないけど、物語の部分を外部ファイルにしてしまうと、更にプログラムは短くなります。
こんな感じに。
作業フォルダ=母艦のパス。
「*.txt」の、ファイル列挙。
ソート。
反復(
 それを、開く。
 反復(
  もし、それ=「」ならば、それ=「 」。
  表示。1秒、待つ。
  もし、回数=10ならば、抜ける。'あんまり長いと大変なことに。
 )
 画面クリア。
 ランタイムのパス&「tools\\n.wav」を、演奏。
)
終わり。
プログラムと同じフォルダ内に「001.txt」「002.txt」などのテキストファイルを置いておくとちゃんと動いてくれます。
ノベルゲームを作るときにでも、参考にしてくださいませ。

ちなみに、反復命令は何をするときによく使うかというと、まとめて部品を作るときです。
例えば、タブ用にパネルを作るとき。
3回(
「パネル{回数}を、パネルとして、作成。」を、ひまわりする。
その、位置は、(10,10)。)
みたいな感じにします。
又、複数のボタンを作るときやラベルを作るときも
「あいうえお
かきくけこ
さしすせそ」を、反復(
「{それ}ボタンを、ボタンとして、作成。」を、ひまわりする。
その、テキストは、「{それ}書き込み」
その、幅は、250。
その、高さは、30。
「その、イベントは、{それ}イベント。」を、ひまわりする。
)
ってな具合に使うことが出来ます。

そうそう。もう一つ。
プログラム内で被っているところはないか、無駄な処理をさせていないか、見直すことも大切です。
特に無駄な処理はエラーの原因にもなります。
処理が増えるってことはつまり遅くなるってことで。
無駄な処理って思わぬところに潜んでいるので見逃さないように注意しましょう。
かく言う私も、無駄な処理を反復命令内で行っていたことがあり、プログラム公開後二ヶ月以上経ってから発見し、多大なショックを受けました。
「うわーーーっっ何をしてるんだあぁぁ!!私っ!!」みたいな感じで。
なんていうか大後悔時代開幕?みたいな。
そんな事態を避けるためにもソースは見やすく書き、見直しは注意深く何回も行うことをお勧めします。

最後まで読んでくださってどうもありがとうでした。(^^)

tips top  ひまわりのススメ top  top