14

在玩screeps.com游戏时,我想计算构建所需身体的成本。请参阅下面的尝试,cfg.bodybodypart 数组在哪里,例如[Game.ATTACK, Game.MOVE, Game.WORK, Game.CARRY, Game.MOVE]

var buildCost = 0;

for(var bodypart in cfg.body){
  switch(bodypart){
    case "MOVE":
    case "CARRY":
       buildCost+=50;
       break;
    case "WORK":
       buildCost+=20;
       break;
    case "HEAL":
       buildCost+=200;
       break;
    case "TOUGH":
       buildCost+=20;
       break;
    case "ATTACK":
       buildCost+=80;
       break;
    case "RANGED_ATTACK":
       buildCost+=150;
       break;
  }
  console.log(bodypart + " costs " + buildCost);
}

打印bodypart到控制台时,它会显示索引 (0, 1, 2, 3, ...),并且 buildCost 保持为 0。

成本和零件在 Screeps 页面上进行了描述。

4

6 回答 6

24

也许该BODYPART_COST常量以前不可用,但是您可以这样做:

function bodyCost (body) {
    return body.reduce(function (cost, part) {
        return cost + BODYPART_COST[part];
    }, 0);
}
于 2016-12-17T03:06:53.710 回答
7

一个更像 JavaScript 的解决方案,无需切换,可能如下所示:

var _ = require("lodash");
var body = [Game.WORK, Game.CARRY, Game.MOVE, Game.TOUGH];
var bodyCost = {
  "move": 50,
  "carry": 50,
  "work": 20,
  "heal": 200,
  "tough": 20,
  "attack": 80,
  "ranged_attack": 150
};
var cost = 0;
_.forEach(body, function(part) { cost += bodyCost[part]; });
console.log("Cost of construction: " + cost);

其实我打算用这个东西给我自己的creefactory来计算成本。感谢您计算出各种费用:)

于 2014-11-24T20:41:55.003 回答
5

使用 lodash 的 sum 方法,就更简单了:

let cost = _.sum(creep.body.map(function (b) {
               return BODYPART_COST[b];
           }));

箭头方法使它更优雅:

let cost = _.sum(creep.body.map((b) => BODYPART_COST[b]));
于 2017-04-20T20:51:13.827 回答
4

我已经像@Brett那样使用常量更新了我的解决方案。但是,由于在此StackOverflow 问题中看到的性能,我将for in循环更改为循环for

for (var index = 0; index < cfg.body.length; ++index) {
  var bodypart = cfg.body[index];
    switch(bodypart){
      case MOVE:
      case CARRY:
        buildCost += 50;
        break;
      case WORK:
        buildCost += 100;
        break;
      case ATTACK:
        buildCost += 80;
        break;
      case RANGED_ATTACK:
        buildCost += 150;
        break;
      case HEAL:
        buildCost += 250;
        break;
      case TOUGH:
        buildCost += 10;
        break;
      case CLAIM:
        buildCost += 600;
        break;
    }
  console.log(bodypart.toUpperCase()+" costs "+buildCost);
}

我还想指出,您不应该在每次构建cree 时都使用此循环最好对值进行硬编码。但是,如果这样的值不存在或者您需要仔细检查,它可能会很方便。

于 2014-11-24T15:48:36.993 回答
2

我很确定您应该以小写而不是大写来比较字符串。如果做不到这一点,请尝试使用 Game.MOVE、Game.WORK 等。

于 2014-11-24T11:59:45.017 回答
2

我更新了你的脚本来做你想做的事。

for(var bodypart in cfg.body) 中的 bodypart 只是一个索引

var body = [Game.ATTACK,Game.MOVE,Game.WORK,Game.CARRY,Game.MOVE];
var buildCost = 0;
for(var bodypart in body){
    var bodymodule = body[bodypart];
    switch(bodymodule){
        case Game.MOVE:
        case Game.CARRY:
           buildCost+=50;
           break;
        case Game.WORK:
           buildCost+=20;
           break;
        case Game.HEAL:
           buildCost+=200;
           break;
        case Game.TOUGH:
           buildCost+=5;
           break;
        case Game.ATTACK:
           buildCost+=100;
           break;
        case Game.RANGED_ATTACK:
           buildCost+=150;
           break;
    }
}
console.log(body+" costs "+buildCost);
于 2014-11-24T15:07:05.780 回答