【解決】複数の変数の値を比較・順位を算出するのを配列でやりたい

返信する
nemuimon
記事: 10
登録日時: 2022年6月02日(木) 11:49

【解決】複数の変数の値を比較・順位を算出するのを配列でやりたい

投稿記事 by nemuimon »

はじめまして
少し前の記事で「複数の変数の値を比較・順位を算出するプラグイン」というのがありまして、その動作はできたんですが、これを配列でやりたい。けど私の能力的には無理。なのでもし、わかる方がいれば教えていただければ幸いです。

実現したいことは、各アクター中でもっとも攻撃力が高い人だけにメッセージ出したりイベントが発動できるようにしたいのですが、、、

▼参照した記事
viewtopic.php?t=1737


試したこと、、、というか試せてもいませんが、やったこととしては下記となります。

■アクターの能力値攻撃力以下6項目を配列として入れる。アクター4人分を変数21~24に入れる。

▼変数21
[$gameActors.actor(1).atk,$gameActors.actor(1).def,$gameActors.actor(1).mat,$gameActors.actor(1).mdf,$gameActors.actor(1).agi,$gameActors.actor(1).luk]
▼変数22
[$gameActors.actor(2).atk,$gameActors.actor(2).def,$gameActors.actor(2).mat,$gameActors.actor(2).mdf,$gameActors.actor(2).agi,$gameActors.actor(2).luk]
▼変数23
[$gameActors.actor(3).atk,$gameActors.actor(3).def,$gameActors.actor(3).mat,$gameActors.actor(3).mdf,$gameActors.actor(3).agi,$gameActors.actor(3).luk]
▼変数24
[$gameActors.actor(4).atk,$gameActors.actor(4).def,$gameActors.actor(4).mat,$gameActors.actor(4).mdf,$gameActors.actor(4).agi,$gameActors.actor(4).luk]

■これを前述のyamachanさんのソートスクリプトに入れて、例えば攻撃力が高いのはアクター2の人だ!とかしたいんですが、、、やり方がさっぱりわかりません。

▼何も考えずにそのまま記述すると
$gameVariables._data.map(function(v,i){return [v,i]}).slice(21,24).filter(function(v){return v[0]!==undefined}).sort(function(a,b){return b[0]==a[0] ? a[1]-b[1] : b[0]-a[0]})

当然、21~24に入れたアクターのすべての能力値が入ってしまいます(4人分×6能力値=24の数値)
これをたとえば、攻撃の能力値の順位だけをだしたり、魔法力の順位だけをだしたりしたいのです。
まあ、配列を使わずに全数値24個分変数を設定すればできるんですが、、、スマートじゃないなあ~と、、、
最後に編集したユーザー nemuimon [ 2022年6月15日(水) 14:34 ], 累計 1 回
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 複数の変数の値を比較・順位を算出するのを配列でやりたい

投稿記事 by 名無し蛙 »

アクター4人というのが引っ掛かるんですけどもしかして任意抽出のアクターではなくパーティメンバーの事ですか?
それなら$gameParty.members()でパーティメンバー配列を取得出来ます
パーティの中で一番攻撃力が高いアクターのIDを取得する場合は

コード: 全て選択

const actorId = $gameParty.members().sort((a, b) => b.atk - a.atk)[0].actorId();
$gameVariables.setValue(21, actorId); // 変数21にアクターID代入
とかですか
nemuimon さんが書きました:これをたとえば、攻撃の能力値の順位だけをだしたり、魔法力の順位だけをだしたりしたいのです。
「順位だけを出す」というのはどういう結果を出したいのかよく分からないです。
変数21-24に魔法力順位に沿ったアクターIDを代入する、なら

コード: 全て選択

$gameParty.members().sort((a, b) => b.mat - a.mat)
    .forEach((member, i) => $gameVariables.setValue(21+i, member.actorId()));
ですかね。
nemuimon
記事: 10
登録日時: 2022年6月02日(木) 11:49

Re: 複数の変数の値を比較・順位を算出するのを配列でやりたい

投稿記事 by nemuimon »

早々のご返信ありがとうございます。
確認しましたが、パーティーメンバーでの動作は完璧です!

ただ、やりたいこととしてはパーティー未加入のアクターを含めた全アクターの中から、「最強の攻撃力の者」または「最強の魔法力の者」を選ぶ、というような使い方をしたいのです。

例えば、メンバーを一人だけ加えられるようなイベントで、「攻撃力が1番の者」か、「魔法力が1番の者」のどちらかしか選べない、、、というような感じでしょうか。

前提としてパーティー未加入のアクターのパラメータは、ゲーム経過やイベントで随時変動するものとします。
また、プレイヤーにはパラメータ数値を見えないようにします。

そして、預言者みたいなキャラ(ときどき嘘をつく)に、「ハロルドが武力では最強じゃ」とか言わせて、それを参考にプレイヤーがメンバーを選びます。
選んだメンバーによってストーリーなり難易度なりイベントが変わる、、、、

みたいな感じなのですが、説明が悪くてすみません。
ゲーム作りも、ツクールも始めたばかりで、何が、どこまでできるか、まったくわかっていませんので、、、

とりあえず

const actorId = $gameActors.actor().sort((a, b) => b.atk - a.atk)[0].actorId();

みたいなのでいけるのかな?と思いましたが、やはり無理でした。sortのところでエラーがでますが、理由はまったく分かってません。

良いやり方があればご教授ください。
なければ、、、、ちまちま一個一個変数に入れる感じでひとまずやってみようとは思っています。
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 複数の変数の値を比較・順位を算出するのを配列でやりたい

投稿記事 by 名無し蛙 »

nemuimon さんが書きました:ただ、やりたいこととしてはパーティー未加入のアクターを含めた全アクターの中から、「最強の攻撃力の者」または「最強の魔法力の者」を選ぶ、というような使い方をしたいのです。
早とちりでしたか
それなら$gameParty.members()の部分を
[id1, id2, id3...].map(actorId => $gameActors.actor(actorId))に置き換えてください

コード: 全て選択

// アクターID[1,2,4,8]の中から一番攻撃力が高いアクターIDの取得
const actorId = [1, 2, 4, 8].map(actorId => $gameActors.actor(actorId))
    .sort((a, b) => b.atk - a.atk)[0].actorId();
一つ一つ簡単に説明すると
[1, 2, 4, 8].map(actorId => $gameActors.actor(actorId))...mapは配列を基に新しい配列を作ります。つまり
[$gameActors.actor(1), $gameActors.actor(2), $gameActors.actor(4), $gameActors.actor(8)]
と同じ意味を持ちます。

.sort((a, b) => b.atk - a.atk)...sortは評価関数に則って配列をソートして新しい配列を作ります。
a - bで昇順、 b - aで降順です。
アクターの.atkを取得して降順(高い数値順)にソートする、と指定しています。

[0]...配列の先頭の要素を取得します。つまりもっとも高い.atkを持つアクターです。

.actorId()...アクターからアクターIDを取得します。これが最終結果です。
nemuimon
記事: 10
登録日時: 2022年6月02日(木) 11:49

Re: 複数の変数の値を比較・順位を算出するのを配列でやりたい

投稿記事 by nemuimon »

名無し蛙さま

ありがとうございます!
完璧です!

解説も分かりやすく、私にも(多少)理解できたような気がします。
私なら、何十行もスクリプトを書く所でした!

なんとか、いつの日にか一つだけでもゲームを完成できるよう頑張りたいと思います。
返信する

“MV:質問”に戻る