私設SoS2オーナー応援BBS

新規発言一覧最新記事過去一覧検索ダウンロードページHOME

スレッド

└◇700:
find_bestについて [masaki] 08/02 11:08

 ├◇701:Re:find_bestについて [moon] 08/02 13:01
 │└◇702:Re[2]:find_bestについて [masaki] 08/02 14:06
 │ └◇703:Re[3]:find_bestについて [moon] 08/02 15:00
 │  └◇704:Re[4]:find_bestについて [masaki] 08/02 17:29
 │   └◇705:Re[5]:find_bestについて [moon] 08/02 17:38
 │    └◇706:Re[6]:find_bestについて [masaki] 08/02 18:55
 │     └◇707:Re[7]:find_bestについて [moon] 08/02 19:49
 │      └◇708:Re[8]:find_bestについて [masaki] 08/02 22:07
 │       └◇709:Re[9]:find_bestについて [moon] 08/02 22:27
 │        └◇710:Re[10]:find_bestについて [moon] 08/02 22:40
 │         └◇711:Re[11]:find_bestについて [masaki] 08/02 23:07
 │          └◇712:Re[12]:find_bestについて [moon] 08/02 23:53
 │           └◇713:組織内の階級 [moon] 08/03 00:05
 │            └◇714:Re:組織内の階級 [masaki] 08/03 07:28
 └◇715:組織内の階級 No.714から [moon] 08/03 10:13
  └◇716:補足 [moon] 08/03 10:16
   └◇717:Re:補足 [masaki] 08/03 11:01
    └◇718:Re[2]:補足 [masaki] 08/03 13:09<-last


700● find_bestについて[ masaki ] 2003 08/02 11:08
こんにちは(^^
ちょっとよくわからないので、質問に来ました。
# Sub Find the Best Player #内に
『組織別の階級』みたいなものをこんな感じ↓にやってみたのですが、全員『団員』になってしまいます。
if ($sp =~ /S1/ && $rt>$bestrate11) {$kaikyu='団長';$srank1="1";$bestrate11 = $rt}
elsif ($sp =~ /S1/ && $rt>$bestrate12 && $srank1 =="1"){$kaikyu='副団長';$srank1="2";$bestrate12 = $rt}
elsif ($sp =~ /S1/ && $rt>$bestrate13 && $srank1 =="2"){$kaikyu="特攻隊長";$bestrate13 = $rt}
else{$kaikyu='団員'}

↓この文もいまいち意味がわからないです(;;
if($rt>$bestrate) {$hero = $nm; $himg = $ig; $bestrate = $rt}

どうか、ご教授お願いします。
スレッド一覧


701● Re:find_bestについて[ moon ] 2003 08/02 13:01
> ↓この文もいまいち意味がわからないです(;;
> if($rt>$bestrate) {$hero = $nm; $himg = $ig; $bestrate = $rt}

まず、こちらから。
Rateは戦績として表記します。
$bestrateは現在の最高戦績、$heroは最高戦績者の名前、$himgは最高戦績者の画像ファイル名、が代入されているので、(変数名を日本語で書くと余計分かりづらいかもしれないですが・・・)
if(対象者の戦績 > 現在の最高戦績){
  最高戦績者の名前 = 対象者の名前;
  最高戦績者の画像ファイル名 = 対象者の画像ファイル名;
  現在の最高戦績 = 対象者の戦績;
}
となります。
つまり、対象者の戦績が現在の最高戦績より高い場合は、現在の最高戦績を更新する、という処理です。

> # Sub Find the Best Player #内に
> 『組織別の階級』みたいなものをこんな感じ↓にやってみたのですが、全員『団員』になってしまいます。
> if ($sp =~ /S1/ && $rt>$bestrate11) {$kaikyu='団長';$srank1="1";$bestrate11 = $rt}
> elsif ($sp =~ /S1/ && $rt>$bestrate12 && $srank1 =="1"){$kaikyu='副団長';$srank1="2";$bestrate12 = $rt}
> elsif ($sp =~ /S1/ && $rt>$bestrate13 && $srank1 =="2"){$kaikyu="特攻隊長";$bestrate13 = $rt}
> else{$kaikyu='団員'}

上記だとリストの最後が「団員」になるプレイヤーだと全体の結果も「団員」になってしまうと思います。(最後のプレイヤーの$spに'S1'が入っていないと確実に「団員」に。)

1. どういうように表示したいのでしょうか?
  ・各組織ごとに「団長」「副団長」「特攻隊長」を表示したい。(これだと団員の表示はまずいし、他のと比べて確実に高負荷)
  ・特定の人の組織内での階級を表示したい。
  ・その他。
2. どこで表示したいのでしょうか?
  ・トップ画面で。
  ・ID順や名前順または販売品などのリストのように別リストで。
  ・その他。
スレッド一覧


702● Re[2]:find_bestについて[ masaki ] 2003 08/02 14:06
> Rateは戦績として表記します。
> $bestrateは現在の最高戦績、$heroは最高戦績者の名前、$himgは最高戦績者の画像ファイル名、が代入されているので、(変数名を日本語で書くと余計分かりづらいかもしれないですが・・・)
> if(対象者の戦績 > 現在の最高戦績){
>   最高戦績者の名前 = 対象者の名前;
>   最高戦績者の画像ファイル名 = 対象者の画像ファイル名;
>   現在の最高戦績 = 対象者の戦績;
> }
> となります。
> つまり、対象者の戦績が現在の最高戦績より高い場合は、現在の最高戦績を更新する、という処理です。
最初は$bestrateに何も代入されていないみたいですが…
それでもできるのですね(^^;
ありがとうございました。
> > # Sub Find the Best Player #内に
> > 『組織別の階級』みたいなものをこんな感じ↓にやってみたのですが、全員『団員』になってしまいます。
> > if ($sp =~ /S1/ && $rt>$bestrate11) {$kaikyu='団長';$srank1="1";$bestrate11 = $rt}
> > elsif ($sp =~ /S1/ && $rt>$bestrate12 && $srank1 =="1"){$kaikyu='副団長';$srank1="2";$bestrate12 = $rt}
> > elsif ($sp =~ /S1/ && $rt>$bestrate13 && $srank1 =="2"){$kaikyu="特攻隊長";$bestrate13 = $rt}
> > else{$kaikyu='団員'}
>
> 上記だとリストの最後が「団員」になるプレイヤーだと全体の結果も「団員」になってしまうと思います。(最後のプレイヤーの$spに'S1'が入っていないと確実に「団員」に。)
>
> 1. どういうように表示したいのでしょうか?
>   ・各組織ごとに「団長」「副団長」「特攻隊長」を表示したい。(これだと団員の表示はまずいし、他のと比べて確実に高負荷)
>   ・特定の人の組織内での階級を表示したい。
>   ・その他。
> 2. どこで表示したいのでしょうか?
>   ・トップ画面で。
>   ・ID順や名前順または販売品などのリストのように別リストで。
>   ・その他。
組織に所属している人のレートから、階級を表示したいのです(^^;
(各組織ごとに)
1番レートが高い人が団長次が副団長、その次が特攻隊長でその他は団員という感じです(^^;;
表示場所はplayer's dataとリストとpartner dataです。
ご迷惑をお掛けしますm(_ _)m
スレッド一覧


703● Re[3]:find_bestについて[ moon ] 2003 08/02 15:00
> 組織に所属している人のレートから、階級を表示したいのです(^^;
> (各組織ごとに)
> 1番レートが高い人が団長次が副団長、その次が特攻隊長でその他は団員という感じです(^^;;
> 表示場所はplayer's dataとリストとpartner dataです。
> ご迷惑をお掛けしますm(_ _)m

う〜ん。
下記以外は、負荷を考えるとお勧めできないですけれどね・・・。

一番増加する負荷が少ないと思うのは、プレイヤーデータだけが表示される場面だけでの表示なのでとりあえずこの場合だけを書きます。

sub normal_actionで、
  foreach $line (@lstlines) {
    ($pid,$pnm,$pps,$pjb,$pig,$psp,$pbp,$others) = split(/<>/,$line);
    if ($Fm{'id'} eq $pid) { $mysp = $psp; $mybp = $pbp }
    else { print qq|<option value="$pid">$pid:$pnm($pjb)\n| }
  }
を、
  @rcdlines = &get_user("$Fm{'id'}"); # 追加
  if($sp =~ /S\d/){$group = $&; $rt = &rate($wn, $lz, $kl, $dt); $rank = 0;}else{$group = $rank = '';} # 追加
  foreach $line (@lstlines) {
    ($pid,$pnm,$pps,$pjb,$pig,$psp,$pbp,〜,$others) = split(/<>/,$line); # $pwn、$plz、$pkl、$pdtが取得されていないなら取得できるように変更。
    if ($Fm{'id'} eq $pid) { $mysp = $psp; $mybp = $pbp }
    else {
      $rank++ if($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt)); # 追加
      print qq|<option value="$pid">$pid:$pnm($pjb)\n|
    }
  }
そして、sub player_dataで、
  if($rank ne ''){
    # ('団長', '副団長', '特攻隊長', '団員')[$rank]という感じで階級を得て表示
  }
  else{
    # 所属していない場合の表示
  }
と表示処理を行います。
処理の確認どころか文法チェックさえやっていないので間違いがあるかもしれませんが適宜指摘してください。

# 相手のステータス画面でも同様にループさせて判定を繰り返せば階級を表示させることは可能ですが、オリジナルではループが無い箇所なのでそれだけファイル読み込みやループ処理でかなり負荷が増加するはずです。
スレッド一覧


704● Re[4]:find_bestについて[ masaki ] 2003 08/02 17:29
ありがとうございました。(^^
できました!
それで、できたのはそれでよかったのですが
># ('団長', '副団長', '特攻隊長', '団員')[$rank]という感じで階級を得て表示
というのを
@ranking = ('団長', '副団長', '特攻隊長', '団員');
print qq|ランク:<b>$ranking[$rank]</b><br>\n|
というかんじでやってみたのですが、moonさんの仰っているのと違うのかな?と思ったのですが。
なにはともあれ、表示されたのでよかったです。
ありがとうございました!
(本当にいつもありがとうございますm(_ _)m)
スレッド一覧


705● Re[5]:find_bestについて[ moon ] 2003 08/02 17:38
> 表示場所はplayer's dataとリストとpartner dataです。

ふと読み直したらここの「リスト」を読み飛ばしていたらしく、考えていたのですが少し書いてみたところ整理するのが面倒そうです。

> ありがとうございました。(^^
> できました!
> それで、できたのはそれでよかったのですが
> ># ('団長', '副団長', '特攻隊長', '団員')[$rank]という感じで階級を得て表示
> というのを
> @ranking = ('団長', '副団長', '特攻隊長', '団員');
> print qq|ランク:<b>$ranking[$rank]</b><br>\n|
> というかんじでやってみたのですが、moonさんの仰っているのと違うのかな?と思ったのですが。
> なにはともあれ、表示されたのでよかったです。
> ありがとうございました!
> (本当にいつもありがとうございますm(_ _)m)

動作としては同じはずですが、変な動作だったのでしょうか?
スレッド一覧


706● Re[6]:find_bestについて[ masaki ] 2003 08/02 18:55
> > 表示場所はplayer's dataとリストとpartner dataです。
>
> ふと読み直したらここの「リスト」を読み飛ばしていたらしく、考えていたのですが少し書いてみたところ整理するのが面倒そうです。
プレイヤーデータとパートナーだけで十分です〜(^^
> 動作としては同じはずですが、変な動作だったのでしょうか?
いえ。違う方法もあるのかな?と思っただけです(^^;
ありがとうございました!
スレッド一覧


707● Re[7]:find_bestについて[ moon ] 2003 08/02 19:49
> > > 表示場所はplayer's dataとリストとpartner dataです。
> >
> > ふと読み直したらここの「リスト」を読み飛ばしていたらしく、考えていたのですが少し書いてみたところ整理するのが面倒そうです。
> プレイヤーデータとパートナーだけで十分です〜(^^
> > 動作としては同じはずですが、変な動作だったのでしょうか?
> いえ。違う方法もあるのかな?と思っただけです(^^;
> ありがとうございました!

了解しました。
前述の理由により相手の階級は求めていないので、自分の階級しか分からないんですよね・・・。
まあ、そこはアイディアもしくは負荷に対する覚悟で乗り切ってください。(笑)
スレッド一覧


708● Re[8]:find_bestについて[ masaki ] 2003 08/02 22:07
> > > > 表示場所はplayer's dataとリストとpartner dataです。
> > >
> > > ふと読み直したらここの「リスト」を読み飛ばしていたらしく、考えていたのですが少し書いてみたところ整理するのが面倒そうです。
> > プレイヤーデータとパートナーだけで十分です〜(^^
> > > 動作としては同じはずですが、変な動作だったのでしょうか?
> > いえ。違う方法もあるのかな?と思っただけです(^^;
> > ありがとうございました!
>
> 了解しました。
> 前述の理由により相手の階級は求めていないので、自分の階級しか分からないんですよね・・・。
> まあ、そこはアイディアもしくは負荷に対する覚悟で乗り切ってください。(笑)
新たな質問なのですが、
勢力別でランクを出したい場合はどのようにすればいいのでしょうか??
if($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S1/){$rank++;}
elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S3/){$rank++;}
elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S5/){$rank++;}
elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S7/){$rank++;}
elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S8/){$rank++;}
のようにしたのですが上手くいきません。
S1,S3,S5,S7,S8が各組織を表す記号です。(^^;
スレッド一覧


709● Re[9]:find_bestについて[ moon ] 2003 08/02 22:27
> 新たな質問なのですが、
> 勢力別でランクを出したい場合はどのようにすればいいのでしょうか??
> if($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S1/){$rank++;}
> elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S3/){$rank++;}
> elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S5/){$rank++;}
> elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S7/){$rank++;}
> elsif($rank ne '' && $rank < 3 && index($psp, $group) >= 0 && $rt < &rate($pwn, $plz, $pkl, $pdt )&& $sp =~ /Tf/&& $sp =~ /S8/){$rank++;}
> のようにしたのですが上手くいきません。
> S1,S3,S5,S7,S8が各組織を表す記号です。(^^;

どこでの話でしょうか?
勢力別で出したいのは分かるのですが、$rankや$groupが共用されているので出したい結果が見えてこないです。

# スクリプトの書き方からすると、ある特定の一人の組織内での階級を求めようとしているように思うのですが。(つまり先ほど書いたのと似たような処理・・・)
スレッド一覧


710● Re[10]:find_bestについて[ moon ] 2003 08/02 22:40
> # スクリプトの書き方からすると、ある特定の一人の組織内での階級を求めようとしているように思うのですが。(つまり先ほど書いたのと似たような処理・・・)

補足すると、ある特定のプレイヤーの階級だけを出したいのではなく一度に全ての組織の全階級を求めたいのでしょうか、ということです。
もしそうだとすると、前述の通り少し面倒な処理になりそうなので考えるのに躊躇しています・・・。
スレッド一覧


711● Re[11]:find_bestについて[ masaki ] 2003 08/02 23:07
>>どこでの話でしょうか?
ええと、normal_actionのforeach内です(^^;;
難しくてよくわからないのですが(苦笑)

> > # スクリプトの書き方からすると、ある特定の一人の組織内での階級を求めようとしているように思うのですが。(つまり先ほど書いたのと似たような処理・・・)
>
> 補足すると、ある特定のプレイヤーの階級だけを出したいのではなく一度に全ての組織の全階級を求めたいのでしょうか、ということです。
> もしそうだとすると、前述の通り少し面倒な処理になりそうなので考えるのに躊躇しています・・・。
ある特定のプレイヤーの階級を出したいのです。(player_dataやpartner_dataで表示させます)
ただ、組織毎に団長が一人、副団長が一人、特攻隊長が一人、そのほかは団員。といった感じにしたいのです。
スレッド一覧


712● Re[12]:find_bestについて[ moon ] 2003 08/02 23:53
> ある特定のプレイヤーの階級を出したいのです。(player_dataやpartner_dataで表示させます)
> ただ、組織毎に団長が一人、副団長が一人、特攻隊長が一人、そのほかは団員。といった感じにしたいのです。

暑くていつもより頭が回っていないのでまだ理解できていないのですが、自分と相手の階級のみを表示したいということですか?
自分はともかく相手の階級を表示するのは、No.707で書いたようにアイディアで乗り切るか負荷を覚悟で求める処理をするかの選択ですよ。

負荷が低いようなアイディアは思い付かないので、相手に対しても自分と同じ処理を適用するということで話を進めます。

sub partner_dataの先頭に、
  &get_file;
  &list_in;
  if($sp =~ /S\d/){
    $group = $&;
    $rt = &rate($wn, $lz, $kl, $dt);
    $rank = 0;
  }
  else{
    $group = $rank = '';
  }
  if($psp =~ /S\d/){
    $pgroup = $&;
    $prt = &rate($pwn, $plz, $pkl, $pdt);
    $prank = 0;
  }
  else{
    $pgroup = $prank = '';
  }
  foreach(@lstlines){
    ($rid, $rnm, $rps, $rjb, $rig, $rsp, $rbp, 〜) = split(/<>/, $_); # 〜には$wn、$lz、$kl、$dtに対応する値(左記と同じ名前付けだと$rwnなど)が含まれるように。
    if($id ne $rid && $rank ne '' && $rank < 3 && index($rsp, $group) >= 0 && $rt < &rate($rwn, $rlz, $rkl, $rdt)){
      $rank++;
      last if($rank >= 3 && $prank >= 3);
    }
    if($pid ne $rid && $prank ne '' && $prank < 3 && index($rsp, $pgroup) >= 0 && $prt < &rate($rwn, $rlz, $rkl, $rdt)){
      $prank++;
      last if($prank >= 3 && $rank >= 3);
    }
  }
を追加し、自分の階級と同様な処理で$prankを使って階級表示を行えばとりあえず相手の階級も表示されると思います。

# 本来無いはずのファイル読み込みとループなので負荷を本当に気を付けたほうが良いです。
スレッド一覧


713● 組織内の階級[ moon ] 2003 08/03 00:05
少しでも負荷を減らすために少し修正します。

  if($sp =~ /S\d/){
    $group = $&;
    $rt = &rate($wn, $lz, $kl, $dt);
    $rank = 0;
  }
  else{
    $group = $rank = '';
  }
  if($psp =~ /S\d/){
    $pgroup = $&;
    $prt = &rate($pwn, $plz, $pkl, $pdt);
    $prank = 0;
  }
  else{
    $pgroup = $prank = '';
  }
  if($rank ne '' || $prank ne ''){ # 上記を前に出し、両者が共に組織に属していない場合はループを行わないように変更した。
    &get_file;
    &list_in;
    foreach(@lstlines){
      ($rid, $rnm, $rps, $rjb, $rig, $rsp, $rbp, 〜) = split(/<>/, $_); # 〜には$wn、$lz、$kl、$dtに対応する値(左記と同じ名前付けだと$rwnなど)が含まれるように。
      if($id ne $rid && $rank ne '' && $rank < 3 && index($rsp, $group) >= 0 && $rt < &rate($rwn, $rlz, $rkl, $rdt)){
        $rank++;
        last if($rank >= 3 && $prank >= 3);
      }
      if($pid ne $rid && $prank ne '' && $prank < 3 && index($rsp, $pgroup) >= 0 && $prt < &rate($rwn, $rlz, $rkl, $rdt)){
        $prank++;
        last if($prank >= 3 && $rank >= 3);
      }
    }
  }
スレッド一覧


714● Re:組織内の階級[ masaki ] 2003 08/03 07:28
説明が下手ですみませんm(_ _)m
partner_dataへの表示方法ありがとうございました。

>>> ただ、組織毎に団長が一人、副団長が一人、特攻隊長が一人、そのほかは団員。といった感じにしたいのです。
ということについてなのですが、
>      if($id ne $rid && $rank ne '' && $rank < 3 && index($rsp, $group) >= 0 && $rt < &rate($rwn, $rlz, $rkl, $rdt)){
>        $rank++;
>        last if($rank >= 3 && $prank >= 3);
>      }
>      if($pid ne $rid && $prank ne '' && $prank < 3 && index($rsp, $pgroup) >= 0 && $prt < &rate($rwn, $rlz, $rkl, $rdt)){
>        $prank++;
>        last if($prank >= 3 && $rank >= 3);
>      }
これだと、組織に関係無く団長、副団長、特攻隊長が決まってしまうのではないでしょうか??(ちがったらすみません)
組織1に団長一人、副団長一人、特攻隊長一人
組織2に団長一人、副団長一人、特攻隊長一人

という感じにするのは難しいのでしょうか?(^^;
何度も何度も本当にすみません。
スレッド一覧


715● 組織内の階級 No.714から[ moon ] 2003 08/03 10:13
> これだと、組織に関係無く団長、副団長、特攻隊長が決まってしまうのではないでしょうか??(ちがったらすみません)
> 組織1に団長一人、副団長一人、特攻隊長一人
> 組織2に団長一人、副団長一人、特攻隊長一人
> …
> という感じにするのは難しいのでしょうか?(^^;
> 何度も何度も本当にすみません。

一応、組織内での自分の階級を求めようとしています。
具体的な判定条件はindex($rsp, $group) >= 0で、$groupには'S1'などの自分の組織パラメータが入っておりそれをループ内の現在の人のスキルと比較しています。

ただし、戦績が同じ場合は団長2人、副団長0人、特攻隊長1人というように重複が発生します。(下記は組織内のトップ戦績が2人いる場合)
スレッド一覧


716● 補足[ moon ] 2003 08/03 10:16
> 一応、組織内での自分の階級を求めようとしています。
> 具体的な判定条件はindex($rsp, $group) >= 0で、$groupには'S1'などの自分の組織パラメータが入っておりそれをループ内の現在の人のスキルと比較しています。
>
> ただし、戦績が同じ場合は団長2人、副団長0人、特攻隊長1人というように重複が発生します。(下記は組織内のトップ戦績が2人いる場合)

それぞれの組織の団長となるはずのプレイヤーで表示を確かめてみて、全員が正常に団長と表示されれば大丈夫なのかな。
もちろん団長以外に副団長、特攻隊長も確認すれば完璧だろうけれど。
スレッド一覧


717● Re:補足[ masaki ] 2003 08/03 11:01
ありがとうございます(^^;
早速確認してきます〜。
スレッド一覧


718● Re[2]:補足[ masaki ] 2003 08/03 13:09
> ありがとうございます(^^;
> 早速確認してきます〜。
できました!
本当にありがとうございました。
スレッド一覧

CGIROOM