1

の値がわかっている場合、何百もの if ステートメントを書かず$c_xpにどのように見つけることができますか。$c_level

Level     XP
1         0-99
2         100
3         500  +400 xp points from last level
4         1000 +500 xp points from last level
5         1600 +600 xp points from last level
6         2300 +700 xp points from last level
7         3100 +800 xp points from last level
8         4000 +900 xp points from last level

等々。

$c_level = ;
4

4 に答える 4

6

あなたのパターンを正しく理解している場合:

$c_level = floor((-1 + sqrt(1 + 4 * ($c_xp + 500) / 100 * 2)) / 2) - 1;

100、次に 400、次に 500、600、700、800 などを追加しています。100 種類はパターンを崩すので、今のところ無視します。

あなたがパターンを追いかけていたと仮定すると

Level     XP

1         0-99
2         100-299
3         300-599
4         600-999
5         1000-1499
6         1500-2099

増分は 100、200、300 などなので、これは簡単です。100 未満はレベル 1、300 未満はレベル 2、600 未満はレベル 3 です。

0+1=1 (hence 100)
0+1+2=3 (hence 300)
0+1+2+3=6 (hence 600)

などなど 4番目。最初の x 個の整数の合計は 0.5 * x * (1 + x) = y です。y は合計です - http://en.wikipedia.org/wiki/Summationを参照してください。

私たちの場合、合計の 100 倍になります。XP を 100 で割るだけで y が得られ、2 次式を使用して x を解くことができます。XPが600の場合、レベルは4です。

600 / 100 = 6、および 0.5 * x * (1 + x) = 6. 2 次式は、x が 3 であることを示しています。説明できない理由から、floor() を使用して 1 を追加する必要があります。500ポイント未満のパターンの欠如を調整するための長い話.

于 2012-08-25T22:47:56.730 に答える
4
  1. level-xp のペアを配列に保存します。

    $levels = array(
        1 => 99,
        2 => 499,
        3 => 999
    );
    

    level に関連付けられた値は、特定のレベルの最大値であることに注意してください。つまり、次のレベルに関連付けられるポイントが 1 つ多くなります。

  2. レベル配列をループし、プレイヤーの XP がレベルの最大値未満かどうかを確認します。

    $level = null;
    $xp = 845;
    
    foreach ($levels as $l => $max) {
        if ($xp <= $max) {
            $level = $l;
            break;
        }
    }
    
于 2012-08-25T22:41:05.163 に答える
2

これを試して:

<?php
    $levels=Array(
    1=>99,
    2=>100,
    3=>500,
    4=>1000,
    5=>1600,
    6=>2300,
    7=>3100,
    8=>4000
    );

    //this will probably be pulled from somewhere else,
    //take it out:
    $c_xp=499;
    foreach($levels as $level=>$xp) {
        if($c_xp>=$xp) $c_level=$level;
        else break;
    }
    echo $c_level;

?>
于 2012-08-25T22:43:35.483 に答える
0

これを試して

$maxLevel = 10;
$exp[2] = 100;

if($c_xp < 100)
    $c_level = 1;
elseif($c_xp < 500)
    $c_level = 2;

else
{   
   $increment = 400;

   for($i = 3; $i<= $maxLevel; $i++)
    {

        $prevExp = $exp[$i-1];
        $calc = $increment + $prevExp;
        if($c_xp == $calc)
        {
            $c_level = $i;
            break;
        }
        elseif($c_xp > $prevExp && $c_xp < $calc)
        {
            $c_level = $i-1;
            break;
        }
        $exp[$i] = $calc;
        $increment += 100;
    }
}

$c_level = isset($c_level) ? $c_level : $maxLevel;
echo "level $c_level";

maxLevel var を最大レベルにしたい値に切り替えます。

おそらくより効率的な解決策ですが、私はアルゴリズムが苦手で、週末です。

于 2012-08-25T23:04:56.837 に答える