変数が関わる作業の簡略化についての質問

りぃく
記事: 27
登録日時: 2016年3月27日(日) 23:12

変数が関わる作業の簡略化についての質問

投稿記事by りぃく » 2017年3月24日(金) 00:28

こんばんわ。また質問させてください。先日からの質問はすべて今作っている経済システム構築の為のものです。
現在、初期の在庫をランダムにし、その値を参照し需要と供給にそれぞれ変数で値を与えています。コモンイベントで作ってます。

需要値が50の場合は在庫や価格に何も変化がなく、60になると在庫が1.2倍減り、(実装済み)値段も1.2倍高く変動します(未実装)。逆に供給値が60になると在庫は1.2倍増え、値段は1.2倍安くなります(未実装)それら需要値と供給値は時間で変動し、そこにそれぞれに乱数で倍率に変化を加えることで経済をよりリアルなものに変化させる(未実装)

というのをやりたいのですがここで問題が発生しました。機能に問題はなく正常に動作しましたが問題はこのままだと1アイテムに付き、1経済システムが必要になるという問題です。

例のコードだと”星ブドウ”に対する需要値は設定できています。しかし星ブドウの他に別のアイテム例えば”伝説の剣”があったとして、そのまま需要値60のところに配置すると星ブドウも伝説の剣も常に同じ需要値になっていまいます。

それを回避するためには別に伝説の剣専用の需要値を作って管理する必要があります。そうなればアイテムが100個あった場合100通りの需要値、供給値を作らなければならないということになると思います。在庫値もアイテムの数だけ作らないといけないので、かなりの手間が予想されます。

さらにそこに時間での変化も加わるので作業量は膨大です。

これらを簡略化する手立てはなにかないものでしょうか?自分はプログラム等があまり出来ないので、現在はひたすら同じ作業を繰り返すという手法以外に思い付きません(それでも時間は掛かるが実装は出来る)

なにか方法がありましたらご教授頂きたいです。よろしくお願いします。

コード: 全て選択

◆ラベル:需要値50
◆ウェイト:1フレーム
◆条件分岐:需要値 = 50
  ◆変数の操作:#0008 需要値実数 = 1
  ◆変数の操作:#0502 星ブドウ在庫値 *= 1
  ◆
:分岐終了
◆ラベル:需要値60
◆ウェイト:1フレーム
◆条件分岐:需要値 = 60
  ◆変数の操作:#0008 需要値実数 = 2
  ◆変数の操作:#0502 星ブドウ在庫値 *= 10/12
  ◆ループ
    ◆ウェイト:1フレーム
    ◆条件分岐:需要値 = 50
      ◆ラベルジャンプ:需要値50
      ◆
    :分岐終了
    ◆条件分岐:需要値 = 70
      ◆ラベルジャンプ:需要値70
      ◆
    :分岐終了
    ◆
  :以上繰り返し
  ◆
:分岐終了

アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: 変数が関わる作業の簡略化についての質問

投稿記事by まっつUP » 2017年3月24日(金) 19:03

りぃく様
お世話になります。

アイテムの需要値はどのように設定しているのでしょうか。
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: 変数が関わる作業の簡略化についての質問

投稿記事by WTR » 2017年3月24日(金) 19:51

質問の答えを考える前に、前提条件について疑問点というか、大丈夫かな?というのが

1.2倍減る、1.2倍安く、っていうのがよくわからなかったのですが
星ブドウ在庫値 *= 10/12
って意図通りでしょうか?
20%減にはなりませんが、意図通りならすみません。

在庫の初期値はランダムになるそうですが
初期値が0になった場合、掛け算で (*= で) 考えている限り初期値から増やせないのでは?

需要値と供給値は独立の変数?
需要値 = 100 - 供給値
とか、一方から一意に決まる定義になっていれば扱う変数を1つ減らせそう。

需要値は10刻みでしか変化しない?
需要値のレンジ(最小値~最大値)は?
価格と在庫の倍率レンジは?

とかいうあたりが気になりました。
質問の答えについては、最終的には力技しかないんじゃないかという気がしなくもないですが。。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
りぃく
記事: 27
登録日時: 2016年3月27日(日) 23:12

Re: 変数が関わる作業の簡略化についての質問

投稿記事by りぃく » 2017年3月25日(土) 00:14

まっつUPさん、WTRさん返信ありがとうございます。こんな意味不明な質問ですいません。

もう少し詳しく現在の状況を書きます。

アイテムの需要値等について
まず需要値と供給値はそれぞれ独立の変数として扱っています。需要値、供給値は1~100の値を持っていて(下限と上限の設定の仕方は分かりません)それぞれゲーム開始時の初期値は50からスタートします。需要値だけをとりあえず例に出し説明しますが、需要値はゲーム内の時間と連動していて、まず初期に増えるか減るかの判定をしています。増えるが選択された場合、需要値は時間と共に1ずつ上がって行きます。50~59の値の場合、変化はありませんが60になった瞬間、価格や在庫に変化が現れます。その段階で再び増えるか減るかの判定を行い、増えるが選択された場合、70に向かって同じく1ずつ上がっていきます。それを上限の100まで繰り返します。100になれば減るか、維持かの判定を行うという形です。供給値も同じ仕組みです。(まだ、作り始めたばかりなので完成までは出来ていませんが)実際にはそこに乱数の倍率を掛ける予定ですので、一気に需要値が15上がったりすると思います。

需要値は在庫にも連動していて、独立で変数を与えているので需要値が10増えるごとに在庫は1.2倍減ります。開始時に在庫をランダム(1以上)で設定していて、その在庫数を参照して在庫数/1.2となります。この計算は変数で小数点を扱えるようになるというプラグインを使用して確認しました。在庫が5の場合、通常であれば5/1.2=4.166666...です。しかしこのままでは在庫が整数でなくなり、ツクールMVの仕様上5つ買えてしまうのです。そこで在庫を必ず整数にする為に、最初に10倍してから1.2倍の場合は12で割るようにしました。結果は5×10/12=4.16666...となり、小数点のプラグインを使用しなければ4個の在庫に変化し、4個しか買うことができません。

在庫の初期値が1の場合1×10/12=0.8333...の為在庫は0(売り切れ)で表示されます。
また需要値が70に上がれば在庫は1.4倍減るので、5×10/14=3.571で在庫は3になります。(5/1.4=3.571)
この辺りは検証して意図通りに動いています。

在庫のレンジについては最大で2.0倍もしくは0.5倍です。つまり在庫に関しては最大でゲーム内時間に対して(在庫が10の場合)2倍の速度で減る(10×10/20=5)もしくは2倍の速度で増えます(10×10/5=20)。←間違ってるかも。

価格は時間とは連動しておらずあくまで在庫値を参照します。在庫が多ければ価格が安くなり、在庫が少なければ価格は高くなります。価格もレンジは同じく2.0倍~0.5倍の予定です。

実際にはさらに複雑となり需要値と供給値、在庫値を参照し計算をした上で乱数で倍率を設定する予定です。

需要値70(在庫は1.4倍減る)、供給値40の場合(在庫は1.2倍減る)=1.68倍減る。在庫が10の場合10×10/16=6なので在庫は6になるが乱数で2倍となった場合在庫が3になる場合もある。
需要値70(在庫は1.4倍減る)、供給地80の場合(在庫は1.6倍増える)=0.8倍増える。在庫が10の場合10×10/8=12なので在庫は12だが乱数で3倍となった場合在庫が36となる場合もある。

とまぁなんとか文章に起こすことが出来ましたがかなり複雑なんですよね。しかもこれだけの計算をしていろいろ設定してもこれでアイテム1つ分です。需要値を1つだけで管理してしまうと全部のアイテムが同じ需要値となってしまって、アイテムによって需要と供給が違うという形にはならないんです。となるとひとつひとつ設定をする必要があります。アイテムの数が100個だとひとつひとつ100個分設定する必要があるんですよね。

どうにも簡略化が出来ないならその形でやるしかありませんが、実はこんな方法があったんだと後から知って後悔するのは嫌なので、もし方法があれば是非ご教授いただきたいということです。

とはいえ実際、複雑なので簡略化は難しいのかも知れません。その場合は気合で設定していきます。でも全部とはいかなくてもほんの少しでも簡略化出来るならとても有り難いので質問させてもらいました。長文になってしまって余計に分かりにくくなっていたらすいません。
アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: 変数が関わる作業の簡略化についての質問

投稿記事by まっつUP » 2017年3月25日(土) 00:48

非常に複雑な仕様のようなので
まず気になった点をあげておきます。

・需要値、供給値は1~100の値をもっていて~の下り
説明を見る限り1~10で問題ないように見えますが。変動しない値の域は必要でしょうか。
あと、時間に連動するとありますが常時並列処理するのでしょうか。
ショップ等プレイヤーの目に触れる直前に在庫変動の処理を行った方がいいと思います。
ちなみに値を最小値~最大値に収めるだけならそんなに難しくはないです。

・在庫は無尽蔵に増えるのではないか。

・アイテムの数が100個だとひとつひとつ100個分設定する必要が~
要素数がアイテムの種類数以上の配列を使えばごり押しできると思います。
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
りぃく
記事: 27
登録日時: 2016年3月27日(日) 23:12

Re: 変数が関わる作業の簡略化についての質問

投稿記事by りぃく » 2017年3月25日(土) 01:53

こんばんわ。

需要値が1~100の理由ですがこれは実は実際に1~10の場合と比較したわけではないので、あくまで予想なのですが、例えば需要値が1の場合、2に変化した瞬間在庫の変動が起きると考えたからです。実際にお店で買物をする際に、目の前にある商品がいきなり消えることはないので、1~9の間は変化なしとした方が余裕もあっていいと思いました。

需要値5で商品を売る。→在庫が増えるので需要値が4に減る。売った直後に売った分以外に在庫がまたすぐに増えるとするか
需要値50で商品を売る。→在庫が増えるので需要値が49に減る。売った直後は売った分だけしか増えない。時間が経って40になるとようやく増える。という風にするかという考えです。(実際は時間や供給値も関係してくるのでこれほど単純ではありませんが)

時間は並列処理を行い、リアルタイムで需要値、供給値、在庫が変化するようにする予定です。ショップを開く直前に処理をするというのも確かにありかなとは思うのですが、どちらの方がいいんでしょうかね。

在庫に関しては今のところ未定ですが、

コード: 全て選択

◆条件分岐:星ブドウ在庫値 ≥ 1000
  ◆変数の操作:#0502 星ブドウ在庫値 = 1000
  ◆
:分岐終了

こんな感じのやり方でMAXやMINを管理出来るのではないかと思っています。(大なり小なりが逆かも知れません)

要素数や配列とは一体どういうものなのでしょうか?ググって見ましたがよく分かりませんでした。
アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: 変数が関わる作業の簡略化についての質問

投稿記事by まっつUP » 2017年3月25日(土) 11:51

アイテムのプロパティに新しい変数を作ってもよいと思いますが

以下のようを評価するとコンソールにアイテムの種類数と同じ
要素数を持ったarrayが表示されますのでご確認ください。
(スクリプトコマンド)
var array = [];
for(var i = 1; i < $dataItems.length; i++){
array[i] = Math.floor(Math.random() * 20) - 10;
}
console.log(array);
最後に編集したユーザー まっつUP on 2017年3月25日(土) 16:25 [ 編集 1 回目 ]
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
アバター
ビービー
記事: 308
登録日時: 2016年1月12日(火) 18:40

Re: 変数が関わる作業の簡略化についての質問

投稿記事by ビービー » 2017年3月25日(土) 16:19

こんにちは。

拝見したところ、気になった点が2点ほどありましたので書き込ませていただきます。

一つ目は、需要値と供給値が0~100ではなく、0~200で計算すべきかなと。
最初の値を50ではなく100にすることで%と同じ感覚で扱えます。
こうすることで計算が楽になると思います。
ツクールでは変数と変数の計算ができるからです。
在庫が10で需要値が120の場合
在庫変数(10)x需要値変数(120)/100という感じになります。
在庫の変数に現在の需要の変数をかけて100で割るだけなので簡単です。

二つ目は、在庫値に直接数値をかけたりされているようですが、それだと一度0になった商品は以後増えないような気がします。
まず商品ごとに入荷数と消費数を変数で作成するのが容易なのではないかと思います。
入荷数、消費数はともに元の数値をアイテムごとに決めておきます。
例えば10とします。
まず入荷数に供給値をかけて100で割ります。
供給値が80の場合8です。
これを在庫数にプラスします。
在庫数が6の場合6+8で14です。
次に消費数に需要値をかけて100で割ります。
需要値が140の場合14です。
在庫が14なので消費数が14だと、在庫から消費数をひくので0になります。
次にアイテムの在庫が変動するタイミングで
入荷、消費数ともに、もともとの数値を代入するのを忘れないようにしてください。

変数が一つのアイテムごとに在庫、需要、供給、入荷、消費と5つ必要になり、
作業量は増しますが、管理やバランス調整が簡単になるかと思います。

ここから表題の件の簡略化について一案。
アイテムをカテゴリ分けするといいかもしれません。
食料品の需要が上がった!というときは食料品全体の需要が上がるようにあらかじめ計算しておけば楽です。
前項で消費数に需要値をかけて100で割りましたが、ここに新たにカテゴリ需要値をかけて100で割る感じです。
例えば
変数星ブドウ消費数(10)x変数星ブドウ需要値(100)/100x食料品需要値(120)/100
という感じです。
この場合星ブドウの需要値は100なので元の消費数は変動しませんが、
カテゴリの需要値が120なので12となります。
カテゴリ需要値はゲーム開始時に100に設定しておかないといけませんが、
複数のアイテムの在庫を一気に変動させることができるようになります。

以上、何かしら参考になれば幸いです。
------------------------------------------------------
Twitterやってます。
https://twitter.com/BB_ENTER
ブログもやってます。
http://bb-entertainment-blog.blogspot.jp/

“MV:質問” へ戻る