3

我正在用 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

4 回答 4

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));
于 2013-03-07T23:01:22.417 回答
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 );

输出

花费300学分!
花费700学分!
花费0学分!
花费400学分!

查看演示

于 2013-03-07T23:08:54.150 回答
1

正如我在上面的评论中一样,您不能以单位测量距离,因为并非所有点都可以通过点直线到达。

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

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

于 2013-03-07T23:17:14.357 回答
-2

您的代码似乎合法。您可以对条件进行排序,以便最常用的条件排在第一位。

于 2013-03-07T23:02:30.610 回答