我正在使用PHP制作游戏(不要问大声笑),并且玩家的位置是整数。有一个旅行页面,这基本上显示了一个5x5平铺地图。每个图块都是玩家宇宙的不同部分。通过点击它,他可以在那里旅行。 只是为了让你了解地图背后的整数:
让我们说球员从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语句之前,是否有更简洁或更有效的方法来做到这一点?
答案 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!
答案 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)
您的代码似乎合法。您可以订购条件,以便最常用的条件是第一个。