0

我正在为玩家 A 与 B 的战斗编写简单的掉落公式 - 等级差异决定了掉落率。我的问题是,0: > 10 ||| 1 vs. 1 = 10%它没有给出0: > 10 ||| 1 vs. 1 = 0%- 为什么?

PhpFiddle:http ://www.phpfiddle.org/main/code/n1q-dw7

<?php

# lets simulate high level player A attacks low level player B
for ($A = 1; $A <= 100; $A++) {
    $B = 1;
    calculateMoneyDrop($A,$B);
}

# lets simulate low level player A attacks high level player B
for ($B = 1; $B <= 100; $B++) {
    $A = 1;
    calculateMoneyDrop($A,$B);
}

function calculateMoneyDrop($A,$B) {
    $X = $A - $B;
    echo '<strong>', $X, '</strong>: ';

    switch ($X) {
        case $X > 10:
            echo "> 10 ||| ";
            $X = 10;
            break;
        case $X < -90:
            echo "< -90 ||| ";
            $X = -90;
            break;
    }

    $dropRate = 10 - $X;
    echo $A, ' vs. ', $B, ' = ', $dropRate, '%<br>';

}
4

4 回答 4

4

这就是 switch-case 的工作原理。它检查是否$X等于您在 中列出的值case。由于该值是一个布尔值(比较的结果是一个布尔值!),并且 PHP 有一种比较不同类型(在本例中为intbool)的疯狂方式,因此该块实际上将被执行。

使用if语句,或使用minand max

于 2012-09-19T11:58:09.550 回答
1

如果您将开关更改为

 switch (true) {

原始代码运行正确。

也许比我更好的 php 的人可以解释为什么!

http://www.phpfiddle.org/main/code/6pg-nwc

于 2012-09-19T12:47:39.487 回答
0

好吧,在您的$X > 10情况下,您设置$X = 10并稍后计算$dropRate10 - $X,即10 - 10,即0

如果期望的结果是,则$dropRate应该是。输出先说,然后进入开关盒,这也让我感到好笑……您确定要向我们展示所有代码吗?$X10$X == 0$X > 10

另外,我认为使用这种switch情况不是一个好习惯。这是一个典型的if块候选。

于 2012-09-19T11:52:44.500 回答
0

您的开关块与以下内容相同:

if(($X > 10)==$X){
        echo "> 10 ||| ";
        $X = 10;
}
else if(($X < -90)==$X){
        echo "< -90 ||| ";
        $X = -90;
}

它将“case”中的任何内容与开关括号中的内容进行比较。Switch 仅用于“等于”比较。因此,要使其工作,请使用:

if($X > 10){
        echo "> 10 ||| ";
        $X = 10;
}
else if($X < -90){
        echo "< -90 ||| ";
        $X = -90;
}
于 2012-09-19T12:05:43.633 回答