【ウディタ】X番の変数呼出でプログラムを短くしてみる。

2020-06-05ウディタ機能解説

以前こちらの記事で、X番の変数呼出の使用例を後に紹介する、みたいなことを書いていました。

今回はそちらを紹介できればな、と。

とはいえ筆者も使用経験が少ないため、紹介するのは一例のみです。網羅的でなく非常に申し訳ないのですが、ご理解いただければと思います。

九九の答えを順番に、別々の変数に代入するプログラム

今回はコモンセルフ変数10番~14番それぞれに、2の段の九九の答えを順番(昇順)に代入するというプログラムを書いてみます。ちなみにかけられる数は1から5までにします。

つまり

Cself10 = 2 [2×1の答え]
Cself11 = 4 [2×2の答え]
Cself12 = 6 [2×3の答え]
Cself13 = 8 [2×4の答え]
Cself14 = 10 [2×5の答え]
※"Cself"はコモンセルフ変数のこと

となるプログラムを書くということです。

まあ、順番に出てきた答えをわざわざ別々の変数に格納するなんて非効率なことは滅多にしないとは思いますが(似たような処理ならDBで済ませてしまうでしょう)、他に分かりやすい例が思いつかなかったので、こちらをご紹介させていただきます。

さて、この場合どのようなコードを書きますか?

一番アウトなやつ

これは一番ダメなパターンです。

|■変数操作: CSelf10 = 2 * 1 
|■変数操作: CSelf11 = 2 * 2 
|■変数操作: CSelf12 = 2 * 3 
|■変数操作: CSelf13 = 2 * 4 
|■変数操作: CSelf14 = 2 * 5

掛け算の答えを直接代入しているパターン。

なぜいけないのかと云いますと、このように書くと応用が利かないからです。

もしも代入したい九九を3の段にしたくなったら?
当然、一つ一つの数値を書き換えねばなりません。

しかしその作業が10個も20個もあれば……。
ものすごく面倒ですね。

この面倒な作業をなくすには、代入する数値を変数に置き換えるのが一番でしょう。

これでも動くけど……なプログラム

ということで、変数を使ってみました。

  |■変数操作: CSelf20[九九の段] = 2 + 0 
  |■変数操作: CSelf21[かける数] = 1 + 0 
  |▼  
  |■変数操作: CSelf10 = CSelf20[九九の段] * CSelf21[かける数] 
  |■変数操作: CSelf21[かける数] += 1 + 0 
  |■変数操作: CSelf11 = CSelf20[九九の段] * CSelf21[かける数] 
  |■変数操作: CSelf21[かける数] += 1 + 0 
  |■変数操作: CSelf12 = CSelf20[九九の段] * CSelf21[かける数] 
  |■変数操作: CSelf21[かける数] += 1 + 0 
  |■変数操作: CSelf13 = CSelf20[九九の段] * CSelf21[かける数] 
  |■変数操作: CSelf21[かける数] += 1 + 0 
  |■変数操作: CSelf14 = CSelf20[九九の段] * CSelf21[かける数] 

初めの2行で、変数操作を使っています。

1行目は九九の段。
2行目は、かける数の初めの数値。([2×1]の、1の部分。この数値を変えれば[2×3]や[2×15]などから昇順に計算することもできます)

しかしこのプログラムですと、代入したい変数が増えた場合は下にどんどん追加していく必要があります。もし使用したい変数が10個も20個もあれば……。

ソースコードが超長くなります。

やはりこちらも、非効率といえるでしょう。

X番の変数呼出、登場!

ここでようやくX番の変数呼出が活躍します。

この機能を使った、同じ結果を出すコードはこちらです。

■回数付きループ [ 1 ]回
 |■変数操作: CSelf20[九九の段] = 2 + 0 
 |■変数操作: CSelf21[かける数] = 1 + 0 
 |■変数操作: CSelf22[変数呼出値  格納用] = 1600010 + 0 
 |▼  
 |■回数付きループ [ 5 ]回
 | |■変数操作: V[CSelf22[変数呼出値  格納用]] = CSelf20[九九の段] * CSelf21[かける数] 
 | |■変数操作: CSelf22[変数呼出値  格納用] += 1 + 0 
 | |■変数操作: CSelf21[かける数] += 1 + 0 
 | |■
 |◇ループここまで◇◇
 |■
◇ループここまで◇◇

↓エディタに貼り付ける用のコードです。
コピーしましたら、エディタ内の貼り付けたい場所を右クリックして『クリップボード→コード貼り付け』を選んでください。

WoditorEvCOMMAND_START
[179][1,0]<0>(1)()
[121][4,0]<1>(1600020,2,0,0)()
[121][4,0]<1>(1600021,1,0,0)()
[121][4,0]<1>(1600022,1600010,0,4)()
[103][0,1]<1>()(" ")
[179][1,0]<1>(5)()
[121][4,0]<2>(1600022,1600020,1600021,8208)()
[121][4,0]<2>(1600022,1,0,256)()
[121][4,0]<2>(1600021,1,0,256)()
[0][0,0]<2>()()
[498][0,0]<1>()()
[0][0,0]<1>()()
[498][0,0]<0>()()
WoditorEvCOMMAND_END

貼り付け方はこちらの記事でも解説しております。

先程よりもスッキリとしたコードで、数値を書き換えても機能するプログラムができました。
ここからはコード解説をさせていただきます。

1~3行目

|■変数操作: CSelf20[九九の段] = 2 + 0
|■変数操作: CSelf21[かける数] = 1 + 0
|■変数操作: CSelf22[変数呼出値  格納用] = 1600010 + 0

1~2行目は、先述したとおり。

3行目では、変数に「変数呼び出し値」を代入しています。
こちらのコードでは分かりにくいですが、右辺の1600010は「データを呼ばない」にチェックを入れているのでお忘れなく。

6,7行目

回数付きループを飛ばして、先にこちらのコードを説明させていただきます。

| |■変数操作: V[CSelf22[変数呼出値  格納用]] = CSelf20[九九の段] * CSelf21[かける数] 
| |■変数操作: CSelf22[変数呼出値  格納用] += 1 + 0 

まずは上の行から。

左辺の先頭に"V"がついているのは、左辺の「X番の変数呼出」にチェックを入れているからです。
つまり「コモンセルフ変数22番に格納されたコモンセルフ変数」に、九九の結果を代入している式となっています。

次に下の行。

こちらでは『次のループで算出された答えを代入する変数』を指定しています。

と云われても分かりにくいと思いますので、現地点でコモンセルフ22番に1600010(コモンセルフ10番の変数呼び出し値)が代入されていると仮定して考えてみましょう。

7行目の " Cself22 += 1 + 0 " が実行されることで、コモンセルフ22番は1600010に1が足された1600011という数字になります。

1600011は、コモンセルフ11番の変数呼び出し値。

つまり、次のループで6行目のコードが実行されたとき、先程とは別の変数に九九の答えを代入できるようになるのです。

8行目

| |■変数操作: CSelf21[かける数] += 1 + 0

こちらは、九九の段にかける数( 2*1 でいうところの1の部分)の数値を変更する式です。
これにより [2×1] , [2×2] , [2×3] … と順に答えが出るようになります。

戻って5行目(回数付きループ)

|■回数付きループ [ 5 ]回
| |■変数操作: V[CSelf22[変数呼出値  格納用]] = CSelf20[九九の段] * CSelf21[かける数] 
| |■変数操作: CSelf22[変数呼出値  格納用] += 1 + 0 
| |■変数操作: CSelf21[かける数] += 1 + 0 
| |■
|◇ループここまで◇◇

九九の計算を変数に代入するまでの流れを繰り返す処理です。

5という数字は、九九の結果を代入する変数の総数です。コモンセルフ10,11,12,13,14。全部で5個。くれぐれも「14-10=4だから、4回ループ!」としないようご注意くださいね。

また、代入したい変数を増やしたければ、ループ回数を増やすだけで実装可能なので便利です。

確認用コード

このプログラムがちゃんと動くのか、ちゃんと変数に値が代入されているかを確かめたい方は、下記で紹介するコードを先程書いたコードの後ろに追加してみてください。

実行すれば、ピクチャで結果を表示することができます。

追加するコード

コモンセルフ変数5番と30番を使用。
ピクチャ番号は1を使用しています。

使用する変数などは、ご自身の環境に合わせてご自由に変更ください。

↓追加するコード(コメントが多いため長く見えますが、実際はそうでもありません)

■文字列操作:CSelf5 = ""
▼ 答えが代入されるコモンセルフ変数の、先頭の番号を指定してください。(コモンセルフ変数10番~14番を使用する場合なら、はじめの番号である10を代入)
■変数操作: CSelf30 = 10 + 0 
▼  
▼ ループ回数は答えが代入されるコモンセルフ変数の、個数を指定してください。
■回数付きループ [ 5 ]回
 |■文字列操作:CSelf5 += "Cself\cself[30] = \cself[\cself[30]]\n"
 |■変数操作: CSelf30 += 1 + 0 
 |■
◇ループここまで◇◇
■ピクチャ表示:1 [左上]文字列[\cself[5]] X:0 Y:0 / 0(0)フレーム  / パターン 1 / 透 255 / 通常  / 角 0 / 拡 100% / カラー R[100] G[100] B[100]

↓コピペ用のコードです。

WoditorEvCOMMAND_START
[122][2,1]<0>(1600005,0)("")
[103][0,1]<0>()("答えが代入されるコモンセルフ変数の、先頭の番号を指定してください。(コモンセルフ変数10番~14番を使用する場合なら、はじめの番号である10を代入)")
[121][4,0]<0>(1600030,10,0,0)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("ループ回数は答えが代入されるコモンセルフ変数の、個数を指定してください。")
[179][1,0]<0>(5)()
[122][2,1]<1>(1600005,256)("Cself\cself[30] = \cself[\cself[30]]<\n>")
[121][4,0]<1>(1600030,1,0,256)()
[0][0,0]<1>()()
[498][0,0]<0>()()
[150][11,1]<0>(32,1,0,1,1,1,255,0,0,100,0)("\cself[5]")
WoditorEvCOMMAND_END

適当なマップイベントでコモンイベントを呼び出し、実行すればこのように表示されます。

おわりに

いかがでしょう。
ご理解いただけましたでしょうか。分かりにくかったら申し訳ありません……。

実際に動かしてみたほうが早いと思うので、数値をいじってみながら理解を深めていってくださいね。

わざわざX番の変数呼出を使う機会ってあまりないと思いますが、

「法則性のある別々の値を代入したい。でもDBを使うほど大量の数値は扱わない・またはDBを使いたくない」というときに役立つのではないでしょうか。

他にも使い道があると思うので、もしも「こんな使い方があるよ!」という方はぜひぜひコメント欄でご教示いただければ幸いです(#^^#)