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

別の方法を使用します。最初の桁が行を定義し、2番目の桁が列を定義するので、これらの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

As in my comment above, you cannot measure distance in units, since not all points can be reached in a straight line through points.

You need to consider these points to be points (x, y coordinates) on a graph. Then you can get the distance between any 2 points using Pythagoras.

For example, if we consider your top row as being the coordinates (1,1) (1,2) and so on, if the person travels from (1,1) to (4,3), the distance travelled is the square root of 3 (4-1) squared plus 2 (3-1) squared, i.e. sqrt(9+4) = sqrt(13)

于 2013-03-07T23:17:14.357 に答える
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 に答える
-2

あなたのコードは合法のようです。最もよく使用されるものが最初になるように条件を並べ替えることができます。

于 2013-03-07T23:02:30.610 に答える