【解決済み】イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

aiueo
記事: 35
登録日時: 2016年5月09日(月) 23:33

【解決済み】イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by aiueo » 2017年7月04日(火) 21:36

イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

RPGツクールVXAceのマップイベントのイベントコマンド「スクリプト」で

◆スクリプト:$game_variables[1]=["AAAAA",15]
:     :$game_variables[2]=["BBBBB",6]
:     :$game_variables[3]=["CCCCC",23]
:     :$game_variables[4]=["DDDDD",59]

上記の様にゲーム変数に配列を設定するとします。
配列要素の0番目に文字列、1番目に数値を代入します。

これはゲーム中のキャラクターやモンスターなどを表し、
実際は4種より多く設定され、
利用する際はパーティーや遭遇戦闘への参加不参加により、
扱う配列の種類・数はその時々で変わるとします。

この1番目の数値を比較して大きい順から、例えば
「DDDDはどうする?」
という処理をやりたいのです。例の場合はこの後、
「CCCCはどうする?」
「AAAAはどうする?」
「BBBBはどうする?」という表示がされます。

◆文字:-、-、通常、下
:  :¥V[10]はどうする?

のように文章中に変数を設定し
大きい順に$game_variables[?][0]を代入すればいいと思うのですが
複数の配列内の特定の配列要素を比較し、
条件を満たす配列の、その配列要素、を取得するにはどうすればいいでしょうか。

以上よろしくお願いいたします。
最後に編集したユーザー aiueo on 2017年7月27日(木) 20:20 [ 編集 1 回目 ]

faida
記事: 120
登録日時: 2015年12月17日(木) 16:44

Re: イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by faida » 2017年7月04日(火) 22:14

手っ取り早い方法は

コード: 全て選択

$val = $members.sort_by{|i|-$game_variables[i][1]}
などで一回配列を作って数値順にソートして、そこから

コード: 全て選択

$game_variables[10] = $game_variables[$val.shift][0]
みたいに「shift」とか「pop」とかを使って順番に処理していく、

またはソートしなくても

コード: 全て選択

$val = $members.clone
してから

コード: 全て選択

id = $val.max_by{|i|$game_variables[i][1]}
$game_variables[10] = $game_variables[id][0]
$val.delete(id)
のように「max_by」「min_by」などで最大・最小を出して処理する、ですかね。
前提として、「$members」等で参加メンバーを取得できる必要がありますが。

ポイントはループ前に一回コピーを作っておくことです。
今回は「$members」という参加メンバー(中身は使う変数のID)の配列を一旦「$val」という仮変数にコピーしています。
このように「いじってはいけない変数(またはいじれない何か)」がある場合、一旦「いじってもよい変数」に
コピーすることで、順番の自由な変更や二重処理の防止ができます。

ちなみに、戦闘時の処理は「BattleManager」の346行目~の「行動順序の作成」、
384行目~の「次の行動主体の取得」にあります。
大体一番目の方法と同じ感じです。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
奏ねこま
記事: 368
登録日時: 2016年1月20日(水) 20:04

Re: イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by 奏ねこま » 2017年7月04日(火) 22:19

イマイチすっきりしませんでしたが、一応考えて見ました。
もっと良い方法がある気がします。

軽く説明すると、まず変数#0001~#0004を数値が大きい順に並べ替えて、変数#0009に配列として入れています。(スクリプトの部分)
それを1つずつ取り出して、文字列の部分を変数#0010に入れています。(変数の操作の部分)
取り出すたびに変数#0009の中身が減っていくので、変数#0009の中身がなくなったらループを抜けます(条件分岐の部分)
添付ファイル
9.png
aiueo
記事: 35
登録日時: 2016年5月09日(月) 23:33

Re: イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by aiueo » 2017年7月06日(木) 00:33

faida様ありがとうございます。
自分は全く勉強不足でして、少しずつ読み進めて行こうと思います。ところで

●『「$members」という参加メンバー(中身は使う変数のID)の配列』というのはどういうものでしょうか。

●試せる範囲内で試そう、とりあえずソートの部分だけでも・・・と

イベントコマンド「スクリプト」
$game_variables[1]=["AAAAA",15]
$game_variables[2]=["BBBBB",6]
$game_variables[3]=["CCCCC",23]
$game_variables[4]=["DDDDD",59]
$val =
$members.sort_by{|i|-$game_variables[i][1]}
イベントコマンド「文章の表示」
¥>¥V[20]

と試しにやってみるとsort_byでエラーが出ます。
(別の例ではcloneでエラーになります)
$membersを通常のゲーム変数にするとか色々しましたが駄目でした。
書いて頂いたコードをイベントコマンド「スクリプト」の範囲内で試すにはどうすればよいでしょうか。

以上よろしくお願いいたします。
aiueo
記事: 35
登録日時: 2016年5月09日(月) 23:33

Re: イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by aiueo » 2017年7月06日(木) 00:35

奏ねこま様ありがとうございます。
同じ内容をツクールに入力し動作を確認し、
Rubyリファレンスなどでスクリプトの記述を照合しました。

繰り返し処理難しいです。

今回自分はズバリ配列名を求める方法を探していましたが
別のアプローチを取るべきだと思いました。

ありがとうございました。
faida
記事: 120
登録日時: 2015年12月17日(木) 16:44

Re: イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by faida » 2017年7月06日(木) 20:51

今見返したらすごく抽象的な説明になっていましたね。申し訳ありません。
まず、ソート機能を使う前に、予め「$members = [1,2,3,4]」など、$membersに使用する変数のIDを入れておく
ということです。
なんだったら$membersは「[1,2,3,4]」のように配列で書き換えてもいいわけです。
(配列じゃないとpopとかshiftとかが使えないので(1..4)は使えません。(1..4).to_aなら使えます)

「扱う変数の数が、メンバー参加などその時々の条件で変わる」とのことだったので、
$membersという変数(ないしゲーム変数に代入してもいいんですが)を用意しておくことによって、
全て共通処理で扱うことが可能になったほうがいいかなぁと思いこのような説明になってしまいました。
戦闘のように同じメンバーで何度も行動を選択するのならなおさら、と思って戦闘時の処理も例に挙げてます。

※つまりイベントコマンドでやるなら
イベントコマンド「スクリプト」
$members = [1,2,3,4]
$game_variables[1]=["AAAAA",15]
$game_variables[2]=["BBBBB",6]
$game_variables[3]=["CCCCC",23]
$game_variables[4]=["DDDDD",59]
$val =
$members.sort_by{|i|-$game_variables[i][1]}
イベントコマンド「文章の表示」
¥>¥V[20]
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
aiueo
記事: 35
登録日時: 2016年5月09日(月) 23:33

Re: イベントコマンド「スクリプト」で条件を満たす要素を持つ配列を取得したい

投稿記事by aiueo » 2017年7月08日(土) 21:14

faida様ありがとうございます。
遅くなりすみません。
以下の様に行いました。
■例1■
◆スクリプト:$members = [1,2,3,4]
:     :$game_variables[1]=["AAAAA",15]
:     :$game_variables[2]=["BBBBB",6]
:     :$game_variables[3]=["CCCCC",23]
:     :$game_variables[4]=["DDDDD",59]
:     :$val =
:     :$members.sort_by{|i|-$game_variables[i][1]}
:     :$gv[9]=$val
◆ループ
 ◆スクリプト:$game_variables[10] =
 :     : $game_variables[$val.shift][0]
 ◆文章:-, -, 通常, 下
 :  :¥>¥V[10]
 ◆条件分岐:スクリプト:$val.size==0
  ◆ループの中断
  ◆
 :分岐終了
 ◆
:以上繰り返し


■例2■
◆スクリプト:$members = [1,2,3,4]
:     :$game_variables[1]=["AAAAA",15]
:     :$game_variables[2]=["BBBBB",6]
:     :$game_variables[3]=["CCCCC",23]
:     :$game_variables[4]=["DDDDD",59]
:     :$val = $members.clone
◆ループ
 ◆スクリプト:id = $val.max_by{|i|$game_variables[i][1]}
 :     :$game_variables[10] = $game_variables[id][0]
 :     :$val.delete(id)
 ◆文章:-, -, 通常, 下
 :  :¥>¥V[10]
 ◆条件分岐:スクリプト:$val.size==0
  ◆ループの中断
  ◆
 :分岐終了
 ◆
:以上繰り返し


上記のふたつの例、共にひとつの文章表示イベントで
ウィンドウが開き
DDDDD表示、決定ボタン、
CCCCC表示、決定ボタン、
AAAAA表示、決定ボタン、
BBBBB表示、決定ボタン、
ウィンドウ消去
となるのを確認しました。

IDの件やっとわかりました。
今回配列関係や様々な具体例を目に出来大変勉強になりました。
ありがとうございました。

“VX / Ace:質問” へ戻る