この人頭いいなと思ったエピソード

現在自作の「なっちゃてRPG」と言う掲示板的な物を作っているのですが、
レベルアップでの処理に関して質問って言うか、
処理的に適切なのか、もしくは、もっと良い方法があるか教えてほしいのです。

登録者のデータは、
一行で1人のデータとしています。
データの要素に、変数、$p_lv≒レベル、$p_ex≒経験値、$p_job≒職業・・・・あと省略

#▼別ファイルで定義▼
職業を登録時に9種類(男女別)計18から選べるようにしています。
でぇ、各職業の経験値を「多次元配列」で定義しています。
$EX = [
['','12','36','84','あと省略・・・99まであります。'],
['','14','42','98','同上'],
['','15','45','105','同上'],
['','13','39','78','同上'],
['','18','54','126','同上'],
['','10','30','70','同上'],
['','11','33','77','同上'],
['','20','60','140','同上'],
['','29','87','174','同上']
];
#戦う相手のステータス
%MONSTER = (
"0" => { NAME => "モンスター1", GOLD => "2", EX => "1" },
"1" => { NAME => "モンスター2", GOLD => "3", EX => "1" },
"2" => { NAME => "モンスター3", GOLD => "3", EX => "2" },
"3" => { NAME => "モンスター4", GOLD => "5", EX => "3" },
以下省略・・・・・
);
#▲別ファイルで定義▲

#▼レベルアップ処理▼
#数値から、経験値の判定用の変数
JOB:{
if($p_job eq "17" || $p_job eq "16"){ $job_choice = 8; last JOB; }
if($p_job eq "15" || $p_job eq "14"){ $job_choice = 7; last JOB; }
if($p_job eq "13" || $p_job eq "12"){ $job_choice = 6; last JOB; }
if($p_job eq "11" || $p_job eq "10"){ $job_choice = 5; last JOB; }
if($p_job eq "9" || $p_job eq "8") { $job_choice = 4; last JOB; }
if($p_job eq "7" || $p_job eq "6") { $job_choice = 3; last JOB; }
if($p_job eq "5" || $p_job eq "4") { $job_choice = 2; last JOB; }
if($p_job eq "3" || $p_job eq "2") {$job_choice = 1; last JOB; }
if($p_job eq "1" || $p_job eq "0") { $job_choice = 0; last JOB; }
}

#▼変数$job_choiceから、経験値を計算する
if($job_choice eq "8") { $lv_up_ex = $EX->[8][$p_lv]; }
elsif($job_choice eq "7"){ $lv_up_ex = $EX->[7][$p_lv]; }
elsif($job_choice eq "6"){ $lv_up_ex = $EX->[6][$p_lv]; }
elsif($job_choice eq "5"){ $lv_up_ex = $EX->[5][$p_lv]; }
elsif($job_choice eq "4"){ $lv_up_ex = $EX->[4][$p_lv]; }
elsif($job_choice eq "3"){ $lv_up_ex = $EX->[3][$p_lv]; }
elsif($job_choice eq "2"){ $lv_up_ex = $EX->[2][$p_lv]; }
elsif($job_choice eq "1"){ $lv_up_ex = $EX->[1][$p_lv]; }
else{ $lv_up_ex = $EX->[0][$p_lv]; }


$rands_monster = int(rand(134));
#経験値の数値を取得する
$exr = $MONSTER{$rands_monster}{EX};

#投稿者の経験値と今回得た経験値の数値を足す
$p_ex += $exr;
#レベルアップしたかを判定するフラグ初期化
$lv_up_flg = 0;
#経験値を別の変数へ代入「$p_exは累計数値にして行くので」
$temp_ex = $p_ex;

#レベルが99以下だった場合に処理
if($p_lv < 99){
#上記で足した経験値と職業での経験値が同じか、以上なら、処理する
while($temp_ex >= $lv_up_ex){
$temp_ex = $temp_ex - $lv_up_ex;
$p_lv++;
$lv_up_flg++;
}
}
#▲レベルアップ処理▲

以上なのですが、いかがでしょうか?

後の処理とかファイルに書き込む処理は、問題ないのですが、
上記の部分だけ、自身が無いので、
いちをローカルでは、テストしているのですが・・・・・・

もし良かったらアドバイスお願いします。

質問者からの補足コメント

  • うれしい

    ありがとう御座います。

    すごい助かりました。
    if文の羅列が、こんなスッキリになるのですね。

    あぁ!ハッシュで定義しているのは、
    有名なRPGのシリーズ1~3のモンスターデータを流用していることと、
    上記には書きませんでしたが、
    要素が沢山あるので・・・・・
    配列「多次元配列」で定義してもいいのですが、
    ハッシュで定義してみました。

    $lv_up_exの件ですが、
    テストしている限りでは、問題なくレベルアップしますし、
    whileの処理で、$temp_ex = $temp_ex - $lv_up_ex;
    $temp_exが$lv_up_exより数値が小さくなれば、レベルアップが止まります。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/07/01 18:59

A 回答 (2件)

例えば


#▼変数$job_choiceから、経験値を計算する
のところ, 基本的に
if($job_choice eq "○") { $lv_up_ex = $EX->[○][$p_lv]; }
の繰り返し (2つの「○」には同じ値が入る) だよね. であれば, こんな if の羅列はバカで
$lv_up_ex = $EX->[$job_choice][$p_lv];
の 1行でいい.

それから
#数値から、経験値の判定用の変数
のところも式としては
$job_choice = int($p_job/2);
でいいはずだよね. ということは, 実は 2行で十分なものをこれだけ長々と書いていたことになる. 「御苦労様」ってやつだ.

ここまでは見た目でわかる部分. もっと工夫をすれば 1行も書かなくていい.

ちなみに最後の while ループで $lv_up_ex が変わらないのはおかしいんじゃないかな? あと, なんで %MONSTER がハッシュになってるんだろう. 配列, 嫌い?
この回答への補足あり
    • good
    • 0

# レベルアップ段階表


$levelMenu = [12,34,56,78,99,123, ... ] if ($myJob == "詩人兼マッパー");
...

# 今回得た経験値を足す
$myExperience += $gainNum;

# 次のレベルを決める
$prevLevel = $myLevel;
for ($myLevel = 0; $myLevel < @$levelMenu; $myLevel++) {
_ last if ($myExperience < $levelMenu->[ $myLevel ]);
}

# さぁ皆さんご一緒に
if ($prevLevel > $myLevel) {
_ &sing("レベルアップおめでとうの歌");
} elsif ($prevLevel < $myLevel) {
_ &sing("明日があるさ");
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!