Screeps: рассчитать стоимость сборки кузова

При игре в http://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.

Стоимость и запчасти описаны на странице Screeps.

6 ответов

Решение

Может быть BODYPART_COST константа не была доступна раньше, но с этим вы можете сделать это:

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

Более похожее на JavaScripty решение, исключающее необходимость переключения, может выглядеть следующим образом:

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);

На самом деле, я собираюсь использовать эту вещь для своей собственной криптофабрики, чтобы рассчитать стоимость. Спасибо за выяснение различных расходов:)

Используя метод суммы lodash, это еще проще:

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

Метод стрелки делает его более элегантным:

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

Я обновил свое решение с использованием констант, как это делает @Brett. Однако я изменил for in цикл до for цикл из-за производительности, как видно из этого вопроса Stackru

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);
}

Я также хочу отметить, что вы не должны использовать этот цикл каждый раз, когда вы строите крип, вам лучше жестко закодировать значение. Однако это может быть удобно, если такого значения не существует или вам необходимо перепроверить.

Я уверен, что вы должны сравнивать строки в нижнем регистре, а не в верхнем. В противном случае попробуйте использовать такие вещи, как Game.MOVE, Game.WORK и т. Д.

Я обновил ваш скрипт, чтобы делать то, что вы хотели.

Bodypart в for(var bodypart в cfg.body) является только индексом

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);
Другие вопросы по тегам