2013-03-07 73 views
3

我正在用PHP做遊戲(不要問大聲笑),玩家的位置是一個整數。有一個旅遊頁面,這基本上顯示了一個5x5平鋪地圖。每個瓦片是玩家宇宙的不同部分。點擊它可以在那裏旅行。 只給你地圖背後的整數的一個想法:比if語句更高效嗎?

  • 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語句之前,有沒有更好的或更有效的方法來做到這一點?

+3

我們的好老朋友'<', '<=', '> ='和'> '。他們會縮短你的陳述很好的一部分。 – Horen 2013-03-07 23:00:41

+0

你允許在對角線方向上行走,還是隻沿着水平或垂直方向行駛;如果前者,這與水平/垂直的成本相同嗎? – 2013-03-07 23:03:15

+0

我可能會用0/0中心點對單元格重新編號,以允許使用atan2() – 2013-03-07 23:05:05

回答

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)); 
+0

嗯,我想我明白你的意思...你介意詳細說明這個? – kidshenlong 2013-03-07 23:22:03

+0

@kidshenlong查看我的編輯,以確定使用畢達哥拉斯的距離。 – jeroen 2013-03-07 23:28:40

+0

Ahhhh Pythagoras嗯,我明白了@Captain Payalytic現在正在獲得什麼。雖然如果我從同一個垂直行中的任何瓷磚移動到瓷磚,它總是會返回0.您知道這是爲什麼嗎? – kidshenlong 2013-03-07 23:40:40

-2

你的代碼看起來合法的。您可以訂購條件,以便使用最多的條件。

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

+0

謝謝你爲我清楚地闡明瞭這一點。我正在研究它! :) – kidshenlong 2013-03-07 23:30:08

1

正如我上面的評論,你無法衡量單位的距離,因爲不是所有的點可以通過點的直線到達。

您需要將這些點考慮爲圖上的點(x,y座標)。然後你可以使用畢達哥拉斯得到任何2點之間的距離。例如,如果我們將頂行看作座標(1,1)(1,2)等等,如果人從(1,1)移動到(4,3),則距離旅行是3(4-1)平方加2(3-1)平方的平方根,即sqrt(9 + 4)= sqrt(13)

+0

對不起,我從來沒有在數學上最強!但我真的不想準確測量距離。我真的只是想根據瓷磚距離來衡量它。所以就像我上面說過的,如果你在15歲時想要前往44歲,那麼你應該下去或者跨過,直到你和這個數字一樣。因此,對於44,它與12,22,32,42,43和45在同一個旅行頻段,因此將花費相同的價格。如果這是有道理的... – kidshenlong 2013-03-07 23:27:52

+0

我的錯誤!這確實如此。不幸的是,數學從來就不是我的強項。我正在用@Aarolama Bluenk進一步討論它。謝謝你的貢獻:) – kidshenlong 2013-03-07 23:42:04