我正在为玩家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>';
}
答案 0 :(得分:4)
这就是开关盒的工作原理。它会检查$X
是否等于您在case
中列出的值。由于该值是布尔值(比较的结果是布尔值!),并且PHP有一种疯狂的方式来compare different types(在这种情况下是int
和bool
),那个案例块实际上会被执行。
使用if
语句,或使用min
和max
。
答案 1 :(得分:1)
答案 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;
}