1

私が作成しているテキスト ベースの RPG のレベリング システムを作成しようとしています。私が直面している問題は、範囲が switch ケースでは機能しないように見えることです。これが私が持っているものです:

int exp = 0, level = 1, hp = 10, hpmax = 10;

if (exp >= 262144) exp = 262144;

switch (exp)            
{
case (4 - 15):
    level = 2;
    hp = 12;
    hpmax = 12;
    break;

case (16 - 63):
    level = 3;
    hp = 14;
    hpmax = 14;
    break;

case (64 - 255):
    level = 4;
    hp = 16;
    hpmax = 16;
    break;

case (256 - 1023):
    level = 5;
    hp = 18;
    hpmax = 18;
    break;

case (1024 - 4095):
    level = 6;
    hp = 20;
    hpmax = 20;
    break;

case (4096 - 16383):
    level = 7;
    hp = 20;
    hpmax = 20;
    break;

case (16384 - 65535):
    level = 8;
    hp = 22;
    hpmax = 22;
    break;

case (65536 - 262143):
    level = 9;
    hp = 24;
    hpmax = 24;
    break;

case (262144 - 999999999):
    level = 10;
    hp = 26;
    hpmax = 26;
    break;

はい、私はこれが私がやりたいことをしないことを理解しています。私が見つけた代替案には満足していません。私は最も簡単な解決策を探しています。私はプログラミングが初めてなので、助けていただければ幸いです。

4

5 に答える 5

1

hpmaxが常に =hpである場合、最後に設定できることに注意してください。すべてのcases に含める必要はありません。

if-else の使用:

if (4 <= exp && exp <= 15)
{
  level = 2;
  hp = 12;
}
else if (16 <= exp && exp <= 63)
{
  level = 3;
  hp = 14;
}
else if ...

hpmax = hp; // set hpmax afterwards

上記を単純化すると:

if (exp < 4) // 0-3
  ; // do nothing
else if (exp < 16) // 4-15
  ...
else if (exp < 64) // 16-63
  ...

または関数で単純化する:(utnapistimの提案に似ています)

bool in(int exp, int start, int end) { return start <= exp && exp <= end; };

if (in(exp, 4, 15)) // 4-15
  ...
else if (in(exp, 16, 63)) // 16-63
  ...

log-base-2 の使用:

switch((int)(Math.Log(exp)/Math.Log(2)))
{
  case 2: case 3: // 4-15
    level = 2;
    hp = 12;
    break;
  case 4: case 5: // 16-63
    ...
  default: // 262144-999999999
    ...
}
hpmax = hp;

数学的(より短い)ソリューション:(すべてのケースで機能するわけではなく、ソリューションを導き出すためのものです)

int log = (int)(Math.Log(exp)/Math.Log(2));
level = 1+log/2;
hp = hpmax = 10+level*2;
于 2013-02-14T13:59:29.280 に答える
0

これは私が最終的に使用したものです:

static void LevelSystem()

    {
        if ((4 <= exp) && (exp <= 15))
        {
            level = 2;
            hpmax = 12;
        }

        else if ((16 <= exp) && (exp <= 63))
        {
            level = 3;
            hpmax = 14;
        }

        else if ((64 <= exp) && (exp <= 255))
        {
            level = 4;
            hpmax = 16;
        }

        else if ((256 <= exp) && (exp <= 1023))
        {
            level = 5;
            hpmax = 18;
        }

        else if ((1024 <= exp) && (exp <= 4095))
        {
            level = 6;
            hpmax = 20;
        }

        else if ((4096 <= exp) && (exp <= 16383))
        {
            level = 7;
            hpmax = 20;
        }

        else if ((16384 <= exp) && (exp <= 65535))
        {
            level = 8;
            hpmax = 22;
        }

        else if ((65536 <= exp) && (exp <= 262143))
        {
            level = 9;
            hpmax = 24;
        }

        else if ((262144 <= exp) && (exp <= 999999998))
        {
            level = 10;
            hpmax = 26;
        }
        else if (exp >= 999999999)
        {
            exp = 999999999;
            level = 99;
            hp = 999999999;
            hpmax = 999999999;
        }
    }

後でテストする目的でそのばかげた数を作成しましたが、すべてをメソッドに入れて、exp. これをテストしたところ、希望どおりに機能します。

みんな助けてくれてありがとう!

于 2013-02-14T17:53:17.393 に答える
0

キャラクターの適切なレベルを見つけるには、定義配列と連続した if の組み合わせを使用する必要があると思います。ランダムな (そしてより少ない) 値のサンプルを示します...

<?php
// Definition of experience needed per level, and hp given
$levelsData = array( 1 => array( "exp" => 0,
                                 "hp" => 10),
                     2 => array( "exp" => 4,
                                 "hp" => 12),
                     3 => array( "exp" => 15,
                                 "hp" => 16),
                     4 => array( "exp" => 27,
                                 "hp" => 34),
                     5 => array( "exp" => 500,
                                 "hp" => 120));

// Finding user level, giving $exp as current exp
foreach ($levelsData as $level => $data) {
    if ($exp < $data['exp']) {
        break;
    }
}

// Setting data, we already have $level as the actual level+1
$level--;
$data = $levelsData[$level];
$hp = $data['hp'];
$maxHp = $hp;
?>
于 2013-02-14T14:02:44.563 に答える
0

概念的には、チェックに関数を使用できます。

C++ を使用した例:

inline bool in_range(int min, int max, int value)
{ return min <= value && value <= max; }

// ....

        int exp = 0, level = 1, hp = 10, hpmax = 10;

        if (exp >= 262144) exp = 262144;

        if (in_range(0, 15, exp)) {
            level = 2;
            hp = 12;
            hpmax = 12;
        } else if (in_range(16, 63, exp)) {
            level = 3;
            hp = 14;
            hpmax = 14;
        } else if ...
于 2013-02-14T13:58:19.880 に答える
0

おそらく if-then-else ステートメントを探しているでしょう:

           int exp = 0, level = 1, hp = 10, hpmax = 10;


            if ((4 >= exp) && (exp <= 15)){
                level = 2;
                hp = 12;
                hpmax = 12;
            } elseif ((16 >= exp) && (exp <= 63)){
                level = 3;
                hp = 14;
                hpmax = 14;
            } elseif ((64 >= exp) && (exp <= 255)){
                level = 4;
                hp = 16;
                hpmax = 16;
            } elseif ((256 >= exp) && (exp <= 1023)){
                level = 5;
                hp = 18;
                hpmax = 18;
            } elseif ((256 >= exp) && (exp <= 1023)){

             .... etc, you know what do paste here, etc ....

            } elseif ((262144 >= exp) && (exp <= 999999999)){
                level = 10;
                hp = 26;
                hpmax = 26;
            } else {
                ... you probably don't need anything here ...
                ... you already set defaults in the init up top...
            }
于 2013-02-14T14:00:42.630 に答える