2014-11-24 11 views
9

Podczas gry screeps.com chcę obliczyć koszt budowy wymaganego ciała. Zobacz moją próbę poniżej, gdzie cfg.body jest tablicą części ciała, np. [Game.ATTACK, Game.MOVE, Game.WORK, Game.CARRY, Game.MOVE]:Screeps: obliczyć koszt budowy ciała

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

Podczas drukowania bodypart do konsoli pokazuje indeksów (0, 1, 2, 3, ...) i buildCost pozostaje 0.

Koszt i części są opisane on the Screeps page.

Odpowiedz

13

Może stała BODYPART_COST nie było wcześniej dostępne, ale że można to zrobić:

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

Tak, teraz powinna to być poprawna odpowiedź – Gregzenegair

+0

@Gregzenegair Zmieniłem zaakceptowane do tego. –

2

Jestem prawie pewny, że powinieneś porównywać ciągi małymi literami, a nie górnymi. W przeciwnym razie spróbuj użyć takich rzeczy jak Game.MOVE, Game.WORK itp.

2

Zaktualizowałem twój skrypt, aby zrobić to, co chciałeś.

bodypart w for (var Bodypart w cfg.body) jest tylko indeks

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

znalazłem odpowiedz na moje siebie, zanim odpowiedziałeś, co również tutaj zamieściłem. Użyłem części twojej odpowiedzi i głosowałem, ale przyjmuję odpowiedź, ponieważ uważam ją za bardziej odpowiednią. Ale dzięki za pomoc! –

4

zaktualizowałem moje rozwiązanie z wykorzystaniem stałych jak @Brett robi. Jednak zmieniłem pętlę for in do for pętli z powodu wydajności, jak widać w tym 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); 
} 

Pragnę również zauważyć, że nie powinno się używać tej pętli za każdym razem budować pełzanie, to lepiej hardcode wartość. Jednak może to być przydatne, gdy taka wartość nie istnieje lub trzeba podwójnie sprawdzić.

+0

Dlaczego nie powinieneś używać tej pętli za każdym razem? – Robert

+0

@Robert Ponieważ kosztowałoby to procesor. Lepszym sposobem na zrobienie tego jest wykonanie wstępnie skonfigurowanej konfiguracji i obliczenie całkowitego kosztu ciała raz, a wartości kodu twardego na wartość. –

7

Bardziej JavaScripty jak rozwiązania, eliminując potrzebę stosowania przełącznika, mógłby wyglądać tak:

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

W rzeczywistości, mam zamiar korzystać z tego coś dla własnej creepfactory obliczyć koszt. Dzięki za zastanawianie się różne koszty :)

+0

Koszt zmieniony w mechanice gry, zaktualizowałem moją odpowiedź, aby odzwierciedlić zmianę kosztów. Atak przeszedł ze 100 do 80 [patrz gamedocs] (http://screeps.com/docs/Creep.php) –

+0

Zaktualizował również moją próbkę. – Toolmaker

+1

Koszt zmieniony w mechanice gry, zaktualizowałem moją odpowiedź, aby odzwierciedlić zmianę kosztów. Tough przeszedł od 5 do 20 [patrz gamedocs] (http://screeps.com/docs/Creep.php). –

1

Stosując metodę sumy lodash jest, to jeszcze łatwiej:

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

Sposób strzałka czyni go bardziej elegancki:

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