PHP - 两个数组之间的计算 - 键和键值

时间:2014-05-19 21:23:03

标签: php arrays

网络游戏的场景。我们有两座相连的建筑。第二个是像升级但不完全一样,更不用说这不重要了。

每栋建筑都有经验水平,而这个水平取决于建筑物生产的材料。当我们生产材料时,我们在建筑物的层次之间进行计算。 例如:我们生产2000金,每个建筑都生产金像:

建筑物B级 - 建造A级x生产黄金

备注

始终建筑物B(升级建筑物)具有更高的优先级,因此其:B级 - A x金级

两座建筑物上生产的黄金总是相同的

$building_A = array(4=>2000);
$building_B = array(5=>2000);
  • 建立A级4级 - > 2000金

  • B楼5层 - > 2000金

计算方法是:5 - 4 x 2000 gold = 1 x 2000


变式0.1: 它可能的基层建筑升级到第二层和第二层建筑是同一层次: 阵列:

$buildingA = array(4=>1000, 5=>1000);
$buildingB = array(5=>2000);

建筑А

  • 等级4:1000金
  • 等级5:1000金

B楼:

  • 等级5:2000金

计算:

5 - 4 x 1000 = 1 x 1000

5 - 5 x 1000 = 0 x 1000


变体0.2: 它可能和相反的情况: 阵列:

$buildingA = array(4=>2000);
$buildingB = array(4=>700,5=>1300);

建筑A:

  • 等级4:2000金

B楼:

  • 等级5:700金
  • 等级6:1300金

计算:

5-4 x 700 = 1 x 700

6-4 x 1300 = 1 x 1300

这是变体0.1&的代码。 0.2

http://sandbox.onlinephpfunctions.com/code/ef0adce304554392266b8193b292051c0d98bae8

//v.01
    $buildingA = array(4=>1000, 5=>1000);
    $buildingB = array(5=>2000);
//v.02  
    //$buildingA = array(4=>2000);
    //$buildingB = array(4=>700,5=>1300);

if(sizeof($buildingB) == 1)
{
    foreach($buildingA as $level_a => $gold)
    {
        $level_b = array_keys($buildingB);
        $level_b = $level_b[0];

        $level_diff = $level_b - $level_a;


        $tmp['calc'] = $level_b . ' - ' .$level_a.' = '.$level_diff . ' x ' . $gold;

        $x[] = $tmp;
    }
}
elseif(sizeof($buildingA) == 1) 
{
    foreach($buildingB as $level_b => $gold)
    {

        $level_a = array_keys($buildingA);
        $level_a = $level_a[0];

        $level_diff = $level_b - $level_a;

        $tmp['calc'] = $level_b . ' - ' .$level_a.' = '.$level_diff . ' x ' . $gold;

        $x[] = $tmp;
    }
}

这里的一切都很好,但是当这两座建筑物都增加了它的水平时,它们会变成粪便。我为这个变体制作了几个代码但是它们看起来并且工作得很好。 能有更清醒头脑的人能否给出一些建议,计算差异是多么容易。

V.1

$buildingA = array(4=>500, 5=>1500);
$buildingB = array(4=>1000, 5=>1000);

计算:()

  • 4 - 4 x 500
  • 4 - 5 x 500
  • 5 - 5 x 1000

V.2

$buildingA  = array(4=>1500, 5=>500);
$buildingB = array(4=>1000, 5=>1000);

计算:(B-A)

  • 4 - 4 x 1000
  • 5 - 4 x 500
  • 5 - 5 x 500

V.3

$buildingA = array(4=>1000, 5=>1000);
$buildingB = array(4=>500, 5=>1500);

计算:(B-A)

  • 4 - 4 x 500
  • 5 - 4 x 500
  • 5 - 5 x 1000

V.4

$buildingA = array(4=>1400, 5=>600);
$buildingB = array(5=>700, 6=>1300);

计算:(B-A)

  • 5 - 4 x 700
  • 6 - 4 x 700
  • 6 - 5 x 600

V.5

$buildingA = array(1=>300, 2=>700, 3=>1000);
$buildingB = array(5=>500, 6=>1500);

计算:(B-A)

  • 5 - 1 x 300
  • 5 - 2 x 200
  • 6 - 2 x 500
  • 6 - 3 x 1500

让我们尝试用v.3解释:

$buildingA = array(4=>1000, 5=>1000);
$buildingB = array(4=>500, 5=>1500);

A楼将在4级产生1000金,然后升级,其余为5级

B楼将在4级产生500金,然后升级,剩下的将在5级

所以我们如何计算:

  • “B” - 第4级给出500金币,我们有4 - 4 x 500,直到现在我们使用2000金币
  • “B”现在变为等级5
  • “A”其lv4并需要500多个 黄金到5级,所以我们给5 - 4 x 500(其中5个因为“A”级别上升 在那之前),直到现在我们使用(500 + 500)2000金
  • “A”现在是它的等级5
  • “B”它的等级5和“A”是等级5,所以其他所有的金子都是5 - 5 x 1000,(这里是未使用的黄金的其余部分:1000)

这里我制作了一些测试脚本,但代码看起来不太好,而且它不适用于v.04: http://sandbox.onlinephpfunctions.com/code/6f12fda4877ad781da52f908f3cba79aa0c69f33

我需要计算当两个等级UP时,匹配金将如何产生建筑物。 我没有看到简单的方法来计算这个。有什么建议吗?

我没有想法如何做到这一点。很难解释它好,但我希望它的写作清楚 - 请不要评价我:)

1 个答案:

答案 0 :(得分:0)

一位天才同事为我提供了简单的数学解决方案:

function f ($x1, $x2)
{    
    foreach ($x2 as $k2 => $v2)
    {
        if ($v2 == 0)
            continue;

        foreach ($x1 as $k1 => $v1)
        {
            if ($v2 == 0 || $v1 == 0)
                continue;

            $m = ($v2 >= $v1) ? $v1 : $v2;

            $v2 -= $m;
            $v1 -= $m;

            $x2[$k2] = $v2;
            $x1[$k1] = $v1;

            echo '(' . $k2 . ' - ' . $k1 . ') = ' . ($m) . '<br />';
        }
    }
}

f($buildingA, $buildingB);