回溯问题 - 无法弄清楚如何执行此操作

时间:2015-11-29 00:40:26

标签: javascript backtracking

我正在尝试创建一个小脚本(对于我正在设计的桌面游戏:P),它接受一个对象,其中包含1-4个英雄攻击伤害的随机对象,以及可能的目标,并计算最佳移动通过计算每个可能的结果,并对结果进行权衡,使英雄在攻击中发挥作用。

这就是我的JavaScript对象的样子:

var usedAttacks = {
    1: {
      attack: 2,
      attackableMonsters: Array(0, 1, 2)
    },
    2: {
     attack: 1,
     attackableMonsters: Array(0,1,3)
    },
    3:{
     attack: 4,
     attackableMonsters: Array(1,2,3)
    }
}

usedAttacks中的键指向正在进行攻击的英雄ids,attack是英雄可以造成的伤害,attackableMonsters数组是一个数组,包含英雄可以攻击的怪物的身份。

我想做的是测试给定方案的每个结果,并在每个测试结束时返回power值,最后选择导致最少的方案power ammount。

Hero 1 -> Monster 0, Hero 2 -> Monster 0, Hero 3 -> Monster 1 = Power 10
Hero 1 -> Monster 0, Hero 2 -> Monster 0, Hero 3 -> Monster 2 = Power 11
Hero 1 -> Monster 0, Hero 2 -> Monster 0, Hero 3 -> Monster 3 = Power 8
Hero 1 -> Monster 0, Hero 2 -> Monster 1, Hero 3 -> Monster 1 = Power 10
...

力量是通过在英雄攻击阶段结束时仍然活着的怪物的攻击力来计算的。

我觉得这个问题必须通过一些基本的回溯来解决,但我无法弄清楚如何在javascript中开始解析它。我不需要一个完整的解决方案,如果有人可以提供一些我可以开始开发自己的解决方案的基本指示,我将非常感激!

1 个答案:

答案 0 :(得分:1)

这样的事情可能是:

我们需要一个包含我们将使用索引访问的所有怪物ID的数组:

var monsters = [ /* all the monster IDs*/ ];

我们用英雄键和怪物值初始化target对象:

var target = {};
var numHeroes = 0;
for ( var i in usedAttacks )
    numHeroes++,
    target[i] = 0; // monsters array index.

并使用第一个解决方案初始化最佳解决方案:

var minPower     = calcPower( target ),
    bestSolution = clone( target ); // store a copy, we don't want the solution changed.

function clone(obj) { return JSON.parse( JSON.stringify(obj) ); }

然后我们迭代所有怪物和英雄的组合:

for ( var k = 1; i < monsters.length * numHeroes; k++) {

我们增加怪物类似于带有进位的增量:

    for ( var i in usedAttacks )                    // iterate hero IDs
        if ( target[i] + 1 >= monsters.length )
            target[i] = 0;                          // wrap around: carry (no break)
        else {
            target[i]++                             // no wrap:
            break;                                  //   abort.
        }

我们将与最佳解决方案进行比较,并可能更新:

    var p = calcPower( target );
    if ( p < minPower ) {
        minPower = p;
        bestSolution = clone( target );
    }
}