変数に対する代入と演算の方法

はじめに

変数とは、文字を書いた紙や分銅をしまっておく箱だと書きました。であれば当然、箱に物を入れたり、箱の中身を調べたりする手段が必要です。箱に物を入れることを「代入」、箱の中身を調べるのを「比較」といいます。比較については別ページを参照してください。

変数名

箱には名前を付けないと区別しにくいですね。ですので、変数を使うときには名前を付けます。一般的なスクリプトだと任意の名前を付けられるのですが、キャラフレスクリプトの場合には箱の名前が事前に決められています。
  • 文字を書いた紙、つまり文章を保存しておく箱 が ls (英字のエル、エス)
  • 分銅、つまり数値を保存しておく箱 が lf (英字のエル、エフ)
我々生徒がキャラフレスクリプトで使用できる変数は、この二種類に限ります。他にもいくつかキャラフレスクリプトで使用できる変数がありますが、それらはキャラフレ本体で使用しているものですので、我々生徒がキャラフレスクリプトで使用してしまうと、キャラフレ本体に多大な悪影響を及ぼします。 ls と lf 以外は絶対に使用しないよう、重ねてお願い申し上げます。

 

決まった値を代入するときにはイコールを使う

まずは箱に決まった内容を入れる方法です。

数字の場合

書式 lf[添字]=『数値』

変数lf[25]の中身を38にします。
lf[25]=38

変数lf[73]の中身を0にします。

lf[73]=0

文字の場合

書式 ls[添字]=『文章』(;)

値に空白が含まれている場合には、末尾に(半角の)セミコロンを付けてください。
また、値には以下の文字を含まないようにしてください。”(半角のダブルコーテーション)’(半角のシングルコーテーション)|(半角のパイプ)&(半角のアンパサンド)
例  ls[5]=時間切れ!;
例  ls[6]=間違えたね?;
例  ls[6]=正答です。

実は、代入する命令の先頭に「Let」が省略されているのです。
昔は、変数に値を代入するときには先頭に「Let」つまり「~にしなさい」という命令を書いていたのです。(Let という英単語は「~させる」という意味がありますので)「Let lf[25]=38」と書いて「変数lf[25]の中身=38にしなさい」というわけですね。ですが、あまりにも大量にLetと書く羽目になってしまうので、Letは省略できるようにしようじゃないか、というわけで「lf[25]=38」と書くようになったのです。

スクリプトの初心者は、まずここで悩みます。「lf[25]イコール38?中身は38と違うはず・・・。」と思うわけですね。ややこしいことに、変数の中身が38と比較するときにも、言語によっては=を使いますので、余計に混乱するわけです。

この混同を嫌って、「代入は=、比較は==」という風に別の書き方をするスクリプトもあります。キャラフレスクリプトもこの方式ですね。「代入は:=、比較は=」と書くスクリプトもあります。

計算した結果を代入する場合にはflag系の命令を使う

スクリプトを書いていくと、ある変数の値を1増やしたいとか、変数同士の差を求めたいというときがあります。一般的なスクリプトでは、同じようにLet命令を使用して「(Let)A=B+C」と書くのですが、キャラフレスクリプトの場合には、flag系の命令を使用します。

数値変数lf

加算  lf[添字]=flagAdd:lf[添字],『変数または値』
減算  lf[添字]=flagSub:lf[添字],『変数または値』
乗算  lf[添字]=flagMult:lf[添字],『変数または値』
除算  lf[添字]=flagDiv:lf[添字],『変数または値』
剰余  lf[添字]=flafMod:lf[添字],『変数または値』
数値のコピー  lf[添字]=flagAdd:lf[添字]

文字列変数ls

文字列のコピー  ls[添字]=flagAdd:ls[添字]
文字列の連結  ls[添字]=flagAdd:ls[添字],『変数または値』

flagAddが加算、flagSubが減算、flagMultが乗算、flagDivが除算、flafModが剰余です。

例:変数lf[74]の値を2増やします。

例  lf[74]=flagAdd:lf[74],2

例:変数lf[80]の値を3減らします。

例  lf[80]=flagSub:lf[80],3

例:変数lf[5]の値を4倍にします。

例  lf[5]=flagMult:lf[5],4

例:変数lf[1]の値を1000分の1にします。

例  lf[1]=flagDiv:lf[1],1000

例:変数lf[74]の値を、変数lf[72]と変数lf[71]の和にします。

例  lf[74]=flagAdd:lf[72],lf[71]

lf[80]=flagSub:lf[80],2
ls[2]=flagadd:ls[1],秒
lf[73]=flagAdd:lf[73],lf[71]
lf[74]=flagDiv:lf[74],2
lf[74]=flagadd:lf[74],1
lf[74]=flagadd:lf[74],3
lf[74]=flagadd:lf[74],5
lf[75]=flagDiv:lf[75],3
lf[75]=flagadd:lf[75],lf[77]
lf[76]=flagDiv:lf[76],3
lf[76]=flagadd:lf[76],lf[77]
lf[77]=flagAdd:lf[77],1
lf[7]=flagAdd:lf[7],100
lf[7]=flagAdd:lf[7],lf[76]
lf[7]=flagAdd:lf[7],lf[81]
lf[7]=flagsub:lf[7],lf[75]
lf[80]=flagAdd:lf[80],lf[74]
lf[80]=flagSub:lf[80],lf[74]
lf[8]=flagAdd:lf[8],1
ls[1]=flagAdd:lf[81],0
ls[2]=flagadd:ls[1],秒
ls[5]=flagAdd:lf[7],0
ls[5]=flagAdd:ls[5],秒
ls[5]=flagadd:ls[5],lf[74]
ls[5]=flagadd:ls[5],lf[77]
ls[5]=flagadd:ls[5],点
ls[5]=flagadd:ls[5],秒  
ls[6]=flagAdd:ls[6],lf[72]
ls[6]=flagAdd:ls[6],lf[75]
ls[6]=flagAdd:ls[6],ls[7];
ls[6]=flagAdd:ls[6],点(
ls[6]=flagAdd:ls[6],秒)
ls[7]=flagAdd:ls[7],lf[73]
ls[7]=flagAdd:ls[7],lf[76]
ls[7]=flagAdd:ls[7],点(
ls[7]=flagAdd:ls[7],秒)
ls[8]=flagAdd:ls[8],lf[7]
ls[8]=flagAdd:ls[8],秒掛かった!

添字(そえじ)って?

箱、つまり変数の名前が固定されたら、箱は一つずつしか使えなくなりますね?それでは困ります。ですので、同じ名前の箱を沢山用意して一列に並べ、先頭から何番目の箱、と指定することで区別します。この「何番目かを表す数字」のことを添字といいます。キャラフレスクリプトの場合、添え字は0から始まります。添え字の最大値は(常識の範囲内なら)制限がないと思って頂いて構いませんが、あまり大きな添え字を使うと実行速度に影響が出る可能性が大きくなりますので、あくまで常識の範囲内でお願いいたします。
添え字は四角かっこで囲んで指定します。例えば ls[0] とか lf[25] のように指定してください。なお、一般的なスクリプトと異なり、キャラフレスクリプトの場合には、数字でしか添え字を指定することができません。ls[lf[2]]、つまり「lsの『lfの2番に入っている値』番目」というように入れ子にする書き方はできないのです。

変数ってどのように使うの?

(例1)ある処理を100回行なうとき

Aという変数を0にしておく
Seg.1
何かの処理をする
Aという変数の中身に1を加える
Aという変数の中身が100未満なら(Seg.1)に戻る

これで、ある処理が100回行なわれることになります。もう一つ例をあげましょうか。

(例2)以前に、ある選択肢を選んだかどうか判断するとき

Bという変数を0にしておく
メニューを表示する
選択された項目に応じて、(Seg.1)、(Seg.2)、(Seg.3)のいずれかに移動する
Seg.1
何かの処理をする
(Seg.4)に移動する
Seg.2
何かの処理をする
Bという変数の中身を2にする
(Seg.4)に移動する
Seg.3
何かの処理をする
(Seg.4)に移動する
Seg.4
何か処理をする
…..(中略)…..
もしBという変数の中身が2ならば、ゲームオーバー
…..(以下略)…..

スクリプトが読めない、書けないという人の大半は、「各行それぞれは判るのだけど、行が集まると何をやっているのかが判らない(当然、一から書けないし、修正できない)」という人なのではないでしょうか?そうなってしまう理由の一つが「ある変数を何に使っているか判らない」ということだと思います。これを避けるために、スクリプトを書くときには変数の使い道もコメントしておくようにしたほうがよろしいかと。

変数に対する代入と演算の方法” に対する意見

  1. ピンバック: スクリプト研究所 記事一覧(目次) | スクリプト研究所

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です