*効率の良いサブルーチン [#l9ff6729]
-ページ: [[罪罰改造板2]]
-投稿者: [[清秋]]
-優先順位: 低
-状態: 完了
-カテゴリー: 罪罰管理者の雑談
-投稿日: 2005-01-19 (水) 20:36:53
-バージョン:
**内容 [#fdf94075]
はじめて書き込みをさせて頂きます。
清秋という者です。
迷宮やオークション等の素晴らしいスクリプトを配布している
あくあ様に助言を頂きたいのです。
本題ですが鍛冶屋を作ってみてとりあえず動く程度にまでは完成
したのですがどうもスクリプトの所持アイテム判定部分に無駄が
ある気がしてしょうがないのです。
#判定サブルーチン
sub item_han{
@han=@_;
$i=$item_pos;
$log .= "所持アイテム @di_a<br>\n";
foreach $temp_di_a(@di_a){
# $log .= "デバグ 必要アイテム [$di_data[$han[0]][1]][$di_data[$han[1]][1]][$di_data[$han[2]][1]]<br>\n";
if($temp_di_a==$han[0]){
if($item_no_flag[0]==0){
$item_no_flag[0]=$i;
$log .= "$di_data[$temp_di_a][1]・・・確かに持ってるな。<br>\n";
$flag++;
}
}elsif($temp_di_a==$han[1]){
if($item_no_flag[1]==0){
$item_no_flag[1]=$i;
$log .= "$di_data[$temp_di_a][1]・・・確かに持ってるな。<br>\n";
$flag++;
}
}elsif($temp_di_a==$han[2]){
if($item_no_flag[2]==0){
$item_no_flag[2]=$i;
$log .= "$di_data[$temp_di_a][1]・・・確かに持ってるな。<br>\n";
$flag++;
}
}
$i--;
# $log .= "デバグ 所持アイテムフラグ [$item_no_flag[0]][$item_no_flag[1]][$item_no_flag[2]]<br>\n";
}
}
無駄な処理やもっと効率の良い処理をご教授していただけると
幸いです。
引数には&item_han(必要アイテムその1,必要アイテムその2,必要アイテムその3)
という感じでやっています。
また、あくあ様の複数道具所持も参考にさせていただいています。
----
-これでも十分な気がしますが・・・^^;一応別な方法ということで、参考程度に。(すみません、動作の確認はしてません) -- [[あくあ]] &new{2005-01-19 (水) 21:32:02};
@han=@_;
@item_no_flag = ();
$log .= "所持アイテム @di_a<br>\n";
for $hidx (0..$#han) {
for $didx (0..$#di_a) {
if($han[$hidx]==$di_a[$didx]){
$log .= qq|$di_data[$didx][1]・・・確かに持っているな。<br>\n|;
$item_no_flag[$hidx]=$didx;
$flag++;
last;
}
}
}
-まず、パフォーマンスに関係ないことですが、@item_no_flgをクリアが必要かなと。もし、別でクリアしてるなら必要ないですが。 -- [[あくあ]] &new{2005-01-19 (水) 21:37:43};
-あと所持アイテムと必要アイテムの数が問題ですが、必要アイテムの方が少ないのかなとループを外に回しました -- [[あくあ]] &new{2005-01-19 (水) 21:38:57};
-そして、必要アイテムはすべてのアイテムについてチェックが必要ですが、所持アイテムのループは見つかった時点で抜けます。これは仕様によってはまずいかもしれません -- [[あくあ]] &new{2005-01-19 (水) 21:40:18};
-一応感想、配列化してるとこの辺楽ですね〜 -- [[あくあ]] &new{2005-01-19 (水) 21:42:33};
-ありがとうございます。少し弄ってちゃんと動きました。範囲演算子の使い方が解っていないのと最初forで書いたときに暴走させてしまったので回りくどい処理にしてしまったのです。 -- [[清秋]] &new{2005-01-19 (水) 21:45:44};
#comment