2014-11-24 16 views
9

Wenn ich das Spiel screeps.com spiele, möchte ich die Kosten für den Aufbau des gewünschten Körpers berechnen. Siehe meinen Versuch unten, wobei cfg.body das Bodypart-Array ist, z.B. [Game.ATTACK, Game.MOVE, Game.WORK, Game.CARRY, Game.MOVE]:Screeps: Baukosten des Körpers berechnen

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

Wenn bodypart an die Konsole Druck zeigt es die Indizes (0, 1, 2, 3, ...) und die buildCost bleibt 0.

Die Kosten und die Teile sind on the Screeps page beschrieben.

Antwort

13

Vielleicht ist die BODYPART_COST konstant, bevor nicht verfügbar war, aber mit, dass Sie können dies tun:

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

Ja, das sollte jetzt die richtige Antwort sein – Gregzenegair

+0

@Gregzenegair Ich habe dies akzeptiert akzeptiert. –

2

Ich bin mir ziemlich sicher, dass Sie die Strings in Kleinbuchstaben, nicht oben vergleichen sollten. Wenn das nicht funktioniert, versuchen Sie Dinge wie Game.MOVE, Game.WORK usw. zu verwenden.

2

Ich habe Ihr Skript aktualisiert, um das zu tun, was Sie wollten.

Der Bodypart in for (var part in cfg.body) ist nur ein Index

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

ich die Antwort gefunden meine Selbst bevor du geantwortet hast, was ich jetzt auch hier gepostet habe. Ich habe einen Teil Ihrer Antwort darin verwendet und Sie gewählt, aber ich werde meine Antwort akzeptieren, da ich sie für besser geeignet halte. Aber danke für deine Hilfe! –

4

ich meine Lösung mit der Verwendung von Konstanten wie @Brett tut aktualisiert haben. Allerdings änderte ich die for in Schleife zu einer for Schleife wegen Leistung wie in diesem 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); 
} 

gesehen Ich möchte auch darauf hinweisen, dass Sie nicht diese Schleife jedes Mal verwenden, sollten Sie ein Kriechen bauen, Sie besser hard der Wert. Es kann jedoch nützlich sein, wenn ein solcher Wert nicht vorhanden ist oder Sie dies überprüfen müssen.

+0

Warum sollten Sie diese Schleife nicht jedes Mal verwenden? – Robert

+0

@Robert Weil es Prozessorleistung kosten würde. Ein besserer Weg zu tun ist, wie ein vorkonfiguriertes Setup zu machen und die gesamten Körperkosten einmal zu berechnen und diesen Wert in hardcode zu codieren. –

7

Ein JavaScripty ähnliche Lösung, wodurch die Notwendigkeit für einen Schalter zu beseitigen, könnte wie folgt aussehen:

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

In der Tat, ich werde diese Sache für meine eigenen creepfactory Kosten zu berechnen verwenden. Vielen Dank für die Bezifferung der verschieden Kosten aus :)

+0

Kosten in der Spielmechanik geändert, meine Antwort aktualisiert, um die Änderung der Kosten widerzuspiegeln. Angriff ging von 100 auf 80 [siehe Gamedocs] (http://screeps.com/docs/Creep.php) –

+0

Mein Sample wurde ebenfalls aktualisiert. – Toolmaker

+1

Kosten in der Spielmechanik geändert, aktualisierte meine Antwort, um die Änderung der Kosten widerzuspiegeln. Tough ging von 5 auf 20 [siehe Gamedocs] (http://screeps.com/docs/Creep.php). –

1

lodash der Summe Methode verwenden, ist es noch einfacher:

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

Der Pfeil Methode macht es elegant:

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