自从开博以来,每天都会关心一下博客的访问情况,看到一些朋友的订阅或者访问,不胜欣喜,也促使我去写一些更好的博文,来和大家分享和交流,从访问统计来看,有相当一部分是来自于搜索引擎的流量,关键字以“行为树”,或者“Behavior Tree”居首位,我想大家对此可能有些兴趣,加上,这几年反反复复一直在A[……]
月度归档: 2011年7月
浅谈层次化的AI架构
在AI寻路决策中运用势力图(Influence Map)
最近在程序中遇到一个AI决策问题,简要描述和图示如下:
在一张开阔的地图上(几乎没有障碍物),有一些会任意移动的“敌人”,我们要实现一个NPC的AI,使他在做接近目标点的移动决策的时候,能避开这些“敌人”所在的危险区域,而选择相对安全的方向去移动。

这有点类似于一个寻路算法,不过,和一般[……]
代码分享:《关于调试AI的闲话(1)》(续)
在上次博文《关于调试AI的闲话(1)》中,提到一个利用共享内存实现的参数调试模块,我整理了一下代码,现在放出来,给大家参考,
下载地址:
也可用svn通过以下地址来得:
http://tsiu.googlecode.com/svn/branches[……]
关于调试AI的闲话(3)
接第一篇的话题,这次来说说AI bug不可重现的问题。确实,对于AI调试来说,很多bug(或者说行为异常),很难找到一个切实的重现的方法,经常是看到后,加好断点,想刻意再玩一下却很难再玩出来了。所以,如何抓住现场,是在AI调试中的一个很值得去考虑问题。
我们很自然的会想到一个解决方案,那就是“[……]
关于调试AI的闲话(2)
在《关于调试AI的闲话(1)》,我谈到了一个AI参数的编辑/观察器,用来实时的修改和查看参数,重新审视那篇博文的时候,我发现我还有些需要补充的地方。
首先,我遗漏了一点,就是需要把调试后的参数信息保存下来,然后当游戏中的那些导出的变量初始化的时候,需要把那下存下来的值作为初始值赋给相应的变量,[……]
关于调试AI的闲话(1)
项目进行到后期,越来越多是在修复一些AI的错误和调整AI的行为,但不得不承认,AI有时候很难调试,我想主要是有两个原因,一是现在的引擎越来越复杂,改一点点地方,编译都会等很久,时间上效率不高(所以对于AI程序员来说,真的是非常欢迎那种引擎核心和游戏逻辑分开的架构);二是如果出现问题的话,情况不可重现[……]
AI中的懒惰(Lazy)问题(2)
上次提出了关于AI懒惰问题的解决方案(见上一篇),一种称为计时器法,就是通过人为的延时来平滑AI的行为抖动,还有一种称为交叉边界法,通过平滑边际值来解决AI在边际上的行为问题。在讨论的最后,我们看到对于交叉边界法,在结果上看来,稍稍有点不是很符合一开始的对AI的行为定义。
再来看一下这个问题,[……]