铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 1969|回复: 12

[其他] AI设定建议

[复制链接]
发表于 2009-7-2 12:21 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
大致看了pascal的复刻版和游泳的鱼lua的复刻版关于AI的源代码。发现lua复刻版敌人的战斗AI要强大的多。建议mod制作者使用游泳的鱼的AI

[发帖际遇]: zsl2007在丽春院喝酒,发掘了人才韦小宝,增加声望10.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-2 15:14 | 显示全部楼层
lz能说说强大的地方吗?

没有研究过ai部分呢~呵呵~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-2 15:39 | 显示全部楼层
大概看了一下两个版本的AI,基本上是下面这样:
(不一定准确,仅供大家参考)

pascal版AI:
1、随机选择一个敌人
2、向该敌人移动,尽可能近
3、选择威力最强的武功,看攻击范围内是否有敌人,有则攻击
4、若威力最强的武功攻击不到,改为选择距离最远的武功,若能攻击到则攻击
5、实在攻击不到,休息


lua版AI:
1、选择一个武功。选择方式为:根据武功的威力、与武器配合、攻击范围等数值,给每项武功分配一个权重区间,然后产生一个随机数,看落在哪个区间,就选哪个武功。
2、选择移动点。选择方式为:遍历所有能移动到的点,考察在该点用选定的武功能攻击到的人数,选择人数最多的移动点。若人数相同,取移动步数最少的点。若无论怎样移动,都无法攻击到任何人,则选择离敌人最近的点。
3、移动至该点,能攻击到则攻击,不能攻击到则休息。

[ 本帖最后由 小小猪 于 2009-7-2 15:43 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-2 15:52 | 显示全部楼层
大概说一下吧。 游泳的鱼的AI里,敌方选择武功是选择攻击到我方人数最多的,并且抛弃攻击力很低的武功。比如面攻,可能对空格放,只要那个点能打到最多的人。每次选择最近的攻击对手进行攻击。只要在攻击范围内有我方,必然会攻击,不会出现很傻地去追很远的比较弱的人。如果我方人数多,那么考虑面攻的概率增大。不足的地方就是应该考虑我方人员的站位,而不是简单地选择最近的目标。

[发帖际遇]: zsl2007去客栈吃饭,碰到郭靖,郭靖请你吃饭,并赠送银两25.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-2 16:16 | 显示全部楼层
不太明白你说的“应该考虑我方人员的站位”是什么意思。
在无论怎样移动,也无法攻击到敌人的情况下,选择最近的目标并向他移动,我认为是一个合理的选择。你觉得应该怎样“考虑我方人员的站位”呢?

[发帖际遇]: 小小猪去辽东拜祭胡一刀,碰到田归农,被当成胡斐追杀,损失银两24。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-2 16:38 | 显示全部楼层
加上特技效果之后,AI 还要考虑使用特技的时机,很麻烦的
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-2 16:58 | 显示全部楼层
要用了这个AI的话,至少群芳的NPC强度得大调整

[发帖际遇]: mwg06去长白山捉火蟾,送给韦一笑,得感谢费银两13.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-3 09:28 | 显示全部楼层
原帖由 小小猪 于 2009-7-2 16:16 发表
不太明白你说的“应该考虑我方人员的站位”是什么意思。
在无论怎样移动,也无法攻击到敌人的情况下,选择最近的目标并向他移动,我认为是一个合理的选择。你觉得应该怎样“考虑我方人员的站位”呢?

[发帖际遇]:  ...

现在是不管是不是可以攻击到都走最近,但是如果可以攻击到,但是最近的反而不能攻击(比如只有线、十字的情况下,最近的不在一个xy轴上),反而最近的不是最好了吧。

说的应该是这种情况,在群芳谱中这种情况很多,最后不得不尽可能取消线、十字攻击。


还有面攻击可以攻击空地做的很好,现在waxyzwa在做复刻版的ai,虽然做的有点繁杂(速度有很大的下降),不过考虑的还是比较周全的。
[发帖际遇]: 金圭子去辽东拜祭胡一刀,碰到袁紫衣,帮忙转告消息,袁紫衣赠送银两18。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-3 09:49 | 显示全部楼层
  1. function War_AutoMove(wugongnum)              --自动往敌人方向移动
  2.     local pid=WAR.Person[WAR.CurID]["人物编号"];
  3.     local wugongid=JY.Person[pid]["武功"  ..wugongnum];
  4.     local level=math.modf(JY.Person[pid]["武功等级".. wugongnum]/100)+1;

  5.     local wugongtype=JY.Wugong[wugongid]["攻击范围"];
  6.     local scope=JY.Wugong[wugongid]["移动范围" ..level]+JY.Wugong[wugongid]["杀伤范围" ..level]


  7.     local x,y;
  8.         local move=128;

  9.     War_CalMoveStep(WAR.CurID,WAR.Person[WAR.CurID]["移动步数"],0);   --计算移动步数

  10.     local maxenemy=0;
  11.         for i=0,CC.WarWidth-1 do
  12.                 for j=0,CC.WarHeight-1 do
  13.                     local cur_step=Byte.get16(WAR.Map3,(j*CC.WarWidth+i)*2);
  14.                         if cur_step <128 then
  15.                                 local num=War_AutoCalMaxEnemy(i,j,wugongid,level);       --计算这个位置可以攻击到的最多敌人个数
  16.                                 if num>maxenemy then
  17.                                         maxenemy=num
  18.                                         x=i;
  19.                                         y=j;
  20.                     move=cur_step;
  21.                                 elseif num==maxenemy then            --两个位置人数相等,则取移动距离最短
  22.                                     if cur_step < move then
  23.                                                 maxenemy=num
  24.                                                 x=i;
  25.                                                 y=j;
  26.                                                 move=cur_step;
  27.                                         end
  28.                                 end
  29.                         end
  30.                 end
  31.         end

  32.     if maxenemy>0 then
  33.         War_MovePerson(x,y);    --移动到相应的位置
  34.                 return 1;
  35.         else   --任何移动都直接攻击不到敌人,寻找一条可以移动到攻击到敌人位置的路线
  36.             x,y=War_GetCanFightEnemyXY(scope);

  37.             local minDest=math.huge;
  38.         if x==nil then   --无法走到可以攻击敌人的地方,可能敌人被围住,或者被敌人围住。
  39.             local enemyid=War_AutoSelectEnemy()   --选择最近敌人
  40.                 War_CalMoveStep(WAR.CurID,100,0);   --计算移动步数 假设最大100步
  41.             for i=0,CC.WarWidth-1 do
  42.                 for j=0,CC.WarHeight-1 do
  43.                                     local dest=Byte.get16(WAR.Map3,(j*CC.WarWidth+i)*2);
  44.                     if dest <128 then
  45.                         local dx=math.abs(i-WAR.Person[enemyid]["坐标X"])
  46.                         local dy=math.abs(j-WAR.Person[enemyid]["坐标Y"])
  47.                         if minDest>(dx+dy) then        --此时x,y是距离敌人的最短路径,虽然可能被围住
  48.                             minDest=dx+dy;
  49.                             x=i;
  50.                             y=j;
  51.                         elseif minDest==(dx+dy) then
  52.                             if Rnd(2)==0 then
  53.                                 x=i;
  54.                                 y=j;
  55.                             end
  56.                         end
  57.                     end
  58.                 end
  59.             end
  60.                 else
  61.             minDest=0;        --可以走到
  62.                 end

  63.                 if minDest<math.huge then
  64.                     while true do    --从目的位置反着找到可以移动的位置,作为移动的次序
  65.                 local i=Byte.get16(WAR.Map3,(y*CC.WarWidth+x)*2);
  66.                 if i<=WAR.Person[WAR.CurID]["移动步数"] then
  67.                     break;
  68.                 end
  69.                 if Byte.get16(WAR.Map3,(y*CC.WarWidth+x-1)*2)==i-1 then
  70.                     x=x-1;
  71.                 elseif Byte.get16(WAR.Map3,(y*CC.WarWidth+x+1)*2)==i-1 then
  72.                     x=x+1;
  73.                 elseif Byte.get16(WAR.Map3,((y-1)*CC.WarWidth+x)*2)==i-1 then
  74.                     y=y-1;
  75.                 elseif Byte.get16(WAR.Map3,((y+1)*CC.WarWidth+x)*2)==i-1 then
  76.                     y=y+1;
  77.                 end
  78.             end
  79.             War_MovePerson(x,y);    --移动到相应的位置
  80.         end
  81.     end

  82.     return 0;
  83. end
复制代码


先是调用了一个War_CalMoveStep,计算出所有可移动到的点。
接着一个双重循环,遍历所有点,调用War_AutoCalMaxEnemy来判断每个点能攻击到的人数。
然后选择攻击到人数最多的点,并移动。
如果maxenemy>0的条件不满足,也就是攻击不到任何人,才调用War_AutoSelectEnemy() 来寻找最近的敌人。

[发帖际遇]: 小小猪去天宁寺抢夺连城宝藏,抢到有毒的宝藏,损失医药费银两39。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-3 09:55 | 显示全部楼层
小猪你这个是lua的ai?
看语言不像pascal的…………

[发帖际遇]: 金圭子发现石破天准备用银票擦屁股,赶紧送上两卷草纸,换回一张银票,兑换银两30。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-3 09:56 | 显示全部楼层
对啊,说的就是游泳的鱼的lua版
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-3 10:22 | 显示全部楼层
最近倒是有个工作需要用lua,为此稍微看了一下lua的语法结构。
不过那个工作主要要做的还是lua以外的东西(比如一些xml设计的界面之类的……最近在做wdf版的),所以lua基本上还是不懂。

至于语言以外的建模…………ai也就是那回事情,思考一下平时人是怎么想的,把每个模糊的部分分解成非常定性定量的最小步骤,也就是建模,也就是ai了。

[发帖际遇]: 金圭子买通太监进宫旅游,花费银两26.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-4 15:51 | 显示全部楼层
恩。 游戏中的特技比较不实用。。。除非我方人数很少,如果人数多,还是用大面积的好。游泳的鱼作的AI的确已经很强了。

[发帖际遇]: zsl2007用胡萝卜、白萝卜、玉米粒、葱花等材料仿制侠客岛“腊八粥”,获利银两10.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-15 15:40

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表