2014-11-24 138 views
9

當玩遊戲screeps.com我想計算建立所需身體的成本。請參閱下面的我的嘗試,其中cfg.body是bodypart陣列,例如[Game.ATTACK, Game.MOVE, Game.WORK, Game.CARRY, Game.MOVE]Screeps:計算身體的建造成本

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

回答

13

也許BODYPART_COST常數爲不可用以前,但你可以這樣做:

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

是的,這現在應該是正確的答案 – Gregzenegair 2017-03-26 10:58:20

+0

@Gregzenegair我改變了接受這一點。 – 2017-04-21 03:08:27

2

我敢肯定,你應該比較字符串在小寫,而不是上面。如果不這樣做,請嘗試使用諸如Game.MOVE,Game.WORK等的東西。

2

我更新了腳本以執行您想要的操作。

在身體部分(在cfg.body VAR正文部分)僅是一個指標

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

我找到了答案我在你回答之前,我現在已經在這裏發佈了。我用了你的答案的一部分,並投票給你,但我會接受我的答案,因爲我覺得它更適合。但感謝您的幫助! – 2014-11-24 15:50:08

4

我已經更新了我的解決方案使用常量@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); 
} 

我也想指出,你不應該使用這個循環,每次你建立一個蠕變,你更好的硬編碼見過價值。但是,如果這樣的值不存在或者您需要仔細檢查,它可能會很方便。

+0

爲什麼每次都不要使用這個循環? – Robert 2015-08-09 00:50:04

+0

@Robert因爲這會花費處理器的力量。更好的方法是做一個預先配置的設置,並計算一次總體成本並硬編碼該值。 – 2015-08-17 10:04:26

7

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

其實,我打算用這個東西我自己creepfactory來計算成本。感謝您找出各種成本:)

+0

遊戲機制中的成本已更改,更新了我的答案以反映成本的變化。攻擊從100增加到80 [參考gamedocs](http://screeps.com/docs/Creep.php) – 2014-12-27 10:03:59

+0

也更新了我的示例。 – Toolmaker 2015-01-02 12:17:51

+1

成本在遊戲機制中發生了變化,更新了我的答案以反映成本的變化。堅韌從5變爲20 [參考gamedocs](http://screeps.com/docs/Creep.php)。 – 2015-01-24 22:49:20

1

使用lodash的總和方法,那就更簡單了:

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

的箭法使其更加優雅:

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