所以,我正在尝试为游戏Screeps编程AI,其文档被发现here。
我正在尝试在OCaml中编写我的AI,然后我通过 Bucklescript 编译到Javascript,其文档被找到here。
在Screeps的API中的Anywho是方法Game.spawns.SPAWN_NAME.createCreep
,其中SPAWN_NAME
对应于所讨论的'spawn'对象的名称。它接收一个对应于'Creep'的各种身体部位的字符串数组,它有助于产生,并且给出正确的函数调用(具有足够的能量储备),你的Creep将在游戏中产生。
示例调用(在JS中)将是Game.spawns['Spawn1'].createCreep(["body","move"]);
我已经有代码,它给了我OCaml中所有产生的string array
。该代码是:
let spawns : string array = [%bs.raw{|Object.keys(Game.spawns)|}]
let spawnsArray : string array = spawns
假设我有一个名为Spawn1
的spawn,而且我在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绑定,以便我可以使用createCreep
和body : string array
动态调用spawnName : string
函数。任何帮助都会很棒。我知道Bucklescript文档中简要描述了bs.get
和bs.set
方法,但我不知道如何使用它们。
提前感谢您的帮助。
我设法通过在Javascript模块中编写自己的“接口”函数来“解决”这个问题,然后我可以通过bs.module
Bucklescript绑定来调用它。
IE我写了一个函数
function spawnCreepHelper(spawnName, body) {
Game.spawns[spawnName].createCreep(body);
}
然后我可以通过
打电话external spawnCreepHelper : string -> string array -> unit = ""
[@@bs.module "./supplemental", "Supplement"]
似乎有点被黑客攻击我,所以如果有人有另一种接近它的方式,不涉及自己重写他们的API,请告诉我。
答案 0 :(得分: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;
}));
或者,您可以将spawns
键入spawn Js.Dict
并使用BuckleScript提供的功能来访问和操作它:https://bucklescript.github.io/bucklescript/api/Js.Dict.html