2011-04-26 29 views
0

我正在写一个JavaScript应用程序,试图找出在视频游戏中角色的项目构建。大约有25件顶级物品,一次可以携带6件物品。他们有不同的效果,这使我相信,虽然有一个项目本身看起来不太好,但与其他项目结合后可能会变得更加强大。如果有兴趣,我可以详细说明。计算使用6个项目可达到的最高可能伤害〜25

问题:

  1. 我怎样才能获得的6个项目全部不同的独特组合的名单?会有多少种组合?它只是25c6(〜134k)?或者我需要删除重复项? (对不起,我一段时间没有上数学课了。)

  2. 你会如何在Javascript中实现这样的东西?有没有一个数学图书馆可以做到这一点? (具体来说,遍历所有可能的物品组合。)

  3. 蛮力计算所有可能的组合的伤害似乎是可能的,并保存顶级物品组合?如果没有,是否有更好的算法来找到强组合?

这里是我的代码,根据每个人的投入:

function getAllCombinations(n, k, callback) 
{ 
    var iterate = function(remaining, args) 
    { 
     var len = args.length; 
     for (var i = args[len - 1]; i < n; i++) 
     { 
      args.splice(len); 
      args[len - 1] = i; 
      if (remaining) 
      { 
       args.push(i); 
       iterate(remaining - 1, args); 
      } 
      else 
      { 
       callback.apply(null, args);   
      } 
     }   
    } 
    iterate(k - 1, [0]); 
} 

var itemsCount = 25; 
var itemSlots = 6; 
getAllCombinations(itemsCount, itemSlots, function(a, b, c, d, e, f) 
{ 
    // calculateDamage(hero, arguments); 
}); 
+0

所有六个可以是相同的项目? – 2011-04-26 22:46:01

+0

是的,他们有一些其他的怪癖,但我认为这将在其他地方处理。例如,这些物品中,你可能需要至少一件物品来提高你的移动速度,并且一次只有1个攻击修改器可以被激活 – Shawn 2011-04-26 23:01:24

回答

2

1)是的,它仅仅是25选6

2)好吧,如果你只有做一次,你可以用嵌套循环来做到这一点。关键是让每个内部循环不是从零开始,而是从外部计数器开始。

for (int i = 0; i < 25; i++) { 
    for (int j = i; j < 25; j++) { // note j=i not j=0 
     // etc 
     foo(i,j,k,l,m,n); 
    } 
} 

如果你需要泛型值为25和6的泛型解决方案,应该不难写出具有类似效果的递归函数。

3)我认为你唯一的选择是蛮力。这可能需要几分钟时间,但应完成。我认为它会在Chrome中最快并且在IE中无法使用。像“本地搜索技术”等其他选项似乎不会为您工作,因为您的空间不是特别连续。

1
  1. 是的,这是25C6(这实际上是〜177K)

  2. 是重复的,为前。 List all possible combinations of k integers between 1...n (n choose k)How can I iterate throught every possible combination of n playing cards
    如果你知道只会有6个项目,你可以只有6个嵌套for循环(虽然这显然不能很好地扩展)。

  3. 当然,这是可能的 - 177K组合将需要一秒钟的一小部分,以一个典型的PC 上遍历(可能有点长,因为你是使用JavaScript,但不超过一两秒钟)

+0

总会有6件物品最多。那么重复呢?例如a,b,a,a,a,a与b,a,a,a,a,a不应同时被计算。 – Shawn 2011-04-26 23:03:06

1

肖恩,

这听起来像大英博物馆算法给我一份工作......奶酪,当然。我的意思是遍历一个特定节点(整体优先级)的“成本”(或者说“利润”)可能是这个节点和它所有的预先结合的函数的结合,路径。遍历任何特定的节点将比传统的“迷宫”更具计算价值,其中每个节点具有固定的遍历成本(例如像街道的长度),但最大路径长度仅为6节点应该能够快速达到最佳结果(即亚秒)。

为避免出现双重现象,请不要将节点-A添加到已包含节点-A的路径中。

我没有看到为什么你不应该在javascript中实现这个功能,但是我想你必须实现你自己的优先级队列,这对它自己的权利是非常棘手的......好消息是它是一个已发布的数据结构,所以我会从维基百科开始着手解决它,然后谷歌很难看到我是否能够找到“体面”的JavaScript实现......或者说我只是移植Java的实现。

这是一个具有挑战性的小问题。我会很乐意看到你想出了什么,以及其他人在这方面的建议。让我更新willya?

还有一个建议......通常最好是让游戏不做出最佳决策;因为你的对手是一个“纯粹的人”,在一秒之内完全无法计算出“25个大国中的6个”的一个好(更不用说最优)组合,而他们得到最好的偶然组合的概率是25 * 24 * 23 * 22 * 21 * 20 = 127,512,000 ......特别是如果这些“权力”以“秘密”的方式互相利用......即使秘密公布了,它也需要一个“程序员的头脑”去做数学,足以达到“高于平均水平”的结果。你明白我的意思吗?

干杯。基思。

+0

我明白。这个游戏已经存在,它是玩家对玩家,身份证是使用自己对其他玩家的构建:) – Shawn 2011-04-26 23:26:42