为什么我的数学if语句失败了?

时间:2012-09-19 11:45:20

标签: php

我正在为玩家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 个答案:

答案 0 :(得分:4)

这就是开关盒的工作原理。它会检查$X是否等于您在case中列出的值。由于该值是布尔值(比较的结果是布尔值!),并且PHP有一种疯狂的方式来compare different types(在这种情况下是intbool),那个案例块实际上会被执行。

使用if语句,或使用minmax

答案 1 :(得分:1)

如果您将开关更改为

 switch (true) {

原始代码正确运行。

也许有比我更好的PHP的人可以解释原因!

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

答案 2 :(得分:0)

好吧,在$X > 10案例中,您设置了$X = 10,然后将$dropRate计算为10 - $X,即10 - 10,即0

如果所需结果为$dropRate,则$X应为10。输出首先显示$X == 0,然后输入切换案例$X > 10,这也让我很有趣......你确定你向我们展示了所有代码吗?

此外,我认为使用switch这样的案例并不是一种好习惯。这是if块的典型候选者。

答案 3 :(得分: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;
}