用Lua / c++编写轰炸机AI

Writing a bomberman AI with Lua / C++

本文关键字:轰炸机 AI c++ Lua      更新时间:2023-10-16

首先,英语不是我的母语,但我会尽我所能!

我实际上正在为学校的一个项目用c++开发一个炸弹人,我想学习Lua并用它来开发不同的ai。不幸的是,在我的学校似乎没有人知道Lua编程,所以我使用互联网!

我已经看到了Lua的样子,我把它链接到一些c++代码中,以查看传递参数等时的不同行为…

关于"为什么在AI开发中使用Lua很酷",我看到了不同的观点。

我看过很多关于如何在c++中使用它的解释,但我仍然不明白。

例如,承认我有一个对象地图包含轰炸机的地图,和一个对象怪物谁将摧毁一些墙壁在这张地图。我应该把Map传递给Lua代码,允许它改变它的内容吗?或者Lua文件不应该改变c++对象中的任何内容?

我读过关于Luabind的文章,它允许将一些对象从c++传递到Lua,但我不确定这是否是个好主意。

有一些关于Lua和c++的一般性问题:

Lua应该如何意识到c++值和东西的一些变化(如果其他线程正在处理它)?

似乎当你从c++传递一个参数给Lua时,它是重复的,有没有一种方法可以传递指针给Lua,所以它总是可以看到变量的变化?

我认为它能够在游戏开始时启动AI脚本并让它做所有事情,而无需随后使用c++处理它,这真的可能吗?

Lua如何意识到c++值的一些变化?

这是通过所谓的绑定实现的。你用Lua注册你的类以及可以从Lua调用的方法。

例如,你在c++中有一个Monster类,并希望Lua处理它的行为。您可以在Lua中注册一个globan函数,它将被称为getMonsterIDsOnTheMap。该函数将返回一个Lua表,其中包含地图中生成的怪物的id。

接下来,您将注册一个名为getMonster的函数,该函数将向Lua返回一个特定怪物的实例。这是你做绑定的地方,允许你从Lua操纵怪物。比如说,你的Monster类有movedestroyWallgetTilePosition等函数。为了让Lua访问Monster的实例,您需要一个userdata对象。

从c++,你创建一个userdata,存储在userdata指针到你的Monster实例,分配userdata Monster元表。在这个元表中注册movedestroyWall等函数。这些函数通过userdata中存储的指针对Monster实例进行操作。赋值元表之后,您只需将userdata返回给Lua,在那里您可以操作您的怪物。

这实际上也是你第二个问题的答案:

2。似乎当你从c++传递一个参数给Lua时,它是重复的,有没有一种方法可以传递指针给Lua,所以它总是可以看到变量的变化?

3。我认为它能够在游戏开始时启动AI脚本并让它做所有事情,而无需随后使用c++处理它,这真的可能吗?

是的,有可能。你可以用c++编写核心功能(声音,图像等),并让Lua通过绑定函数处理所有内容。当然,这可能不是微不足道的,但这是可能的。

你的问题太宽泛了,我不能再具体了。