1
31
你的情况听起来像是Lua的好人选。
另外,正如@elviejo在评论中指出的,lua已经在许多游戏中用作脚本语言。如果没有别的,那么以您描述的方式使用Lua肯定有一些先例。而且,正如@gmonc提到的,您的用户可能已经在另一个游戏中使用了lua。
到目前为止 怎样 要与Lua集成:通常,您的用户只需上传一个Lua脚本文件。为了大大简化,您可以为用户提供可用的功能,例如
TurnLeft
,
TurnRight
,
Go
和
Stop
. 然后,用户会上传一个脚本
然后在服务器端,您可以用
较好的例子这里有一个独立的C文件,它从stdin中获取一个lua脚本,并按照我上面解释的方式运行它。游戏是你会遇到地面,栅栏,或树枝,你必须分别跑,跳,或鸭通过。您可以通过stdin输入一个lua脚本来决定如何反应。源代码有点长,但希望它容易理解(除了需要一段时间才能习惯的LuaAPI)。这是我在过去30分钟里的原创作品,希望它能帮助:
在GCC上使用
几乎每次成功通过的唯一Lua脚本是:
也可以写为
使用好的脚本,您将看到如下输出: Successful duck! Successful run! Successful jump! Successful jump! Successful duck! You passed! 如果用户尝试恶意操作,程序只会提供一个错误: $ echo "Actions = {} function Actions.Ground() os.execute('rm -rf /') end" | ./runner PANIC: unprotected error in call to Lua API (stdin:1: attempt to index global 'os' (a nil value)) 如果移动脚本不正确,用户将看到执行了错误的移动: $ echo "Actions = {} Actions.Ground = Jump; Actions.Fence = Duck; Actions.Branch = Run" | ./runner Wrong move! You failed! |
2
10
为什么不使用javascript或ecmascript?谷歌 V8 这是一种非常好的沙盒方法。我记得这很容易。当然,您必须为它编写一些绑定。 |
3
2
我建议使用dot net有以下几个原因: 玩家可以选择他们在C、Ironpython、VB.NET、Boo等语言中实现他们的解决方案,但你的运行时并不在意——它只是动态地将点网程序集加载到沙盒中。但是这给了你的玩家一个他们自己喜欢的语言选择。这鼓励玩家享受体验,而不是一些玩家决定不参与,因为他们只是不喜欢你选择的单一语言。您的总体框架可能是C,但玩家的代码可以是任何点网语言。 在点网中,沙盒和动态加载是非常成熟的。您可以将播放机程序集加载到以部分信任方式运行的自己的沙盒AppDomain中。您不必重新启动容器进程来加载和卸载这些播放机AppDomain。 鼓励玩家“玩”这个游戏,因为语言(无论他们选择哪种点网语言)不仅对游戏脚本有用,而且可以在行业中获得真正的职业生涯。在“C”中找工作会得到 许多 例如,点击率比“Lua”或“Haskell”要高。因此,游戏不仅有趣,尤其是对年轻玩家来说,实际上是帮助他们学习真正有用的、有市场的技能,这些技能可以在以后为他们赚钱。这是对参加这场比赛的极大鼓励。 执行速度极快。与Lua等其他选择不同的是,这是以出色的性能而闻名的编译代码,即使在实时游戏中也是如此。(例如,请参见Unity3D)。 玩家可以在Mac和Linux上使用MonoDevelopment,也可以从微软免费使用Visual Studio Express,或者可以使用好的ol'记事本和命令行。与其他选择的不同之处在于,如果玩家选择使用成熟、现代的IDE,那么它们是可用的。 对于问题的人工智能部分来说,DSL似乎不是一个好主意,因为对车辆实施人工智能需要玩家进行大量创造性的问题解决。对于DSL,您将它们锁定在您在考虑问题时定义问题的方式中。拥有一个完整平台的智能玩家,比如网络(或者上面提到的其他选择),可能对一些你从未预见到的人工智能问题有着全新的创新解决方案。有了合适的工具,这些玩家可以实施疯狂的学习程序或小型神经网络,或者谁知道如何实现他们的人工智能。但是,如果将它们锁定到一个简化的DSL中,不同玩家的人工智能实现可能没有太多变化(因为他们可用的思想表达集要小得多)。 对于问题的其他部分,比如定义轨迹,DSL可能会很好。不过,我还是倾向于使用像boo这样简单的点网语言,这样您就可以为整个项目拥有一个统一的技术堆栈。 |
4
1
我以前在MMO中做过,你知道,NPC响应脚本使用Python,而它在C++的框架中,说任何NPC相关的动作都会触发框架运行一个Python脚本(当然是一个C Python接口,而不是一个shell调用,比如“Python/Script /Run.Py”)。脚本是可替换的运行时,虽然需要玩家或游戏管理员发出命令进行刷新,但无论如何,游戏服务器程序不需要重新启动。 实际上,我忘记了,对于一个新的脚本运行时来说,“通过发出一个命令进行刷新”是否是必需的……2年前……但是我认为它适合您。 |
5
1
考虑二郎:
|