比if语句更有效吗?

时间:2013-03-07 22:58:07

标签: php

我正在使用PHP制作游戏(不要问大声笑),并且玩家的位置是整数。有一个旅行页面,这基本上显示了一个5x5平铺地图。每个图块都是玩家宇宙的不同部分。通过点击它,他可以在那里旅行。 只是为了让你了解地图背后的整数:

  • 11,12,13,14,15
  • 21,22,23,24,25
  • 31,32,33,34,35
  • 41,42,43,44,45
  • 51,52,53,54,55

让我们说球员从33(中间)开始,我想根据他走的距离向他收取不同的费用。因此,例如,任何方向上的1个瓷砖是100个信用点,2个瓷砖是200个等等。

所以我想出的就是这个。 $ol代表玩家的当前位置,$nl是他们前往的地方......

if($ol-11==$nl || $ol-10==$nl || $ol-9==$nl || $ol+1==$nl || $ol+11==$nl || $ol+10==$nl || $ol+9==$nl || $ol-1==$nl || $ol-11==$nl ){
echo "cost 100 credits!";
}
else if($ol-22==$nl || $ol-21==$nl || $ol-20==$nl || $ol-19==$nl || $ol-18==$nl || $ol-8==$nl || $ol+2==$nl || $ol+12==$nl || $ol+22==$nl 

|| $ol+21==$nl || $ol+20==$nl || $ol+19==$nl || $ol+18==$nl || $ol+8==$nl || $ol-2==$nl || $ol-12==$nl ){
echo "cost 200 credits!";
}

这是1和2瓦片旅行的代码。正如你所看到的那样,这是一个冗长的陈述。

我基本上为我设置的网格设计了一个模式。例如,向上移动1个图块将始终是当前图块的-10。

在我输入更多可笑的if语句之前,是否有更简洁或更有效的方法来做到这一点?

4 个答案:

答案 0 :(得分:2)

我会使用不同的方法:当第一个数字定义行而第二个数字定义列时,我会将这两个数字中的数字拆分并使用这些数字来确定行数和行数。

所以对于任何职位:

$row = floor($tile_value / 10);
$column = $tile_value % 10;

有了这个,很容易计算距离。

编辑:衡量绝对距离的一个小例子:

$row_org = floor($tile_org_value / 10);
$column_org = $tile_org_value % 10;

$row_new = floor($tile_new_value / 10);
$column_new = $tile_new_value % 10;

$row_diff = $row_new - $row_org;
$col_diff = $col_new - $col_org;

$distance = sqrt(pow($row_diff, 2) + pow($col_diff, 2));

答案 1 :(得分:1)

我可能会尝试一个坐标数组。这将允许您设置初始坐标。然后,您可以将新坐标传递给将移动位置并计算成本的函数。

<?php

$array = array( );

//populate the array with 0's
for( $i = 1; $i <= 5; $i++ ) {
    for( $j = 1; $j <= 5; $j++ ) {
        $array[$i][$j] = 0;
    }
}

//set beginning position
$array[3][3] = 1;

function newPosition( $array, $newX, $newY ) {
    $oldX = 0;
    $oldY = 0;

    //locate current position
    foreach($array as $key=>$subArray) {
        foreach($subArray as $subKey=>$val) {
            if($val === 1) {
                $oldX = $key;
                $oldY = $subKey;
            }
        }
    }

    //delete old position
    $array[$oldX][$oldY] = 0;

    //set new position
    $array[$newX][$newY] = 1;

    //Calculate x and y difference
    $xTravel = abs($oldX - $newX);
    $yTravel = abs($oldY - $newY);

    //Add x and y difference
    $totalTravel = $xTravel + $yTravel;

    //Calculate the cost
    $totalCost = $totalTravel * 100;

    echo "cost $totalCost credits!\n";

    return $array;
}

$array = newPosition( $array, 5, 2 );
$array = newPosition( $array, 1, 5 );
$array = newPosition( $array, 1, 5 );
$array = newPosition( $array, 3, 3 );

<强>输出

cost 300 credits!
cost 700 credits!
cost 0 credits!
cost 400 credits!

See the demo

答案 2 :(得分:1)

正如我在上面的评论中所说,你不能以单位来衡量距离,因为不是所有的点都可以通过点直线到达。

您需要将这些点视为图表上的点(x,y坐标)。然后你可以使用毕达哥拉斯获得任意2点之间的距离。

例如,如果我们将您的顶行视为坐标(1,1)(1,2)等等,如果此人从(1,1)行进到(4,3),则行进的距离是3(4-1)平方加2(3-1)平方的平方根,即sqrt(9 + 4)= sqrt(13)

答案 3 :(得分:-2)

您的代码似乎合法。您可以订购条件,以便最常用的条件是第一个。