最近在研究游戏AI,感觉要写一个不傻的AI并没有那么容易,于是开始研究AI到底该怎么写,有没有什么技巧和框架。
发现Web图书:Game AI Pro
刚开始读这一套书,我似乎意识到了把技巧理论化的重要性,我写AI时用瞎搞的逻辑,居然是什么“施密特触发器”“双阈值法滞后”,我决定把这一套书读完。
据说双阈值法滞后是保持AI控制系统干脆利落的关键
例:物体A跟随物体B,物体A与物体B的距离超过5米,A就会靠近B,当A与B的距离缩小到2.5米以下的时候,停止跟随。再次超过5米,又会进入跟随状态。
const float SEPARATION_DISTANCE = 2.5f;
const float APPROACH_DISTANCE = 5.0f;
if (approach_player == false) {
if (distance > APPROACH_DISTANCE)
{
approach_player = true;
//动作函数
}
}
else
{
if (distance < SEPARATION_DISTANCE)
{
approach_player = false;
}
}
注:这段是c语言伪代码,本篇博客中其余脚本均为MATLAB
你一定了解过正态分布,在概率论,统计学等诸多学科都有用到
如果不知道: https://zh.wikipedia.org/wiki/正态分布
我们经常用到伪随机数rand(),它可以产生白噪声,是绝对随机的。但这样的随机往往满足不了我们的需求
比如我们以 vec2(0.5,0.5)为中心,产生100个随机坐标
clear;
x=rand(1,100);
y=rand(1,100);
scatter(x,y);
但是过于随机了,我们想增加落在 vec2(0.5,0.5)周围的概率
clear;
x=zeros(1,100);
y=zeros(1,100);
for i=1:20
x=x+rand(1,100)*0.05;
y=y+rand(1,100)*0.05;
end
scatter(x,y);
我们随机生成40个 0 1
clear;
x=1:1:40;
y=floor(rand(1,40)*2.0);
stairs(x,y);
axis([0 40 -0.5 1.5]);//设置XY轴范围
set(gca,'xtick',x);//设置坐标精度
似乎并没有我们想象的那么随机,现实是会出现很多连续序列。//所以说现实和我们计划的总是不一样
解决办法:根据情况翻转数值,比如连续和重复情况
总之就是设定规则,比如浮点型的差值,规律性,根据情况重新生成,再次判断
筛选高斯随机数的随机范围,可以根据值,标准差,重新生成
注意保持随机算法各自独立
这是当然了
一维柏林噪声在游戏AI中的潜在应用有
角色移动:方向,速度,加速度
动画叠加层:角色的面部表情或注释动作增加噪声影响
精准度:连续的成功或失败,需要保持的势头
注意力:守卫的警惕性、反应时间
行为风格:防御型,进攻型
角色情绪:冷静、愤怒、高兴、沮丧、狂暴、无所事事、专心致志
/////论读书的好处,我甚至想到了,二维柏林FBM+阈值可以用来给大面积植被上MainColor
在有大量角色而且玩家不会仔细观察这个角色时,这种方法尤为有用
limx=[0 10];
dx=1/64;
x=limx(1):dx:limx(2);
numx=diff(limx)+1;
uxmat=rand(1,numx+1)*2-1;
numx_z=diff(limx)/dx+1;
zmat=zeros(1,numx_z);
for j=1:length(x)
ddx=x(j)-floor(x(j));
ux=uxmat(1,floor(x(j))-limx(1)+1);
n0=(ux*ddx);
ddx=x(j)-floor(x(j))-1;
ux=uxmat(1,floor(x(j))-limx(1)+2);
n1=(ux*ddx);
zmat(j)=lerp(n0,n1,x(j)-floor(x(j)));
end
zmat=zmat*2;
plot(x,zmat)
function u=lerp(a,b,t)
tw=6*t.^5-15*t.^4+10*t.^3;
u=(1-tw)*a + tw*b;
end
可控因素:频程的阶数、频程的范围、每阶的放大倍数、差值函数的选择。
此分类的下一篇将会记录AI常用的体系框架及技巧。
只要实习之余我有时间就会尽量填坑。。。
挖坑太多填不上,也请见谅