PHP逐步计算

时间:2015-06-01 22:15:26

标签: php math

我在逐步计算PHP中的值时遇到问题。

这只是一个例子。用户可以升级,当他达到level 5时,他可以解锁执行任务的能力。新生成的任务的难度由一个数字定义:从1这是一个简单的任务到10,这是一项非常艰巨的任务。见表:

o   5:   1,   1,   2,   2,   3,   3,   3,   3,   3,   3 and so on
o   6:   1,   2,   2,   2,   3,   3,   3,   3,   3,   3
o   7:   2,   2,   2,   3,   3,   3,   3,   3,   3,   3
o   8:   2,   2,   3,   3,   4,   4,   4,   4,   4,   4
o   9:   2,   3,   3,   4,   4,   4,   4,   4,   4,   4
o   10:  3,   3,   4,   4,   5,   5,   5,   5,   5,   5
o   11:  3,   4,   4,   5,   6,   6,   6,   6,   6,   6
o   12:  4,   4,   5,   6,   7,   7,   7,   7,   7,   7
o   13:  4,   5,   6,   7,   8,   8,   8,   8,   8,   8
o   14:  5,   6,   7,   8,   9,   9,   9,   9,   9,   9
o   15:  6,   7,   8,   9,   10,  10,  10,  10,  10,  10
o   16:  7,   8,   9,   10,  10,  10,  10,  10,  10,  10
o   17:  8,   9,   10,  10,  10,  10,  10,  10,  10,  10
o   18:  9,   10,  10,  10,  10,  10,  10,  10,  10,  10
o   19:  10,  10,  10,  10,  10,  10,  10,  10,  10,  10
o   20: same as 19

这意味着:在level 5中,第一个任务是非常容易(难度1),第二个任务也是如此,第三个任务是难度2 。当玩家为level 18时:第一个任务难度 9 ,第二个任务和后续任务难以 10

但是:如何产生任务的难度? 我有两个变量:

<?php
$current_player_level
$current_mission_in_level
?>

所以:

<?php
$current_player_level=8;
$current_mission_in_level=3;
//This should return: 3
?>

所以我需要一个能够在提供上述两个变量时返回难度的函数。

我没有任何代码,因为我不知道如何开始。

3 个答案:

答案 0 :(得分:2)

我建议将困难存储在二维数组中(有时也称为“矩阵”)。代码看起来像这样:

$matrix_val = array(5 => array(1,   1,   2,   2,   3),
                    6 => array(1,   2,   2,   2,   3),
                    7 => array(2,   2,   2,   3,   3),
                    8 => array(2,   2,   3,   3,   4),
                    9 => array(2,   3,   3,   4,   4),
                    10 => array(3,   3,   4,   4,   5),
                    11 => array(3,   4,   4,   5,   6),
                    12 => array(4,   4,   5,   6,   7),
                    13 => array(4,   5,   6,   7,   8),
                    14 => array(5,   6,   7,   8,   9),
                    15 => array(6,   7,   8,   9,   10),
                    16 => array(7,   8,   9,   10,  10),
                    17 => array(8,   9,   10,  10,  10),
                    18 => array(9,   10,  10,  10,  10),
                    19 => array(10,  10,  10,  10,  10));

然后你所要做的就是:

$difficulty = $matrix_val[$current_player_level][$current_mission_in_level];

注意:“当前级别任务”假设0是第一个索引。因此,第13级中的第三个任务将被引用为$matrix_val[13][2](注意[2])。如果你想转移它,你可以为每个级别添加单独的键,或者只是在每个内部数组的开头“填充”​​无意义的条目。 (如果这令人困惑,请告诉我,我会扩大。)

作为参考,请查看official Array PHP documentation,然后您也可以read up on 2-dimensional arrays

答案 1 :(得分:1)

你应该使用数组。

您可以使用2D数组(如表格)存储您的关卡和难度,然后根据您想要的位置获得正确的值。

例如:

$table = array(
    5 => array(1, 1, 2, 2, 3),
    6 => array(1, 2, 2, 3, 3),
    7 => array(2, 2, 3, 3, 4)
);

我没有在这里显示所有数组。

因此,如果你想知道例如difficuly,你可以使用:

$current_difficulty = $table[$current_player_level][$current_mission_in_level];

这里没有太多数学,只知道arrays

答案 2 :(得分:1)

// Filling 2D array with linear gradient from left top to right bottom
// There are some math for this. But i'm not sure it is needed

$MIN = 5.0;  // min difficalty
$MAX = 9.0;  // max difficalty
$M = 15.0;   // Level legnth - 1
$N = 7.0;    // Levels count -1

$res = array();
for($y = 0; $y <= $N; $y++) 
   for($x = 0; $x <= $M; $x++) 
     {
      $y1 = ($N*$y-$M*$x+$M*$M)*$N/($M*$M+$N*$N);
      $res[$N-$y][$x] = round($MAX - $y1/$N*($MAX-$MIN));

   }
for($i=0; $i <= $N; $i++) {
   $line = $res[$i];
   echo implode(' ', $line)."\n";
   }

输出:

5 5 5 6 6 6 6 7 7 7 7 7 8 8 8 8
5 5 6 6 6 6 6 7 7 7 7 8 8 8 8 8
5 5 6 6 6 6 7 7 7 7 7 8 8 8 8 8
5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 9
5 6 6 6 6 7 7 7 7 7 8 8 8 8 8 9
6 6 6 6 6 7 7 7 7 7 8 8 8 8 9 9
6 6 6 6 6 7 7 7 7 8 8 8 8 8 9 9
6 6 6 6 7 7 7 7 7 8 8 8 8 9 9 9