「決まった数の複数の変数のうち、1以上になっているものは何個あるかを別の変数一つに返す」という処理を、なるべく軽いものにしたいと思っています。
条件分岐で1以上を見るべきか、同じ変数で割ってまとめるのがいいのか(添付画像)、他にもっと良い方法があるのか。これが数百数千の変数まで増えるとかなり違ってきてしまうのではないかと思います。
良い方法をご存知であればお教え下さい。
【解決】複数の変数が何個1以上なのか、という処理について
Re: 複数の変数が何個1以上なのか、という処理について
スクリプトを使った方法ですが。
◆変数#0002~#0010までの中で、1以上になっている変数の個数を変数#0001に代入する。
最初の「$game_variables[1]」が個数を代入する変数
「2..10」となっているのが、変数#0002~#0010という範囲を作っているところ
「$game_variables >= 1」が「1以上だったら」という条件
こんな感じで。
◆変数#0002~#0010までの中で、1以上になっている変数の個数を変数#0001に代入する。
コード: 全て選択
$game_variables[1] = Array(2..10).inject(0){|r,i|
r + ($game_variables[i] >= 1 ? 1 : 0)
}
「2..10」となっているのが、変数#0002~#0010という範囲を作っているところ
「$game_variables >= 1」が「1以上だったら」という条件
こんな感じで。
Re: 複数の変数が何個1以上なのか、という処理について
ありがとうございます。動作が軽いのはもちろん、記述も劇的に短く管理しやすくなって、大助かりです。奏ねこま さんが書きました:コード: 全て選択
$game_variables[1] = Array(2..10).inject(0){|r,i| r + ($game_variables[i] >= 1 ? 1 : 0) }
重ねてお願いするのは不躾ですが、あと一つだけ、教えていただいてもよろしいでしょうか。
「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。
14個の変数にこれを行うと0.2秒だけかかるのですが、ループの中でははっきりと遅延を感じてしまいます。
本当は200個以上の変数を対象にしてループしたいので、重さをどうしても解消したいのです。
利用規約を教えてください。
Re: 複数の変数が何個1以上なのか、という処理について
別解ですがこんなのはどうでしょう?
コード: 全て選択
$game_variables[1] = (1..200).count do |i|
$game_variables[i] >= 1
end
Re: 複数の変数が何個1以上なのか、という処理について
ありがとうございます。使い方は添付画像の通りでいいのでしょうか?SBR さんが書きました:別解ですがこんなのはどうでしょう?
コード: 全て選択
$game_variables[1] = (1..200).count do |i| $game_variables[i] >= 1 end
- 添付ファイル
-
- クリップボード.png (7.1 KiB) 閲覧された回数 5762 回
Re: 複数の変数が何個1以上なのか、という処理について
それでいいと思います。
1つにまとめたいのであればこの様な方法もあります。
1つにまとめたいのであればこの様な方法もあります。
Re: 複数の変数が何個1以上なのか、という処理について
比較的わかりやすいやつ。kix さんが書きました:「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。
14個の変数にこれを行うと0.2秒だけかかるのですが、ループの中でははっきりと遅延を感じてしまいます。
本当は200個以上の変数を対象にしてループしたいので、重さをどうしても解消したいのです。
コード: 全て選択
(2..10).each{|i|
if $game_variables[i] >= 1
$game_variables[i] += 1
end
if $game_variables[i] == 14
$game_variables[i] = 0
end
}
コード: 全て選択
(2..10).each{|i|
v = $game_variables[i] + 1
$game_variables[i] = v.between?(2, 13) ? v : 0
}
>SBRさん
・count使ったやりかた
・Rangeから配列を作るやり方
そんなやり方もあるのですね…勉強になります。
Re: 複数の変数が何個1以上なのか、という処理について
正解が出てるのでおまけ。kix さんが書きました:「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。
コード: 全て選択
(2..10).each{|i|
next if $game_variables[i] < 1
$game_variables[i] = ($game_variables[i] + 1) % 14
}
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
Re: 複数の変数が何個1以上なのか、という処理について
皆様に感謝します。
動作確認できました。再び助けていただき、ありがとうございました。奏ねこま さんが書きました: わかりづらいけどコンパクトにまとめたやつ。コード: 全て選択
(2..10).each{|i| v = $game_variables[i] + 1 $game_variables[i] = v.between?(2, 13) ? v : 0 }