• ベストアンサー

ランダムに表示

while(my($key,$val) = each %PL){ @VS_VALUES = split(/\s/,$val); print $VS_VALUES[5]; } あるPerlゲームの改造を行っています。 $VS_VALUES[5]の表示順をランダムにしたいと考えていますが、自力では難しそうです。よくわからないのですが、%PLの配列をランダムにするのでしょうか?書き方をお教えいただければ大変助かります。お手数ですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.3

↓このようにすると配列の中身がランダムな順番になります。 @VS_VALUES = shuffle(@VS_VALUES); # 配列内をシャッフルする関数 sub shuffle { my @list = @_; for my $i ( 0 .. $#list ) { my $rand = int( rand(@list) ); @list[ $i, $rand ] = @list[ $rand, $i ]; } @list; }

MASTER-PPC
質問者

お礼

有難うございます。そして申し訳ございません。 ソースが長くなると思い、短縮して書いたのがいけないようで、 どの部分にどのように@VS_VALUES = shuffle(@VS_VALUES);を記入していいかわからず、うまくいきませんでした。 @VS_VALUES = shuffle(@VS_VALUES); → %PL = shuffle(%PL); このように置き換えてもみましたが、ランダムに表示されるにはされるのですが、必要でないデーターも呼び出されてしまい、動作がおかしくなってしまいました。せっかくお教えいただいたにもかかわらず、Perl知識がほとんどないため、適用できずに申し訳ございません。 詳細はNo.1の方に記入させていただきました。よろしければお手数をおかけし恐縮でございますが、よろしくお願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.5

No1 です。軽率に回答してしまったようで、申し訳ありません。 while(my($key,$val) = each %PL) { @VS_VALUES = split(/\s/,$val); if($form{'vc_name'} eq $VS_VALUES[5] && $key ne $form{'pname'}) { &repair('VS'); ..... %PL の呼び出す順番を変更した場合、if($form{'vc_name'} eq $VS_VALUES[5] && $key ne $form{'pname'}) にどのような影響を及ぼすのか %form ハッシュや @VS_VALUES 配列の詳細を把握していないと判断できません。 また、repair('VS'); サブルーチンで %form や @VS_VALUES を書き換えていると推測できますが、どのような 処理をしているのかも分かりません。どうやら私の手には負えないので、前回の回答は撤回したく思います。

MASTER-PPC
質問者

お礼

有難うございます。 こちらの質問の仕方が悪かったため、ご迷惑をおかけしてしまい、申し訳ございませんでした。 自動登録ソフトによるレベル上げを防止するためにこの改造を行っているのですが、処理が複雑なようですので、もう少し試行錯誤して解決できないようでしたら、もっとPerlを理解できるようになってから再度挑戦してみようと思います。

すると、全ての回答が全文表示されます。
  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.4

no3です。 @VS_VALUES = split(/\s/,$val); の直後に書いて使えば良いはずです。

MASTER-PPC
質問者

お礼

有難うございます。 @VS_VALUES = split(/\s/,$val); の直後に書きましたところ、ランダムで表示されるようになったのですが、例えば、常に5人表示されなければならないところで、0~数人と、表示人数もランダムになっています。また、キャラクターデーターとキャラクター画像が合わなくなったり、本来は表示されてはいけないキャラクターも表示されてしまいます。 挿入箇所をいろいろ変えてみましたが、同じようでした。 どのように質問して、どのようなソースを出していいのかあまりよくわかっていないため、申し訳ございません。

すると、全ての回答が全文表示されます。
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

No1 です。間違いがありますので、訂正します。すみません。 >配列に入れに入れて --> 配列に入れて >@VS_VALUES = split(/\,/, $PL{$key}); --> @VS_VALUES = split(/\s/, PL{$key});

すると、全ての回答が全文表示されます。
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

次のようにすれば、実行するたびにランダムな表示になると思います。 %PL ハッシュのキーを配列に入れに入れて、ランダムに並べ替えています。 my @PL_key = keys %PL; push @PL_key, splice(@PL_key, int(rand $_), 1) foreach reverse 1 .. ($#PL_key + 1); foreach my $key (@PL_key) { @VS_VALUES = split(/\,/, $PL{$key}); print $VS_VALUES[5]; }

MASTER-PPC
質問者

お礼

有難うございます。そして申し訳ございません。 ソースが長くなると思い、短縮して書いたのがいけないようで、 お教えいただいたスクリプトを試してみましたところ、キャラクターが表示されなくなりました。https://sourceforge.jp/projects/dest/files/?release_id=30074#30074 改造しているスクリプトは↑のDestEの deste-stable.1.2.zip になります。改造ファイルはDestEフォルダのscript/battle/battle_sel.cgiの80行目辺りです。 かなり複雑なつくりになっていますので、自分ではどの部分を記載していいかわかりません。以下情報で足りない場合はよろしければスクリプトのご参照をお願いいたします。 ソースは以下の通りとなります。お手数をおかけして大変申し訳ございませんが、よろしくお願いいたします。 &repair('PL'); $first ="checked"; $col = "#efefff"; while(my($key,$val) = each %PL) { @VS_VALUES = split(/\s/,$val); if($form{'vc_name'} eq $VS_VALUES[5] && $key ne $form{'pname'}) { &repair('VS'); if(!$VS_VALUES[25]) { $che = $PL_VALUES[31] + vec($key,0,32); $sel .= "<tr bgcolor=\"$col\"><td><input type=\"radio\" $first name='vsname' value=\"$key\" onclick=\"check_val('$che')\"></td><td><span style=\"color:$VS_VALUES[13];\">$key</span>".&Rank($VS_VALUES[0],$VS_VALUES[6],$VS_VALUES[5])."</td><td><img class='icon'src='$S_Icon_path/$VS_VALUES[27].gif'></td></tr>\n"; if($col eq "#ffffff") { $col ="#efefff"; } else { $col = "#ffffff"; } if ($first) { $first = ""; $first_check = $che; } } } }

すると、全ての回答が全文表示されます。

関連するQ&A