0

因此,我正在尝试为 Screeps 游戏编写 AI,其文档可在此处找到。

我正在尝试用 OCaml 编写我的 AI,然后通过Bucklescript 将其编译为 Javascript ,其文档位于此处

Anywho,在 Screeps 的 API 中是 method Game.spawns.SPAWN_NAME.createCreep,它SPAWN_NAME对应于所讨论的“spawn”对象的名称。它接受一个字符串数组,对应于它正在帮助生成的“Creep”的各个身体部位,并给出正确的函数调用(具有足够的能量储备),你的 Creep 将在游戏中生成。

一个示例调用(在 JS 中)将是Game.spawns['Spawn1'].createCreep(["body","move"]);

我已经有了代码,它给了我string arrayOCaml 中的所有衍生品。该代码是:

let spawns : string array = [%bs.raw{|Object.keys(Game.spawns)|}]
let spawnsArray : string array = spawns

假设我有一个名为 的 spawn Spawn1,并且在 OCaml 中我还有一个用于身体成分的字符串数组:

let spawnName : string = "Spawn1" 
let body : string array = [|"body","move|]

然后,我使用如下所示的 for 循环遍历该数组中的每个字符串:

for i=0 to Array.length spawns - 1 do
  // I WANT TO CALL SOMETHING ANALOGOUS TO MY FUNCTION HERE
done

在我的一生中,我无法弄清楚如何格式化 Bucklescript 绑定,以便我可以使用and动态调用该createCreep函数。任何帮助都会很棒。我知道 Bucklescript 文档中简要描述了和方法,但我不知道如何使用它们。body : string arrayspawnName : stringbs.getbs.set

在此先感谢您的帮助。


编辑:

我设法通过在 Javascript 模块中编写自己的“接口”函数来“解决”这个问题,然后我可以通过bs.moduleBucklescript 绑定调用该模块。

IE 我写了一个函数

function spawnCreepHelper(spawnName, body) {
  Game.spawns[spawnName].createCreep(body);
}

然后我可以通过

external spawnCreepHelper : string -> string array -> unit = "" 
[@@bs.module "./supplemental", "Supplement"]

对我来说似乎有点被破解了,所以如果有人有另一种不涉及自己重写他们的 API 的方法,请告诉我。

4

1 回答 1

0

您可能需要bs.get_index属性:

type spawn
type spawns
external spawns : spawns = "" [@@bs.val] [@@bs.scope "Game"]
external getSpawn : spawns -> string -> spawn = "" [@@bs.get_index]
external createCreep : spawn -> string array -> unit = "" [@@bs.send]

let _ =
  let spawn = getSpawn spawns "spawn1" in
  createCreep spawn [|"body"; "move"|]

编译为

var spawn = Game.spawns["spawn1"];

spawn.createCreep(/* array */[
      "body",
      "move"
    ]);

然后,您可以通过提供您自己的外部类型来获取密钥Object.keys

 external keys : spawns -> string array = "" [@@bs.val] [@@bs.scope "Object"]

 let _ =
   spawns |> keys
          |> Js.Array.forEach Js.log

这将编译为

Object.keys(Game.spawns).forEach((function (prim) {
        console.log(prim);
        return /* () */0;
      }));   

或者,您可以键入spawnsaspawn Js.Dict并使用 BuckleScript 已经提供的函数来访问和操作它:https ://bucklescript.github.io/bucklescript/api/Js.Dict.html

于 2017-07-27T18:27:38.780 回答