2017-04-20 13 views
1

実際に私はそれらの源のない容器を のように見つけたいと思うので、私の貨物車は1つの巨大な貯蔵庫を持つ代わりに のエネルギーをより柔軟に転送できます。これはエラーなしで終了したが、私はそれに次のソースがありませんコンテナID を取得するために管理しカントScreeps - 1(コンテナマイニング)の範囲で容器をフィルターにかける

// find all containers in room 
var containers = creep.room.find(FIND_STRUCTURES, { 
    filter: (s) => s.structureType == STRUCTURE_CONTAINER 
}); 
// find all sources 
var sources = creep.room.find(FIND_SOURCES); 
// if there is no source next to the container 
if (!(sources.length < 0)) { 
} 

(私のコントローラが遠くにあります)。

私は、すべてのコンテナを通過する最も可能性の高いフィルタにそのロジックを含める必要があると思いますか?

私はこの作業を行うにはまだ十分なループ/反復を理解していません。 私は多くのことを試みましたが、今私は無力感を感じます このパズルを理解しようとしています。

答えて

1

私はあなたがそうのような近くの情報源を確認するためにあなたの最初のフィルタを更新することができると思います。

let containers = creep.room.find(FIND_STRUCTURES, { 
     filter: (s) => s.structureType === STRUCTURE_CONTAINER && s.pos.findInRange(FIND_SOURCES, 2).length === 0 
    }); 

(または非常に遠く離れて)私は範囲のために2を使用しますが、あなたのコンテナは常にあなたの源に隣接している場合それを1に変更することができます。

その結果をMemoryに保存すると、CPUを節約できます。あなたはそれをする方法を知りたいなら、私はより多くの情報を与えることができます。

EDIT:キャッシングのために、あなたは(この上で行われ、いくつかのデバッグを必要とするかもしれない - 私はそれを書いたが、それをテストしていない)、このようなルームオブジェクトのプロパティを作成することができます。

Object.defineProperty(Room.prototype, 'nonSourceContainers', { 
    get: function() { 
     if (this === Room.prototype || this === undefined) return undefined; 

     const room = this; 

     // If any containers have been constructed that don't have isNearSource defined, fix that first. 
     let newContainers = room.find(FIND_STRUCTURES, { 
      filter: (s) => s.structureType === STRUCTURE_CONTAINER && s.memory.isNearSource === undefined 
     }); 

     // Found some new containers? 
     if (newContainers.length) { 
      for (let i = 0; i < newContainers.length; ++i) { 
       newContainers[i].memory.isNearSource = newContainers[i].pos.findInRange(FIND_SOURCES, 2).length > 0; 
      } 

      // Set the list of non-source container ids in the room's memory. This lasts forever. 
      room.memory.nonSourceContainerIds = room.find(FIND_STRUCTURES, {filter: {isNearSource: false}}); 

      // Reset the cached set of containers. 
      room._nonSourceContainers = undefined; 
     } 

     // If there is no cached list, create it. Caching will mean the following runs once per tick or less. 
     if (!room._nonSourceContainers) { 
      if (!room.memory.nonSourceContainerIds) { 
       room.memory.nonSourceContainerIds = []; 
      } 

      // Get the containers by their ids. 
      room._nonSourceContainers = room.memory.nonSourceContainerIds.map(id => Game.getObjectById(id)); 
     } 

     return room._nonSourceContainers; 
    }, 
    enumerable: false, 
    configurable: true 
}); 
+0

これは素晴らしいです - 私はメモリを考えていましたが、フィルタを操作していて、メモリを保存するためのdocs.screepsの例を使用するつもりでしたが、それは私が信じているすべてのダミーを実行するでしょうか? (編集:私は終わっていないし、新しい行を開始したい:() – Bergzwerg

+0

申し訳ありません - プログラミングに新しい - これは新しいプロトタイプになるのですか?メモリはまだ関連していますが、基本的なスポーン動作は – Bergzwerg

+0

@Bergzwergこれはあなたがデバッグして修正する必要があるかもしれないので、後で元に戻したいことかもしれません。 *クリーププロトタイプの*メインコードで "必要"となるjsファイルに置くことができます。そうすれば、creep.room.nonSourceContainersのように参照することができます。 – jfren484

関連する問題