【问题标题】:Screeps: calculate build cost of bodyScreeps:计算车身的建造成本
【发布时间】:2023-03-19 20:27:01
【问题描述】:

在玩游戏screeps.com 时,我想计算构建所需机体的成本。请参阅下面的尝试,其中 cfg.body 是 bodypart 数组,例如[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。

成本和零件描述on the Screeps page。

【问题讨论】:

    标签: javascript screeps


    【解决方案1】:

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 在你回答之前我自己找到了答案,我现在也在这里发布了。我在其中使用了您的部分答案并投票支持您,但是我会接受我的答案,因为我发现它更合适。但是感谢您的帮助!
      【解决方案3】:

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

      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 时都使用此循环,您最好对值进行硬编码。但是,如果这样的值不存在或者您需要仔细检查,它可能会很方便。

      【讨论】:

      • 为什么不应该每次都使用这个循环?
      • @Robert 因为它会消耗处理器能力。更好的方法是进行预配置设置并计算一次总体成本并将该值硬编码。
      【解决方案4】:

      一个更像 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来计算成本。感谢您计算出各种费用:)

      【讨论】:

      • 游戏机制的成本发生了变化,更新了我的答案以反映成本的变化。攻击从 100 增加到 80 refer to gamedocs
      • 也更新了我的示例。
      • 游戏机制的成本发生了变化,更新了我的答案以反映成本的变化。 Tough 从 5 到 20 refer to gamedocs。
      • 成本再次发生变化,您可以在 API 中使用 BODYPART_COST 常量代替对象字面量(完全相同,使用当前值)。
      【解决方案5】:

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

      function bodyCost (body) {
          return body.reduce(function (cost, part) {
              return cost + BODYPART_COST[part];
          }, 0);
      }
      

      【讨论】:

        【解决方案6】:

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

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

        箭头方法让它更优雅:

        let cost = _.sum(creep.body.map((b) => BODYPART_COST[b]));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-26
          • 2014-01-06
          • 1970-01-01
          • 2016-06-18
          • 2015-06-29
          • 2017-01-06
          • 1970-01-01
          相关资源
          最近更新 更多