记得小时候用LOGO语言做过一些让小海龟在屏幕上画图的程序,当时觉得那很简单,也很自然,就几条简单的指令就可以让它画出不可思议的复杂图形来。当时我是不知道在这语言的背后是一个多么复杂的系统,只是用这简单的控制语句就可以画出图形来。
上面说明了一个问题要想很好的操作一个对象就的制定一个很好的通用语言。程序中的程序,也就是说最好应该有个虚拟机来运行智能控制语言。在AI控制层上我们不能去直接写底层代码,那会使问题变得复杂万分,涉及太多的细节,而无法写出漂亮的AI表现。
目标1:建立一个脚本程序用来间接控制对象。
关于AI底层功能的需求,大概分为:环境知识,组队效果,攻击能力,生存本能。
环境知识,是一个AI体应该懂得根据周围的环境获得有用的信息来影响思考。
组队效果,是要在大局上的AI处理,AI体能够根据其他的活动单位影响思考。
攻击能力,是AI体能根据自身的各种能力,攻击,移动,能够做的动作和行为来影响思考。
生存本能,如何达成目标,自己如何失败,必须有目标,才能有意义。
关键问题:我打算从一些关键字来说明我的看法。
环境信息;
目标;
行为;
任务;
思考核心在于目标,有了目标,就会根据环境信息下达任务驱动行为。
// 环境类,包含所有AI需要的信息,可能跟灵活的方法是根本不定义,
// 直接从游戏中取出,放在这里只是说明有这样一个虚构的事物,说明包括一
// 个环境。
class CEnvironment
{
public:
int m_iSomething;
any m_aSomething;
ref m_rSomething;
};
// 游戏中的将要由AI控制的对象
class IObject
{
};
// 游戏中有行为的对象
class IActionObject : public IObject
{
};
// 游戏中要求AI控制的对象
class ITaskRunnerObject : public IActionObject
{
virtual OnReciveAITask( void* pTask )=0;
};
// AI对象,我命名为AIWorker,因为AI我的感觉就像是管理行为的工作者。
interface IAIWorker : public IUnknown
{
virtual HRESULT QueryInterface( IID iid, LPVOID* lpWorker );
}
// AI实际对象,在游戏中有很多个AI对象,他们按照DoScript里的脚本完成
//思考,并下发任务。
class CAIWorker
{
public:
void IntentThinking()
{
//分析环境
//分析目标
//分析任务
// 整个这部分准备提出AI语言,DoScript();
}
void ProcessTask()
{
m_pIntro->OnReciveAITalk(m_TaskList.pop());
}
protected:
LeadupList m_GoalList;
LeadupList m_TaskList;
CEnvironment env;
ITaskRunnerObject *m_pItro;
};