複数の条件分岐の簡略化について(解決済)

アバター
ram04
記事: 37
登録日時: 2018年10月14日(日) 21:50

複数の条件分岐の簡略化について(解決済)

投稿記事by ram04 » 2018年10月24日(水) 11:40

現在育成風のシミュレーションゲームを作っております。

ゲーム内で行動を選択可能なPCが4名おり、週の始めにそれぞれ行う行動を決めるシステムです。
誰がどんな行動をするかは、専用の変数[行動選択@キャラ名]で4名分決定し、
例えば「勉強」なら[1]を、「運動」なら[2]を、「外出」なら[3]を…と、決められた値を代入していきます。
(ここまでは問題なく作れました)

今回お尋ねしたいのは、
「同じ行動を選択したPCが2人だけいる場合」に特定のイベントを起こしたいのですが、
(PC1とPC3が「運動」という行動を選んだ場合に親密度が上がる/会話が発生する…みたいに)
その場合条件分岐を総当たり的に作らないといけないのか、何か別の方法はないものなのか、ということです。

「PCが2人だけ」という条件は、[人数用]の変数を別に用意したのでクリアできました。
しかし、「PC4人のうち、2人が同じ行動を選んだかどうか」を判定するには、


例)4人のうち「運動」[2]を選んだPCが2人いるかを判定する場合、

  「PC1」の行動が[2]か、そうでないか。
  YES(PC1の行動=[2])の場合は、[同じ行動かをチェックする変数]に定数を代入
   「PC2」の行動が[2]か、そうでないか。
   YES(PC2の行動=[2])の場合は、[同じ行動かをチェックする変数]に定数を代入
    ・・・
  NOの場合は「PC2」の行動が[2]か、そうでないか…。

このように、4人分なら6回判定を行う必要があると思います。
PC1+PC2=[1]、PC1+PC3=[2]、PC1+PC4=[3]、PC2+PC3=[4]、PC2+PC4=[5]、PC3+PC4=[6]


このやり方でもできるのはできるのですが、複雑化すると単純なミスが発生しやすかったり、後の管理が煩雑になるのかなと思います。
一応web上や過去の質問にも目を通しましたが、私の知識量では良い方法が思いつきませんでした。
java scriptによる適切な条件分岐や、過去に公開されているプラグイン、同じようなトピックがある場合、教えて頂けると助かります。
拙い説明で大変申し訳ありませんが、どなたかお力添え願います。
最後に編集したユーザー ram04 on 2018年11月13日(火) 20:10 [ 編集 1 回目 ]

----------------------------------------------------------------
ツクールMV一年生です。
現在自身の創作をモチーフにしたゲームを製作中です。
家庭用はSFCの2とPSの3が大好きです。
アリクイマン
記事: 44
登録日時: 2018年5月06日(日) 12:30

Re: 複数の条件分岐の簡略化について

投稿記事by アリクイマン » 2018年10月25日(木) 21:10

java scriptによる適切な条件分岐や、過去に公開されているプラグイン、同じようなトピックがある場合、教えて頂けると助かります。


とのことですので、javascriptにて回答させていただきます。
当方はツクールのイベントを作成するのが苦手でして、
基本的にイベントをスクリプトで作成している為、
ツクールの仕様上、簡易化できる箇所は簡易化していただいて問題ないです。

また、javascriptの基礎的な知識がある前提での回答になる為、
不明点などがあれば追加でご質問ください。

解決策として2種類、
「論理演算子」を使用するものと「二進法」を使用するものをご紹介します。

■論理演算子を使用する場合

ツクールのイベント上では条件分岐の内容をスクリプトで設定できます。
以下、このスクリプト部分のことを「条件式」と呼びます。

javascriptでは、論理演算子と呼ばれるものがあり
「AND(且つ)」「OR(若しくは)」「NOT(〜でない時)」を判定することができます。
例:

コード: 全て選択

A == 1 // Aが1の時
A == 1 && B == 1 // AとBが両方とも1の時
A == 1 || B == 1 // AとB最低でもどちらかが1の時
A != 1 // Aが1ではない時

PC1とPC2が同時に2である時は

コード: 全て選択

PC1 == 2 && PC2 == 2

と記述することでできるのではないでしょうか。
※PC1、PC2部分は該当する変数を取得する記述をしてください。
変数を取得するコードは

コード: 全て選択

$gameVariables.value(変数のID)

になります。

人数の課題も、人数用の変数でクリアされているようですが、

コード: 全て選択

PC1 == 2 && PC2 == 2 && PC3 != 2 && PC4 != 2

とすることで、
PC1,PC2が2を選び、PC3,PC4が2以外を選んでいる時、
という記述も可能です。
同様の方法で全員が同じ行動を選んだ時、
3人が同じ行動を選んだ時、
PC1が勉強をしている間にPC2とPC3が運動をしている時、
のような指定方法も可能です。

ram04さんの現状の記述方法で問題とされている、
入れ子状ではなくなる為、可読性は上がりますが、
パターンが増えれば増えるほど、条件も増えていくことには変わりありません。

■二進法を使用する場合

現在のram04さんの記述方法を根本的に変えてしまうので、
既にイベント作成が進んでいる場合は無視してください。

「誰が何を選んだのか」ではなく「何が誰に選ばれているのか」で判断をします。
おそらく現在はPC1~4が行動を選んだ際に、
行動の内容を、定数で代入し、定数の値によって行動を判断しているのだと思います。
そこを逆にし、行動の内容に対し、PC1~4に対応する定数を代入し、
PCから行動を判定するのではなく、行動からPCを判定してしまおう、という算段になります。

コード: 全て選択

1,行動内容に対応する変数を用意
例:
「行動内容@勉強」「行動内容@運動」「行動内容@外出」
2,PC毎に定数を設定。
PC1…1
PC2…2
PC3…4
PC4…8
3,行動を選んだ時に、行動内容にPCの定数を「加算」
例:
PC1が運動
行動内容@運動に1を加算
PC2が運動
行動内容@運動に2を加算
PC3が勉強
行動内容@勉強に4を加算
PC4が外出
行動内容@外出に8を加算
4,行動内容の値から「何が誰に選ばれたか」がわかります。
例:
行動内容@運動が3なので、
3になる組み合わせはPC1+PC2だけなので、
PC1とPC2が運動を選んている。
行動内容@勉強は4なので、
PC3が勉強を選んでいる。
行動内容@外出は8なので、
PC4が外出を選んでいる。


この方法の注意すべき点としては、
3の処理を行う前に、一度行動内容の変数を0にリセットする必要がある
という点です。
細かい説明は省略しますが、プラグイン等の形で関数を外のファイルにしてもよいのであえば、
switch文等と組み合わせ、こちらの記述方法の方が、スッキリとしたコードになるかもしれません。

プラグインのような外部ファイルを作成せず、
ツクール上のみで完結させるのであれば「論理演算子」を使用した方法をお勧めします。


選んだ内容に合わせてサブイベントが発生する育成ゲーム、
個人的にはサブイベントが多ければ多いほどついつい全パターン探して遊び尽くすぞ!という気持ちになる為、
この回答がイベントの数を増やす事をお助けすることができていれば幸いです。

以上、長文失礼いたしました。
アバター
ram04
記事: 37
登録日時: 2018年10月14日(日) 21:50

Re: 複数の条件分岐の簡略化について

投稿記事by ram04 » 2018年11月12日(月) 20:49

アリクイマン様こんにちは、初めまして。
まず最初に、通知が機能しなかったため回答者がいないと思い込み、お礼とお返事が遅れて大変申し訳ありませんでした。
本日何気なくトピックを見に行ったら返信がついていて驚きました。

そして、大変分かりやすい説明を丁寧に教えて頂きどうもありがとうございます!
喉から手が出るレベルで知りたかった分岐方法です。
例まで記載して頂き、非常にわかりやすかったです。本当に頭が上がりません。

先ほど実際に試してみたら、きちんと機能し、更に感動いたしました。
もっと早く気づいたら良かったです、時間を消費し、ひたすら入れ子で分岐を組んでました(笑)

そして、二進法での分岐は目からウロコです。
発想が天才染みてて凄いです、こんな方法もあるんですね!
今後の作成の参考にさせて頂きますね。

当方、javascriptはなんとな~く分かるレベルだったので、「おそらくjavascriptで何かすればできるのだろう」と目星は着けておりました。
が、調べてもよく分からないことばかりで、実際に試してもエラーしか表示されず(多分何か間違えていたのだろうとは思います)、ひたすら時間を消費しながらコツコツ作っておりました。
今回のアリクイマン様の素晴らしいアドバイスのお蔭で、これからのツクールライフが、より快適になりそうです。

この度は、本当にどうもありがとうございました!
----------------------------------------------------------------
ツクールMV一年生です。
現在自身の創作をモチーフにしたゲームを製作中です。
家庭用はSFCの2とPSの3が大好きです。

“MV:質問” へ戻る