(0006)RPGツクールで数学を活用してみる
概要
高校数学(今は違うかも)で学ぶド・モルガンの法則がRPGツクールやプログラミングで役に立つ(かもしれない)というお話です。
前置き
最近プラグイン作ってないのでちょっと数学ネタを。
さて皆さん、数学してますか?日常生活でも大活躍ですよね!あ、でも数学嫌いな方もいらっしゃるかな?もし要点だけ知りたいという方がいらっしゃったら適宜読み飛ばしてください。
ド・モルガンの法則
ご存じない、またはもう忘れたよ!という方のために、ざっくりド・モルガンの法則を説明しておくと、ある集合Aとある集合Bがあるとして、AとBの共通部分の補集合はAの補集合とBの補集合の和集合と同じだよ~っていう法則です。
あ、今回は凄くざっくり説明してるので、数学的に突き詰めると「そこ違うんじゃない?」や「正確性に欠ける表現だ」みたいになるかもしれませんがお目こぼしを…。
文字で書くと解りにくいですよね。申し訳ないんですが、ググっていただければ解りやすい図がたくさん出てくると思うので、そちらを適宜参照してください。
で、これがですね、条件分岐にも使えるんですよ。共通部分はand(且つ)、和集合はor(または)に置き換えられるので、例えば「A且つBのとき」と「AじゃないまたはBじゃないとき」は同じで、「AまたはBのとき」と「Aじゃない且つBじゃない」も同じになるんです。
「ふ~ん、で?」という方もいらっしゃれば「あ~、ね」という方もいらっしゃるかと思いますので、ちょっと実例を見ていきましょう。
活用例
例えば、関所のイベントで、通行証を持っているか、王様がパーティーにいれば門番の前を素通りできるようなシチュエーションを考えてみましょう。
RPGツクールのイベントコマンドでそのまま書くとこんな感じですよね。
◆条件分岐:パーティーが通行証を持っている
◆注釈:何もしない
◆ラベルジャンプ:処理終了
◆
:それ以外のとき
◆文章:門番
:待て!ここは関係者以外通行禁止だ!
◆移動ルートの設定:プレイヤー
:◇一歩後退
◆ラベルジャンプ:処理終了
◆
:分岐終了
◆条件分岐:王様がパーティにいる
◆注釈:何もしない
◆
:それ以外のとき
◆文章:門番
:待て!ここは関係者以外通行禁止だ!
◆移動ルートの設定:プレイヤー
:◇一歩後退
◆ラベルジャンプ:処理終了
◆
:分岐終了
◆ラベル:処理終了
◆
……、え~っと、私は結構ラベルジャンプ好きで活用してるんですけど、皆さんどうです?勝手なイメージなんですけど、ラベルジャンプって使ってる方は少数派なんじゃないかなと…。勿論スイッチを使う等でラベルジャンプを使わなくても実現できますのでご安心を。
それはともかく、ちょっとややこしいですよね。条件がまたは(or)なので、条件分岐を2つに分けないといけない上、ラベルジャンプを使う等の工夫をしないと、通行証を持っていても王様がいなかったら結局止められてしまったり、どちらも満たしていない場合は2回も怒られてしまったりという残念なバグに…。
加えて、条件を満たす場合(上記でいう注釈の部分)に何も処理をしないという、若干無駄なことをしているような書き方になっています。
ド・モルガンの法則を使ってみよう
では、ド・モルガンの法則を活用してみましょう。「AまたはBのとき」と「Aじゃない且つBじゃない」が同じ意味になるんでしたね。今回の例に当てはめると、【「通行証を持っている」または「王様がパーティーにいる」】なので、【「通行証を持っていない」且つ「王様がパーティーにいない」】ですね。
これを書いてみると…
◆条件分岐:パーティーが通行証を持っている
◆注釈:何もしない
◆
:それ以外のとき
◆条件分岐:王様がパーティにいる
◆注釈:何もしない
◆
:それ以外のとき
◆文章:門番
: :待て!ここは関係者以外通行禁止だ!
◆移動ルートの設定:プレイヤー
: :◇一歩後退
◆
:分岐終了
◆
:分岐終了
◆
通行証を持っていなくて且つ王様もパーティーにいない場合にのみ門番に絡まれればOKになったので、ちょっと処理が簡単になりました。ラベルジャンプも不要になりましたね。
でも、「何も処理をしないという、若干無駄なことをしている」っていう部分が解決してなくね?とお思いのあなた!その通りです。
JavaScript等であれば、変数の前に「!」をつけたり、「!==」で比較することで、ここでいう「持っていない」や「いない」を簡単に表せるので、
◆条件分岐:パーティーが通行証を持っていない
◆条件分岐:王様がパーティにいない
◆文章:門番
: :待て!ここは関係者以外通行禁止だ!
◆移動ルートの設定:プレイヤー
: :◇一歩後退
◆
:分岐終了
◆
:分岐終了
◆
みたいな書き方ができるんですが、ツクールの仕様上、そういった機能が備わっていないので、
・通行証を入手した時点でスイッチをONにするようにして、スイッチがOFFの場合で条件分岐する
・スクリプトを使う
等をしないとここまでの簡略化ができないのが残念です。
ド・モルガンの法則の使いどころ
恐らくですが、and(且つ)よりもor(または)の方が条件分岐を書くときに難易度が高いんですよね。それもそのはずで、例えば条件Aを満たす場合は十の位が1、満たさない場合は0、条件Bを満たす場合は一の位が1、満たさない場合は0とした場合、and(且つ)の場合は11の場合のみ見ればいいわけですが、or(または)の場合は11の他に10、01の場合もケアしなければならないので、確認内容が膨れ上がるのは当然です。
「じゃあ00の時だけ除外すればいいんじゃね?」と思った方は正しくド・モルガンの法則を活用できてます!その調子で行きましょう!
というわけで、条件分岐の条件が複数ある場合は、上手くやればor(または)とand(且つ)は相互に変換できるよ。ということと、「~じゃない」という条件も上手くやれば「~である」に変換できるよ。というお話でした。皆さんの制作の一助になれば幸いです。
今回はこの辺で。ではでは。