答えは1つじゃないから面白い
皆さんは常日頃、一定の生活を繰り返していることと思います。
「朝●時に起きて、●時に学校・仕事に出かけ、●時に帰宅し、●時には消灯する。」
毎日が同じ処理の繰り返しでツマラナイと思う人もいらっしゃることでしょう。
ツマラナイと思う一番の要因は新しい発見が少ないからではないでしょうか?
自分にとって好きなことを毎日やっていてもマンネリズムに陥る(マンネリ化する)と一気に熱が冷めます。
人は一定の処理の中に今までと異なる何かを発見すると、それが自分にとってプラス的要素であればあるほど
嬉しい・楽しい・面白いと思えるのだと思います。
プログラムも複数の処理分岐をさせたほうが「この後どうなるかな?」とワクワク期待させてくれるはずです。
| if 条件 |
| | | |
| 条件 | 条件に合致しているなら直後のブロックを実行する |
一番ポピュラーで他言語でもほぼ存在する条件分岐命令で、直後に書いたブロックを実行するとありますが、
ブロックとは幾つかの命令等の処理をくくりまとめたもののことを指し、
「{」と「}」がブロックの開始と終了の合図になっており、
if命令の条件に合致するときだけこのブロック内が実行されるようになっています。
プログラムでは条件に合致することを「真」と呼び、異なることを「偽」と呼んでいます。
通常は「if A == B」や「if A + B >= C + D」という式の形を指定しますが、
「==」とは一般に等価の意味を表します。HSPでは「=」でも条件時には等価を意味するようになっています。
// 1が100よりも小さいときにだけブロック内が処理され、メッセージを表示する
if 1 < 100 {
mes "1は100よりも小さい。"
mes "ココは条件に一致しているときにしか処理されないエリアです。"
}
|
上記のような定数同士の条件は常に一定の結果である為に通常は組み込みまず、変数を条件に使用します。
現在のプログラムの流れは常に上から下への一方通行だけである為、
変数を条件に使用したところでその変数に入っている値は、その条件指定で常に一定(定数と同じ)ですが、
それについては触れないでおきます。次章からは変数を使う意味が感じられることでしょう。
value = 5
if value != 3 {
mes "変数valueは3ではなく" + value + "です。"
}
|
if命令のパラメータ結果が合致しているのかいないのかで処理を分岐しているわけですが、
他の言語では、数値型や文字列型以外にブール型と呼ばれる「True(真)」「False(偽)」のどちらかだけを
入れられる型を持つものが存在します。
そのような言語では、条件が正しいか否かを表示させた場合に「True」「False」が表示されるわけですが、
HSPでは、「True」や「False」と言った表現を実現させることができません。
そこで、数値を利用して、0以外の数値なら「True」と同義、0なら「False」と同義としています。
0以外なら真と言うことは、「A=B」の形となっていなくても真偽と見立てることができるわけです。
つまり、用途はフラグ(ON or OFF)系に、限られてくると思いますが下記のようにもできるわけです。
a = -1
if a {
mes "どうやらaは0になっていないようです。"
}
mes 2 = 2 /* 2は2である */
mes 3 != 3 /* 3は3ではない */
|
フラグ系は主にビット演算・論理演算で使用されることでしょう。
ビット演算とは何か、その説明についてはコチラに書いておりますのでご参照ください。
論理演算を使用することで、1つのif命令で複数の条件を指定することも可能です。
A = 1
B = 0
C = 1
if A = 1 & B = 1 {
mes "AとBは両方とも1です。"
}
if B = 1 or C = 1 {
mes "BとCのいずれか1つは1です。"
}
|
if命令は「真」の状態のみ処理されると書きましたが、真ではないときに実行させるものがあります。
| else |
| | | |
| [パラメータなし] | 真以外の全ての場合に処理する為、パラメータを必要としない。 |
「それ以外」を意味するelse命令が偽となる時に実行されるもので、
else命令は必ずifブロックに続けて記述するようにしなければなりません。
ifブロックとの間に改行入れることでも正常にいかないことがあるようなので、
書く場合は直下に書くと覚えておきましょう。
variable = 123
if variable = 123 {
mes "変数variableには123が入っています。"
}
else {
mes "変数variableには123以外が入っています。"
}
|
ブロックとは幾つかの処理をまとめた一塊のくくりであると書きました。
「{」から「}」までが1ブロックと書きましたが、1行限りだけのブロックも存在します。
「:」を区切りに使用するもので、1行に複数の処理が書けるようになるのですが、
1行に複数の処理・命令を書くことをマルチステートメントと読んでいます、覚えておきましょう。
hspbc_manager = "アルティメット"
if hspbc_manager = "アルティメット" : mes "確かに" + hspbc_manager + "です。"
|
「{」と「}」を使用したブロックは使えるところが非常に限られています。
珍しいところでは下記のような書き方もあるわけですが…。
mes {"
これで複数行書けますよ。
個人的にはあまり使わない書き方だけど。
使わない方も書き方としてあることだけは覚えておこう。
"}
|
一方、マルチステートメントは改行する代わりに横に並べるだけですから、様々な場所で使用できます。
1行に何でもかんでも詰め込んでしまうのは見にくいですけど、
各命令は次の命令の為に書いているんだよということを暗示する為に使用すると良いでしょう。
pos 100, 200 : mes "先程のpos命令は,このメッセージ表示位置の為に使用。"
pos 50, 320 : mes "このように書くと少し見やすくなりませんか?"
|
ifブロックをマルチステートメントで書くと、次のようにすることができます。
if命令は2分岐(通過するかしないか)ですが、多分岐にすることのできる命令も用意されています。
次の記述する命令がそうなのですが、最低3個の命令で1セットとなりますので一気に解説します。
| switch 比較元の値 |
| | | |
| 比較元の値 | 比較の対象にする値を指定する。 |
| case 比較先の値 |
| | | |
| 比較先の値 | 比較元と一致する場合に直後のブロックを処理する。 |
| swend |
| | | |
| [パラメータなし] | ブロック末端を示す為に存在するので、パラメータ及び処理はない。 |
switch命令のブロックはswend命令までが1つのブロックとなっており、
そのブロック内に1つ以上のcaseブロックを配置し、比較元と一致するcaseブロック内を実行します。
厳密には少々異なりますが、イメージとしては下記のような構造となっています。
switch 比較元
case 比較先1 比較元と比較先1が一致する場合に処理する内容 |
case 比較先2 比較元と比較先2が一致する場合に処理する内容 |
:
case 比較先N 比較元と比較先Nが一致する場合に処理する内容 |
swend
|
イメージを掴んで頂いた所で実際に使用してみましょう。
コレを実行してみると「文法が間違っている」とエラーになった方がいらっしゃるかもしれません。
貼り付けただけで他に何も変えてないのに出た方は拡張マクロの使用をOFFにしていると思います。
2章で少し説明した拡張マクロですが、上記の3命令全てが拡張命令です。
チェックが外れている場合はONにしなければ処理できません。
…で、実行すると確かに比較元と比較先が一致している処理が実行されました。
比較先に存在しない値を比較元の値設定するとswitchブロック内は全て無視されます。
ココまでは問題ありませんでしたが、0もしくは1を指定してみると問題が出てしまいます。
「Value = 1」の場合、「1でした」と表示されますが、同時に「2でした」とも表示されます。
「Value = 0」にすると0〜2まですべてのメッセージを表示してしまいます。
実は一度case命令に入ると、このままでは以降のcaseブロックも実行してしまうのです。
その方がいい場合もありますが、大半は1つのcaseブロックだけを実行したいと思います。
その場合、下記命令を使用することで他のcaseブロックに流れるのを防ぐことができます。
| swbreak |
| | | |
| [パラメータなし] | 処理をswendまで進めるだけの為、パラメータは必要ない。 |
1
2
3
4
5
6
7
8
9
10
11
12
|
コレで他のcaseブロックは実行されなくなりましたので、
最後にswitch命令版のelse(全てに一致しない場合)命令を紹介します。
| default |
| | | |
| [パラメータなし] | else命令同様に全ての場合で実行する為、パラメータは必要ない。 |
このdefault命令は全てのcaseブロックに当てはまらない場合に通過するというより、
どのような値が設定されていても通過するようになっています。
上から順に処理される為、defaultブロックよりも下にcaseブロックを用意していても、
そのcaseブロックから実行されるようにはなってない為、全てに当てはまらない時だけ通過させたいなら、
下記スクリプトの12行目の様にdefaultブロックは最下部に書くとうまくいくでしょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
コレでクイズ等の判定の基礎部分を作られるようになりましたね。
まだ、ユーザーに選択や入力をさせることやランダム的な要素は扱ってませんが、
これからどんどんと講座に命令を増やしていく予定です。
お楽しみに。