もしも××(ほにゃらら)なら…
5ページの(こた)えを紹介(しょうかい)
A4X = "0123" mes "Xには" + X + "が入っています" stop
Xが数値(すうち)になっていて「Xには123が入っています」となってしまった(ひと)がいたことだろうね。 「もしも武器(ぶき)Aを()()れていたら」 「もしも(てき)Bに(たお)されたら」 「もしも所持金(しょじきん)がC以上(いじょう)あれば」 もし、ある事象(じしょう)()こっていれば、()こっていなかったら という2つ以上(いじょう)選択肢(せんたくし)について説明(せつめい)していきたいと(おも)う。 どんなゲームでもシステム・シナリオ(とう)が1つしかない、というものはない。 完全(かんぜん)にないとは()()られないのだが。 一本道(いっぽんみち)でなくいろいろ(えだ)()かれしているからおもしろい。 ()かなくてもいいと(おも)うがRPGを(れい)にしてみよう。 (てき)遭遇(そうぐう)するのはいつも(おな)じタイミング。 自分(じぶん)(てき)攻撃(こうげき)(じゅん)、ダメージなど(すべ)てにおいて(おな)じ。 (たお)した(とき)入手(にゅうしゅ)する経験値(けいけんち)(とう)がすべて(おな)じで、 (てき)とのエンカウントが一定(いってい)なのでレベルアップのタイミングも(おな)じ…。 (みち)(もど)ることも(はず)れることもできない。 ただひたすらに(まえ)(すす)むのみ…。 こんなのってゲームとは()えないよねぇ? クイズゲームなんて分岐(ぶんき)しているのがゲームのウリなのに 回答(かいとう)(ひと)つしかないなんてゲームでもなんでもない。 小説(しょうせつ)(おな)じで結果(けっか)毎回(まいかい)(おな)じなのだが 一度(いちど)()たいと()うのがあるかもしれないけど。 まぁこの(さき)どうなるか()からないって()う ハラハラドキドキのスリルがあるほうが絶対(ぜったい)いいよね。 (あた)えるダメージが一定(いってい)でないというのだけでも (たお)す・(たお)されるターンが()わる可能性(かのうせい)があるので 十分(じゅうぶん)分岐(ぶんき)ポイントであると()えよう。 …でHSPでどうやって分岐(ぶんき)させるかと()うと 下記(かき)の2つの命令(めいれい)があるのでどちらかを使(つか)ってくれればOKだ。 1つはif命令(めいれい)()ばれるもの。 1つの条件(じょうけん)からYESorNOの2つに分岐(ぶんき)するもので 一度(いちど)多分岐(たぶんき)には()いていない。 もう1つはswitch命令(めいれい)()ばれるもの。 HSP2.6から新出(しんしゅつ)した(内部(ないぶ)if命令(めいれい)実行(じっこう)している)もので 範囲指定(はんいしてい)ができないのだが大量分岐(たいりょうぶんき)()いている。 ただswitch命令(めいれい)以外(いがい)case,default,swbreak,swend命令(めいれい)がセットで 1つの処理(しょり)をする(ため)に5つの命令(めいれい)(おぼ)えなければならない。 とりあえず1つ()if命令(めいれい)から説明(せつめい)する。 他言語(たげんご)()っている(ひと)にはお馴染(なじ)みの命令(めいれい)だね。 使(つか)(かた)構文(こうぶん)()(かた)他言語(たげんご)のものと ほぼ(おな)じなので説明(せつめい)無用(むよう)だろう。 それ以前(いぜん)にそういった(ひと)をターゲットにしてないから()てないか。 英語(えいご)で「もし〜なら」っていう(とき)に 「if〜」(イフ)って使(つか)うよね。そのif(おな)じだ。 if命令(めいれい)書式(しょしき)は「if 条件(じょうけん)」となっていて、 条件(じょうけん)定数(ていすう)(また)変数(へんすう)指定(してい)する。 定数(ていすう)変数(へんすう)については(まえ)のページでやったよね。 定数(ていすう)は「コレが定数(ていすう)」というのがなかったからわかりにくかったかも。 「1+1」を表示(ひょうじ)するといった「1+1」部分(ぶぶん)定数(ていすう)((しき))だ。 この結果(けっか)が3や10に()わることがないよね? ()かなくてもいいだろうけど文字(もじ)文字列(もじれつ)指定(してい)できるよ。 条件(じょうけん)()くことで命令(めいれい)(ぶん)出来(でき)るわけだが、 まだ未完成(みかんせい)なんだ…。 (なに)()らないかと()うと、分岐後(ぶんきご)処理(しょり)がないということ。 分岐(ぶんき)されても結果(けっか)(おな)じだと()ける意味(いみ)がないよね。 分岐後(ぶんきご)()(かた)なんだけど2(とお)りある。 1つは他言語(たげんご)でもある(よう)にココからココまでが分岐(ぶんき)1の処理(しょり)、 コレが分岐(ぶんき)2の処理(しょり)、といったカッコで範囲(はんい)(しめ)すやり(かた)。 カッコと()ってもどんなカッコでも()いというわけではない。 (はじ)まりは(ひだり)ブレイス。…と()ってもピンと()(ひと)(すく)ないよね。 (はじ)(ちゅう)カッコと()えば「あぁアレか」となるかな? それでも()からない(ひと)(ため)実際(じっさい)のカッコを()くと「{」となる。 当然(とうぜん)対応(たいおう)する()わりのカッコも(みぎ)ブレイス「}」となるよ。 実際(じっさい)のサンプルスクリプトを()いてみるとこんな(かん)じだ。
	if 1 = 1 {
		mes "if文のカッコ内に通過しました"
	}
	stop
(なが)れを()てみよう。 1行目(ぎょうめ)if命令(めいれい)()かれているね? その条件式(じょうけんしき)()てみると「1=1」と()かれている。 if命令(めいれい)条件(じょうけん)(ただ)しい場合(ばあい)、 すぐ(あと)のカッコ部分(ぶぶん)通過(つうか)することとなる。 ()てはまらない場合(ばあい)、カッコ(ない)(すべ)ての処理(しょり)無視(むし)される。 定数(ていすう)だと条件(じょうけん)()わることないので結果(けっか)はいつも(おな)じだ。 コレは分岐(ぶんき)とは()えないね。使(つか)うのはほぼ変数(へんすう)(ほう)だろう。
	hensuu = 1
	if hensuu = 1 {
		mes "こんなスクリプトじゃこの部分を一度しか通らないから"
		mes "定数をしているのと何も変わらないんだけど"
		mes "これから先きっと使う時が来るから覚えておこう"
	}
	stop
4ページ演算子(えんざんし)()いてあったのを(おぼ)えているかい? あれらの演算子(えんざんし)利用(りよう)して(しき)(ただ)しいかを判定(はんてい)する。 これからは(しき)(ただ)しいことを「(しん)」の状態(じょうたい)であると()ぶよ。 (しき)(あやま)っている場合(ばあい)は「()」の状態(じょうたい)である、となる。 あ、あそこで1つ()(わす)れていたものがあったのを(おも)()したよ。 ()(わす)れていたものとは「!」(NOT)演算子(えんざんし)だ。 左辺(さへん)右辺(うへん)(しき)結果(けっか)一致(いっち)しないかを()るもの。 一致(いっち)しない場合(ばあい)(しん)一致(いっち)する場合(ばあい)()(かえ)す。 (しん)は0以外(いがい)数値(すうち)()は0と()うことを()っているかな? (しん)場合(ばあい)は0以外(いがい)代表(だいひょう)としては1となる。 条件部(じょうけんぶ)演算子(えんざんし)として「=」「>=」「<=」「!=」というのもあるね。
	hensuu = 2
	if hensuu != 1 {
		mes "上にも書いてた様に「!」だけでもいけるよ"
		mes "実際に結果が見たい場合は下記のようにしよう"
		mes hensuu ! 1
		mes "↑\n1と出ていたら「真」だ"
	}
	stop
4ページ演算子(えんざんし)最後(さいご)(ほう)にビット演算子(えんざんし)がある。 「(ひだり)ビットシフト」以下(いか)のものだね。 普通(ふつう)使(つか)うには2進数(しんすう)やらビット演算(えんざん)やらを(おぼ)えなきゃ 使(つか)えないから(すこ)(むずか)しいかな。 ただAND,OR演算子(えんざんし)複数(ふくすう)条件(じょうけん)(あつか)うのに 必要(ひつよう)なものなので重要(じゅうよう)なんだよ。 「変数(へんすう)Aと1が(おな)じか」という条件(じょうけん)と 「変数(へんすう)Bと2が(おな)じか」という2つの条件(じょうけん)両方(りょうほう)とも(しん)だと実行(じっこう)したい場合(ばあい)下記(かき)のようにする。
	A = 1
	B = 2
	if A = 1 & (B = 2) {
		mes "2つの条件が両方とも「真」のようだ"
	}
	if A = 1 & (B = 1) {
		mes "変数Bの方が「真」ではないのでココは実行されない"
	}
	stop
1つ()以降(いこう)条件式(じょうけんしき)(かなら)ずカッコ(「(しょう)カッコ」「パーレン」)で(くく)らなければいけないよ。 理由(りゆう)はまたこの(あと)()くから(いま)(おぼ)えておくだけでOK。 演算子(えんざんし)に「&」が使(つか)われてるけど「&&」「AND」「and」でもいいんだ。 どれか1つでも(しん)場合(ばあい)実行(じっこう)するというのも()いてみよう。
	A = 1
	B = 2
	C = 3
	if A = 2 | (B = 1) |  (C = 3) {
		mes "3つの条件のうちココでは変数Cが「真」なので実行される"
	}
	stop
さて、なぜカッコで(くく)らなければならないか(はな)そう。 また(はな)4ページ(もど)っちゃうんだけど、 HSPは基本的(きほんてき)計算手順(けいさんてじゅん)(まえ)からとなるんだったよね? if命令(めいれい)条件部(じょうけんぶ)もそうなっている。 Aが1かつBが2の場合(ばあい)にどうなるか(かんが)えてみよう。
	A = 1
	B = 2
	if A = 1 & B = 2 {
	stop
		mes "2つの条件が両方とも「真」のようだ"
	}
とりあえず実行(じっこう)してみると(なに)表示(ひょうじ)されないね。 つまり条件(じょうけん)が「()」の状態(じょうたい)であるというのがわかる。 なぜこうなったか条件部分(じょうけんぶぶん)(くわ)しく()てみる。 とりあえず(ひだり)から判定(はんてい)されるのだから「A = 1」を判定(はんてい)。 コレの結果(けっか)(しん)なので(れい)によってココに1が(はい)るんだね。 (つぎ)(さき)ほどの結果(けっか)1と変数(へんすう)Bを判定(はんてい)する。 「1 = B」の結果(けっか)()なので0が(はい)る。 最後(さいご)(さき)ほどの結果(けっか)0と2を判定(はんてい)するわけだ。 「0 = 2」の結果(けっか)()、つまり最終的(さいしゅうてき)()となる。 言葉(ことば)説明(せつめい)だと「?」ってなる(ひと)(ため)展開(てんかい)すると、
(1)「A = 1」か?
(2)「A」は1により「1 = 1」は「真(=1)」
(3)「真(=1) = B」か?
(4)「B」は2により「1 = 2」は「偽(=0)」
(5)「偽(=0) = 2」か?
(6)「0」と「2」は同じではないので,最終結果として「偽(=0)」となる
(むずか)しいんだけど()かってもらえたかな? 条件(じょうけん)(しん)場合(ばあい)実行(じっこう)されるのはわかったのだが、 ()場合(ばあい)実行(じっこう)させるにはどうすればよいだろう。 ()場合(ばあい)だけ実行(じっこう)させるにはNOT演算子(えんざんし)でいけるのだけど、 (しん)場合(ばあい)にある処理(しょり)実行(じっこう)し、 同時(どうじ)()場合(ばあい)(べつ)のものを実行(じっこう) そういうのを実現(じつげん)するにはelse()れるんだ。 ()位置(いち)(しん)場合(ばあい)()わりカッコの(あと)()くんだよ。 つまり下記(かき)(かん)じだぞ。
	if 条件 {
		真の時に実行するもの
	}
	else {
		偽の時に実行するもの
	}
if命令(めいれい)実行部分(じっこうぶぶん)のカッコ(ない)(べつ)if命令(めいれい)()()に(ネスト)することができる。 パッと想像(そうぞう)しにくいだろうからサンプル()いてみるよ。
	A = 1
	B = 2
	C = 3
	if A = 1 {
		mes "とりあえず変数Aは真"
		if B > 1 {
			mes "変数Bも真のようだ"
			if C <= 3 {
				mes "変数Cも真のようだ(結果として全てが真だった)"
			}
			else {
				mes "変数Cだけ真でない"
			}
		}
		else {
			mes "変数Bは真でない(Cの判定はしていない)"
		}
	}
	else {
		mes "変数Aは真でない(B,Cの判定はしていない)"
	}
	stop
このネストは10(じゅう)までしか使(つか)えない。 11(じゅう)以上(いじょう)使(つか)おうとしてもhsed.exeのエラーとなる。 (べつ)エディターでもダメな(ところ)()るとhspcmp.dllのエラーなのかな? また、条件部(じょうけんぶ)のネストも可能(かのう)だ。
	A = 1
	B = 3
	C = 3
	if A = 1 & (B = 2 | (C = 3)) {
		mes "変数Aが1で、なおかつ変数Bが2または変数Cが3の時に実行"
	}
	stop
こうすることで複雑(ふくざつ)条件(じょうけん)(もう)けられる。 このネストは8(じゅう)までしか利用(りよう)できないぞ。 9(じゅう)以上(いじょう)だと「カッコの記述(きじゅつ)(ちが)う」というエラーになる。 ブレイスを使(つか)った1つ()()(かた)はコレくらいでいいかな? もう1つの()(かた)if命令(めいれい)以外(いがい)でも利用(りよう)できるので (いま)のうちに絶対(ぜったい)(おぼ)えておいてね。 さて、カッコを使(つか)わないもう1つの()(かた)とは…? それは「:(コロン)」を利用(りよう)するといったやり(かた)。 どう(ちが)うのかと()うと1(ぎょう)複数(ふくすう)処理(しょり)()けるマルチステートメント()ばれているよ。
	variable = 5
	if variable >= 3 : mes "1行で書くとスッキリするね"
	stop
1(ぎょう)にたくさん()けるしelse当然(とうぜん)()けるよ。
	var = "あ"
	if var = "い" : mes "変数varには「い」が入っています" : else : mes "「い」以外の文字です"
	stop
たくさん()くと()にくいだけだからほどほどにね。 一応(いちおう)if命令(めいれい)以外(いがい)のものも()いておく。
	mes "こんな風に書けるけど" : mes "みにくいだけだよね" : mes "2つの意味で" : stop
複数(ふくすう)if命令(めいれい)を1(ぎょう)使(つか)(とき)はカッコを使(つか)おう。
	var = 10
	if var > 5 { if var < 50 { mes "OK" } else { mes "OUT"} } else { mes "OUT" }
	stop
当然(とうぜん)だけどプレイスもコロンも半角(はんかく)()くんだよ? 何度(なんど)()くようだけど全角(ぜんかく)ではないので間違(まちが)えないでね。 if命令(めいれい)はどんなに複雑(ふくざつ)条件(じょうけん)であっても 結果(けっか)がどちらであるかだけを判断(はんだん)している。 つまり、if命令(めいれい)条件(じょうけん)に数値・変数だけで 条件式(じょうけんしき)になっていなくてもいいわけだ。 たまに「if variable」と()かれたif文を()る。 コレは変数(へんすう)(あたい)が0かそれ以外(いがい)かだけを判断(はんだん)している。
	a = 2
	if a : mes "変数aは真(0以外)です" : else : mes "変数aは偽(0)です"
	stop
(はじ)めに()っていたswitch命令(めいれい)(はい)ろうか。 ()ってた(よう)付随(ふずい)命令(めいれい)(おお)いけど頑張(がんば)ってくれ。 switch()いて「スイッチ」と()むんだよ。 「そのスイッチ()して」って()(とき)のスイッチと(おな)じだ。 ホントはちょっと(ちが)うんだけどね…。 書式(しょしき)()いてみると「switch 比較対象(ひかくたいしょう)」となり、 バラメーター()には変数(へんすう)(しき)()くことができる。 ああいうときに()うスイッチっていうのはON・OFFの2パターンしかない。 ココでは1つの比較対象(ひかくたいしょう)条件(じょうけん)多分岐(たぶんき)させる。 case命令(めいれい)使(つか)ってね。どうでもいいけどケースと()む。 「〜のケースは」って()うよね?「〜パターンは」って(かん)じかな。 書式(しょしき)は「case 比較値(ひかくち)」だ。 これでswitch比較対象(ひかくたいしょう)一致(いっち)する(ところ)通過(つうか)するよ。 switch(ところ)(しき)指定(してい)できるのだが、(はじ)めに()ったように 実際(じっさい)case(ところ)範囲指定(はんいしてい)出来(でき)ないぞ。 switch命令(めいれい)は5つで1セットと()きましたが、 最低限(さいていげん)のものはswitch,case,swendの3つだけです。 …ってことで3つ()swend命令(めいれい)説明(せつめい)しサンプルを()いてみましょ。 switch(あたま)2文字(もじ)end()()わせたもので「スイッチの()わり」だ。 swend命令(めいれい)簡単(かんたん)。 「swend」とパラメーターがなくswitch(ぶん)最後(さいご)()くだけ。 if命令(めいれい)でカッコを最初(さいしょ)最後(さいご)につけたよね? あれと(おな)(かん)じでココからココまでがswitch(ぶん)というのを(しめ)す。
	hensuu = "B"
	switch hensuu
		case "A" : mes "A"
		case "B" : mes "B"
		case "C" : mes "C"
	swend
	stop
一応(いちおう)()いとくけど「文法(ぶんぽう)間違(まちが)っている」となってないよね? 半角(はんかく)()いてるのにエラーというパターンね。 2ページ()いたんだけど「HSP拡張(かくちょう)マクロを使用(しよう)する」って(やつ)に チェックが(はい)っていないと使(つか)えないぞ。 (うえ)のサンプルを(ため)せばcaseのBを通過(つうか)しているのが()かると(おも)う。 しかしcaseのCも通過(つうか)しているようだ。 そう、(じつ)比較値(ひかくち)(しん)のところからswendまでが実行(じっこう)されるのだ。 これで使(つか)える(とき)があるが使(つか)えない場合(ばあい)(おお)いだろう。 比較値(ひかくち)(しん)のところだけ(とお)るようにはできないだろうか? それをするのが5つある命令(めいれい)(なか)swbreakだ。 これもswitchbreak()ぜたもので「スイッチを()ける」といった(かん)じかな? swbreak命令(めいれい)書式(しょしき)も「swbreak」だけである。
	hensuu = "う"
	switch hensuu
		case "あ"
			mes "「あ」だけ通過"
			swbreak
		case "い"
			mes "「い」だけ通過"
			swbreak
		case "う"
			mes "「う」だけ通過"
			swbreak
		case "え"
			mes "「え」だけ通過"
			swbreak
		case "お"
			mes "「お」だけ通過"
			swbreak
	swend
	stop
これで(しん)のところだけ通過(つうか)できたね。 (しん)場合(ばあい)はコレでいけたんだけど()場合(ばあい)、 つまりif命令(めいれい)()(ところ)else()たるのはどうすれば…? それをしてくれるのが最後(さいご)のセット命令(めいれい)defaultだ。 デフォルト・初期(しょき)といった意味(いみ)()られた命令(めいれい)だね。 default命令(めいれい)も「default」だけで(ほか)には()かない。
	hensuu = 8
	switch hensuu
		case 0
			mes "値は0でした"
			swbreak
		case 1
			mes "値は0でした"
			swbreak
		case 2
			mes "値は1でした"
			swbreak
		case 3
			mes "値は2でした"
			swbreak
		default
			mes "値は0〜3以外でした"
			swbreak
	swend
	stop
e> この(よう)default最後(さいご)()くのが普通(ふつう)である。 形的(かたちてき)にはcase()てはまらなければ通過(つうか)となっているが、 実際(じっさい)比較対象(ひかくたいしょう)(なに)であれ(かなら)通過(つうか)する。 なのでcaseよりも(さき)にあるとおかしい。 (さき)caseを通してswbreakswitch(ぶん)()けよう。 ()っておくがcase,default,swbreak,swend命令(めいれい)単体(たんたい)使用(しよう)することは出来(でき)ないぞ。セットで使(つか)(よう)にしよう。 このページの問題(もんだい)(つぎ)(とお)り。
Q5if使(つか)変数(へんすう)「X」が「3以下」の(とき)だけ終了(しゅうりょう)するプログラムを()け。
Q6下記(かき)if構文(こうぶん)をswith命令(めいれい)()(なお)
	if X = 1 {
		mes "1"
	} else {
		if X = 2 {
			mes "2"
		} else {
			mes "1、2以外"
		}
	}
7ページへ進む 5ページへ戻る