铁血丹心

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

[通用] [抛砖引玉]放一些我改过的ai(pascal版)

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

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

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

x
建立在bt大虾的代码之上,实现效果是在看见范围内(角色能移动的范围+可攻击的范围内),对每个点进行价值的判定,选定最有价值的点进行攻击
如果可见范围内没有人,则不会有任何行动,范围外的路径选择,恢复之类的行动请自行编写,或者利用原来bt大虾留下的程序
还有这样的话,仅仅是对攻击方攻击方面进行判定,之后的走位,技能的使用都需要考量,加权方面,是否对除了对伤害,或者对其他的也有加权,抛砖引玉啦,大家有好的想法,代码不要藏啦。。。
构建在原版所有战斗之上,没有很明显的迟钝,延迟
  1. 对了修改了这个函数,加了一句话
  2. procedure CalCanSelect(bnum, mode: integer);
  3. var
  4.   i, i1, i2: integer;
  5. begin
  6.   for i1 := 0 to 63 do
  7.     for i2 := 0 to 63 do
  8.     begin
  9.       Bfield[3, i1, i2] := 0;
  10.      //mode为0表示移动, 这时建筑和有人物(不包括自己)的位置不可选
  11.       if mode = 0 then
  12.       begin
  13.         if Bfield[1, i1, i2] > 0 then Bfield[3, i1, i2] := -1;
  14.         if Bfield[2, i1, i2] >= 0 then Bfield[3, i1, i2] := -1;
  15.         if Bfield[2, i1, i2] = bnum then Bfield[3, i1, i2] := 0;
  16.       end;
  17.       //就是这句,让已经计算过的格子不再计算第2遍
  18.       Bfield[5, i1, i2] := 0;
  19.     end;
  20.   if mode = 0 then
  21.   begin
  22.     SeekPath(Brole[bnum].X, Brole[bnum].Y, Brole[bnum].Step + 2);
  23.     //递归算法的问题, 步数+2参与计算
  24.     for i1 := 0 to 63 do
  25.       for i2 := 0 to 63 do
  26.       begin
  27.         if Bfield[3, i1, i2] > 0 then
  28.            Bfield[3, i1, i2] := 0
  29.         else
  30.           Bfield[3, i1, i2] := 1;
  31.       end;
  32.   end;
  33. end;


  34. 主ai程序
  35. procedure AutoBattle(bnum: integer);
  36. var
  37.   flag, i, p, temp, a, rnum, inum, eneamount, aim, mnum, level, Ax1, Ay1, Ax2, Ay2, i1, i2, step, step1, dis1, dis0, dis2,dis, temptype,i3,i4: integer;
  38.   str: widestring;
  39. begin

  40. //找寻可攻击范围内,攻击价值最高的点,并攻击
  41. //判断是否可以攻击
  42. if (Brole[bnum].Acted = 0) and (rrole[rnum].PhyPower >= 10) then
  43. begin
  44. flag := 0;//移动方式的判断位,以及是否有好的攻击点的判断位
  45. temp := 0;
  46. Ax2 := 0;
  47. Ay2 := 0;
  48. Ax1 := 0;
  49. Ay1 := 0;
  50. Ax := Bx;
  51. Ay := By;
  52. for i := 0 to 9 do
  53.   begin
  54.   mnum := Rrole[rnum].Magic[ i ];
  55.   if mnum > 0 then
  56.    begin
  57.    level := Rrole[rnum].MagLevel[ i ] div 100 + 1;
  58.    if level <= 0 then level := 1;
  59.    if level > 10 then level := 10;
  60.    if (rmagic[mnum].HurtType = 0)  then
  61.     begin
  62.     //判断面/点攻最大伤害的点
  63.     //如果您的角色是个超级人物,或许在这一步遍历会有点卡,我有个建议,就是判断方向,四个象限往一个方向会好一点
  64.     //或者是选定一个大概范围遍历(人多的地方),这个函数我有一些构思,没有着手写,需要的话,m我要好了
  65.     //类似于一个遍历,在他周围一定范围内的人数计下来,再计算范围内最边缘角色的x,y的目标
  66.     //在底下计算价值的时候,就在这个范围计算了
  67.     if (rmagic[mnum].AttAreaType = 3) or (rmagic[mnum].AttAreaType = 0)then
  68.      begin
  69.      dis1 := Brole[bnum].Step;
  70.      CalCanSelect(bnum, 0);
  71.      for i1 := max(Bx-dis1, 0) to min(Bx+dis1, 63) do
  72.      for i2 := max(By-dis1, 0) to min(By+dis1, 63) do
  73.       begin
  74.       if Bfield[3, i1, i2] = 0 then
  75.        begin
  76.         dis0 := rmagic[mnum].MoveDistance[level - 1];
  77.         for i3 := max(i1-dis0, 0) to min(i1+dis0, 63) do
  78.         for i4 := max(i2-dis0, 0) to min(i2+dis0, 63) do
  79.          begin
  80.          Ax := i3;
  81.          Ay := i4;
  82.          dis2 := abs( i1 - i3 )+abs( i2 - i4 );
  83.          if (temp<=AutoManyDamage(bnum, i, i1, i2)) and (AutoManyDamage(bnum, i, i1, i2) <> 0) and (Bfield[5, i3, i4] = 0)  and (dis2 <= dis0)then
  84.           begin
  85.           Ax2 := i1;
  86.           Ay2 := i2;
  87.           Ax1 := i3;
  88.           Ay1 := i4;
  89.           temp:=AutoManyDamage(bnum, i, i1, i2);
  90.           p := i;
  91.           flag := 1;
  92.          end;
  93.          Bfield[5, i3, i4] := 1;
  94.         end;
  95.        end;
  96.       end;
  97.      end
  98.     //十字攻的判断
  99.     else if (rmagic[mnum].AttAreaType = 2) then
  100.      begin
  101.      dis1 := Brole[bnum].Step;
  102.      CalCanSelect(bnum, 0);
  103.      for i1 := max(Bx-dis1, 0) to min(Bx+dis1, 63) do
  104.      for i2 := max(By-dis1, 0) to min(By+dis1, 63) do
  105.       begin
  106.       if Bfield[3, i1, i2] = 0 then
  107.        begin
  108.        Ax := i1;
  109.        Ay := i2;
  110.        if (temp <= AutoManyDamage(bnum, i, i1, i2)) and (AutoManyDamage(bnum, i, i1, i2) <> 0) and (Bfield[5, i1, i2] = 0)then
  111.         begin
  112.         Ax1 := i1;
  113.         Ay1 := i2;
  114.         temp := AutoManyDamage(bnum, i, i1, i2);
  115.         p := i;
  116.         flag := 2;
  117.        end;
  118.        Bfield[5, i1, i2] := 1;
  119.       end;
  120.      end;
  121.     end
  122.     //线攻的判断
  123.     else if (rmagic[mnum].AttAreaType = 1) then
  124.      begin
  125.      dis1 := Brole[bnum].Step;
  126.      CalCanSelect(bnum, 0);
  127.      for i1 := max(Bx-dis1, 0) to min(Bx+dis1, 63) do
  128.      for i2 := max(By-dis1, 0) to min(By+dis1, 63) do
  129.      begin
  130.       if Bfield[3, i1, i2] = 0 then
  131.        begin
  132.        //x+1
  133.        Ax := i1+1;
  134.        Ay := i2;
  135.        if (temp <= AutoManyDamage(bnum, i, i1, i2)) and (AutoManyDamage(bnum, i, i1, i2) <> 0) and (Bfield[5, i1, i2] = 0) then
  136.         begin
  137.         Ax1 := i1;
  138.         Ay1 := i2;
  139.         temp:=AutoManyDamage(bnum, i, i1, i2);
  140.         p := i;
  141.         flag := 3;
  142.        end;
  143.        //x-1
  144.        Ax := i1-1;
  145.        Ay := i2;
  146.        if (temp <= AutoManyDamage(bnum, i, i1, i2)) and (AutoManyDamage(bnum, i, i1, i2) <> 0) and (Bfield[5, i1, i2] = 0) then
  147.         begin
  148.         Ax1 := i1;
  149.         Ay1 := i2;
  150.         temp:=AutoManyDamage(bnum, i, i1, i2);
  151.         p := i;
  152.         flag := 4;
  153.        end;
  154.        //y+1
  155.        Ax := i1;
  156.        Ay := i2+1;
  157.        if (temp <= AutoManyDamage(bnum, i, i1, i2)) and (AutoManyDamage(bnum, i, i1, i2) <> 0) and (Bfield[5, i1, i2] = 0) then
  158.         begin
  159.         Ax1 := i1;
  160.         Ay1 := i2;
  161.         temp:=AutoManyDamage(bnum, i, i1, i2);
  162.         p := i;
  163.         flag := 5;
  164.        end;
  165.        //y-1
  166.        Ax := i1;
  167.        Ay := i2-1;
  168.        if (temp <= AutoManyDamage(bnum, i, i1, i2)) and (AutoManyDamage(bnum, i, i1, i2) <> 0) and (Bfield[5, i1, i2] = 0) then
  169.         begin
  170.         Ax1 := i1;
  171.         Ay1 := i2;
  172.         temp:=AutoManyDamage(bnum, i, i1, i2);
  173.         p := i;
  174.         flag := 6;
  175.        end;
  176.        Bfield[5, i1, i2] := 1;
  177.       end;
  178.      end;
  179.     end
  180.    end;
  181.   end;
  182. end;
  183. //动
  184. if(flag <> 0) then
  185.   begin
  186. //点面攻的移动方式
  187.   if(flag = 1) then
  188.    begin
  189.    Ax := Ax2;
  190.    Ay := Ay2;
  191.    MoveAmination(bnum);
  192.    Ax := Ax1;
  193.    Ay := Ay1;
  194.   end
  195. //十字
  196.   else if(flag = 2) then
  197.    begin
  198.    Ax := Ax1;
  199.    Ay := Ay1;
  200.    MoveAmination(bnum);
  201.    Ax := Bx;
  202.    Ay := By;
  203.   end
  204. //线
  205.   else if (flag >= 3) then
  206.    begin
  207.     Ax := Ax1;
  208.     Ay := Ay1;
  209.     MoveAmination(bnum);
  210.     if(flag = 3) then
  211.      begin
  212.      Ax := Bx + 1;
  213.      Ay := By;
  214.     end
  215.     else if(flag = 4) then
  216.      begin
  217.      Ax := Bx - 1;
  218.      Ay := By;
  219.     end
  220.     else if(flag = 5) then
  221.      begin
  222.      Ax := Bx;
  223.      Ay := By + 1;
  224.     end
  225.     else if(flag = 6) then
  226.      begin
  227.      Ax := Bx;
  228.      Ay := By - 1;
  229.     end;
  230.    end;
  231.   //攻击
  232.   AutoAttack(bnum, p);
  233. end;
  234. end;
  235. end;

  236. 以下是用到的一些函数
  237. //计算周围某个点所造成的总价值,从攻击函数进行改写
  238. function AutoManyDamage(bnum, mnum1, Bx1, By1: integer): integer;
  239. var
  240. i1, i2, step, step1, Ax1, Ay1, dis, rnum, mnum, level: integer;
  241. begin
  242.     rnum := brole[bnum].rnum;
  243.     mnum := Rrole[rnum].Magic[mnum1];
  244.     level := Rrole[rnum].MagLevel[mnum1] div 100 + 1;
  245.     if level > 10 then level := 10;
  246.     if level <= 0 then level := 1;
  247.     result :=0;
  248.     step := rmagic[mnum].MoveDistance[level - 1];
  249.     step1 := 0;
  250.     if rmagic[mnum].AttAreaType = 3 then step1 := rmagic[mnum].AttDistance[level - 1];
  251.     if abs(Ax - Bx1) + abs(Ay - By1) <= step + step1 then
  252.     begin
  253.       if (rmagic[mnum].AttAreaType = 3) then
  254.       begin
  255.         dis := 0;
  256.         Ax1 := Bx1;
  257.         Ay1 := By1;
  258.         for i1 := min(Ax, Bx1) to max(Ax, Bx1) do
  259.           for i2 := min(Ay, By1) to max(Ay, By1) do
  260.           begin
  261.             if (abs(i1 - Ax) <= step1) and (abs(i2 - Ay) <= step1) and (abs(i1 - Bx1) + abs(i2 - By1) <= step + step1) then
  262.             begin
  263.               if dis < abs(i1 - Bx1) + abs(i2 - By1) then
  264.               begin
  265.                 dis := abs(i1 - Bx1) + abs(i2 - By1);
  266.                 Ax1 := i1;
  267.                 Ay1 := i2;
  268.               end;
  269.             end;
  270.           end;
  271.         Ax := Ax1;
  272.         Ay := Ay1;
  273.       end;
  274.       if Rmagic[mnum].AttAreaType <> 3 then
  275.         GetAminationPosition(Rmagic[mnum].AttAreaType, step, Bx1, By1)
  276.       else
  277.         GetAminationPosition(Rmagic[mnum].AttAreaType, step1, Bx1, By1);
  278.       for i1 := 0 to sign(Rrole[rnum].AttTwice) do
  279.        begin
  280.         result :=CalAllDamage(bnum, mnum, level);
  281.       end;
  282.     end;
  283. end;

  284. //计算利用该技能在选中点能造成的总价值,从计算伤害改来
  285. function CalAllDamage(bnum, mnum, level: integer): integer;
  286. var
  287.   i, i1, rnum, temp: integer;
  288. begin
  289.   rnum := brole[bnum].rnum;
  290.   if RRole[rnum].CurrentMP < rmagic[mnum].NeedMP * ((level + 1) div 2) then level := RRole[rnum].CurrentMP div rmagic[mnum].NeedMP * 2;
  291.   if level > 10 then level := 10;
  292.   result :=0;
  293.   for i := 0 to broleamount - 1 do
  294.   begin
  295.     if (Bfield[4, Brole[ i ].X, Brole[ i ].Y] <> 0) and (Brole[bnum].Team <> Brole[ i ].Team) and (Brole[ i ].Dead = 0) then
  296.     begin
  297.       //生命伤害
  298.       if (rmagic[mnum].HurtType = 0) then
  299.           begin
  300.           temp :=0;
  301.           //计算左右
  302.           //注意!!会左右的人会对同一个会杀死的目标,计算双倍加权
  303.           for i1 := 0 to sign(Rrole[rnum].AttTwice) do
  304.            begin
  305.            temp := CalHurtValue(bnum, i, mnum, level)+temp;
  306.           end;
  307.           //看看有没有人会死奖励价值10000
  308.           if (temp > Rrole[Brole[i].rnum].CurrentHP) then
  309.            begin
  310.            result := result + 10000//奖励10000点价值 〉1个人9999的血上限
  311.           end;
  312.           //CalHurtValue(bnum, i, mnum, level),这个函数一般大虾都喜欢把命中判定放在这里判断
  313.           //但是如果在这里判断,我以为,是不是加权太高了,包括上面杀死目标的判定时
  314.           //当然最后的加权肯定是大家自己选择的
  315.           result := result + CalHurtValue(bnum, i, mnum, level);//加权公式,请自行对ai的加权进行判定
  316.       end;
  317. {基于内力的aoe,还没有打算开始在ai中使用,这段还是编者自己做吧
  318.       //内力伤害
  319.       if (rmagic[mnum].HurtType = 1) then
  320.       begin
  321.         hurt := rmagic[mnum].HurtMP[level - 1];
  322.         if hurt > Rrole[Brole[i].rnum].CurrentMP then hurt := Rrole[Brole[i].rnum].CurrentMP;
  323.         Brole[i].ShowNumber := hurt;
  324.         Rrole[Brole[i].rnum].CurrentMP := Rrole[Brole[i].rnum].CurrentMP - hurt;
  325.         //增加己方内力及最大值
  326.         if hurt < rmagic[mnum].AddMP[level - 1] then RRole[rnum].CurrentMP := RRole[rnum].CurrentMP + hurt;
  327.         if hurt >= rmagic[mnum].AddMP[level - 1] then RRole[rnum].CurrentMP := RRole[rnum].CurrentMP + rmagic[mnum].AddMP[level - 1];
  328.         Brole[bnum].ExpGot := Brole[bnum].ExpGot + hurt div 20;
  329.         //RRole[rnum].MaxMP := RRole[rnum].MaxMP + random(hurt div 2);
  330.         //if RRole[rnum].MaxMP > MAX_MP then RRole[rnum].MaxMP := MAX_MP;
  331.         if RRole[rnum].CurrentMP > RRole[rnum].MaxMP then RRole[rnum].CurrentMP := RRole[rnum].MaxMP;
  332.         //中毒
  333.         addpoi := rrole[rnum].AttPoi + rmagic[mnum].Poision * level - rrole[Brole[ i ].rnum].DefPoi;
  334.         if rrole[Brole[ i ].rnum].Poision < 0 then rrole[Brole[ i ].rnum].Poision := 0;
  335.         if addpoi + rrole[Brole[ i ].rnum].Poision > 99 then addpoi := 99 - rrole[Brole[ i ].rnum].Poision;
  336.         if addpoi < 0 then addpoi := 0;
  337.         if rrole[Brole[ i ].rnum].DefPoi >= 99 then addpoi := 0;
  338.         rrole[Brole[ i ].rnum].Poision := rrole[Brole[ i ].rnum].Poision + addpoi;
  339.         end; }
  340.     end;
  341.   end;
  342. end;


  343. //假装设定攻击范围,从设定攻击范围改来
  344. procedure GetAminationPosition(mode, step, Bx1, By1: integer);
  345. var
  346.   i, i1, i2: integer;
  347. begin
  348.   for i1 := 0 to 63 do
  349.     for i2 := 0 to 63 do
  350.     begin
  351.       Bfield[4, i1, i2] := 0;
  352.       //按攻击类型判断是否在范围内
  353.       case mode of
  354.         0:
  355.           begin
  356.             if (i1 = Ax) and (i2 = Ay) then Bfield[4, i1, i2] := 1;
  357.           end;
  358.         3:
  359.           begin
  360.             if (abs(i1 - Ax) <= step) and (abs(i2 - Ay) <= step) then Bfield[4, i1, i2] := 1;
  361.           end;
  362.         1:
  363.           begin
  364.             if ((i1 = Bx1) or (i2 = By1)) and (sign(Ax - Bx1) = sign(i1 - Bx1)) and (abs(i1 - Bx1) <= step) and (sign(Ay - By1) = sign(i2 - By1)) and (abs(i2 - By1) <= step) then
  365.               Bfield[4, i1, i2] := 1;
  366.           end;
  367.         2:
  368.           begin
  369.             if ((i1 = Bx1) and (abs(i2 - By1) <= step)) or ((i2 = By1) and (abs(i1 - Bx1) <= step)) then
  370.               Bfield[4, i1, i2] := 1;
  371.             if ((i1 = Bx1) and (i2 = By1)) then Bfield[4, i1, i2] := 0;
  372.           end;
  373.       end;
  374.     end;
  375. end;

  376. //攻击
  377. procedure AutoAttack(bnum, mnum1: integer);
  378. var
  379. i1, i2, step, step1, Ax1, Ay1,dis,rnum,mnum,level: integer;
  380. begin
  381.     rnum := brole[bnum].rnum;
  382.     mnum := Rrole[rnum].Magic[mnum1];
  383.     level := Rrole[rnum].MagLevel[mnum1] div 100 + 1;
  384.     if level > 10 then level := 10;
  385.     if level <= 0 then level := 1;
  386.     step := rmagic[mnum].MoveDistance[level - 1];
  387.     step1 := 0;
  388.     if rmagic[mnum].AttAreaType = 3 then step1 := rmagic[mnum].AttDistance[level - 1];
  389.     if abs(Ax - Bx) + abs(Ay - By) <= step + step1 then
  390.     begin
  391.       //step := Rmagic[mnum, 28+level-1];
  392.       if (rmagic[mnum].AttAreaType = 3) then
  393.       begin
  394.         //step1 := Rmagic[mnum, 38+level-1];
  395.         dis := 0;
  396.         Ax1 := Bx;
  397.         Ay1 := By;
  398.         for i1 := min(Ax, Bx) to max(Ax, Bx) do
  399.           for i2 := min(Ay, By) to max(Ay, By) do
  400.           begin
  401.             if (abs(i1 - Ax) <= step1) and (abs(i2 - Ay) <= step1) and (abs(i1 - Bx) + abs(i2 - By) <= step + step1) then
  402.             begin
  403.               if dis < abs(i1 - Bx) + abs(i2 - By) then
  404.               begin
  405.                 dis := abs(i1 - Bx) + abs(i2 - By);
  406.                 Ax1 := i1;
  407.                 Ay1 := i2;
  408.               end;
  409.             end;
  410.           end;
  411.         Ax := Ax1;
  412.         Ay := Ay1;
  413.       end;
  414.       if Rmagic[mnum].AttAreaType <> 3 then
  415.         SetAminationPosition(Rmagic[mnum].AttAreaType, step)
  416.       else
  417.         SetAminationPosition(Rmagic[mnum].AttAreaType, step1);

  418.       Brole[bnum].Acted := 1;
  419.       for i1 := 0 to sign(Rrole[rnum].AttTwice) do
  420.       begin
  421.         Rrole[rnum].MagLevel[mnum] := Rrole[rnum].MagLevel[mnum] + random(2) + 1;
  422.         if Rrole[rnum].MagLevel[mnum] > 999 then Rrole[rnum].MagLevel[mnum] := 999;
  423.         if rmagic[mnum].UnKnow[4] > 0 then callevent(rmagic[mnum].UnKnow[4])
  424.         else AttackAction(bnum, mnum, level);
  425.       end;
  426.     end;
  427. end;
复制代码
[发帖际遇]: waxyzwa在老顽童处骗取《养蜂秘法》,翻印成《如何饲养文化型蜜蜂》出版后获利银两28.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-9 21:45 | 显示全部楼层
好厉害!加油!金mod就上ai有点落后了!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-10 00:56 | 显示全部楼层
看在铁血贴的代码实在是一种挑战(行首间隔太小)

有两问:
1,可以直接用不?看你改了calcanselect这个功能,不禁表示怀疑~因为这个功能是用于多方面的,你加的那句话什么意思?没看懂~

2,吃药的部分呢?原本吃药的判断是在攻击之前的,吃药判断为false才选择攻击,你不是砍了吧?

好,先这么多,我滴一下眼药水继续看~~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-10 08:08 | 显示全部楼层
應該可以直接用吧,其實改好了很久了。。。一直沒拿出來罷了,調試有問題可以聯系我
calcanselect里面加的那句話。是為了在后面判斷價值的時候,標記已經計算過的格子。。防止又算一遍
前面有說,吃藥和視野范圍內沒有人的部分,自己寫寫或者用以前bt大俠編的。。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-10 12:31 | 显示全部楼层
我就是没有搞明白,何来的又算一遍呢??????

会出现这样的情况吗?那是什么意思?

如果是选择武功后对每个可视(移动+攻击)格子进行计算和加权,那计算别的武功需要重新计算那是理所当然的吧?(效率低下~10个武功?20个武功?)

除非你使用了随机选择,否则无论如何也不可能重复计算吧?

想不通~~

[发帖际遇]: winson7891借钱给游坦之整容,手术成功,多还你银两15.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-10 12:59 | 显示全部楼层
會啦,因為先選可以移動的地方,再選可攻擊的范圍 ,所以肯定會有重復的點,雖然說很多mod會把距離也作為傷害的考量,但是為了把計算簡化,我把這部分就忽略了。。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-10 13:16 | 显示全部楼层
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-10 23:44 | 显示全部楼层
原帖由 waxyzwa 于 2009-7-10 12:59 发表
會啦,因為先選可以移動的地方,再選可攻擊的范圍 ,所以肯定會有重復的點,雖然說很多mod會把距離也作為傷害的考量,但是為了把計算簡化,我把這部分就忽略了。。。。


那你的算法恐怕有很大的问题~~~~~~~~~~~~~这种重复可能会在移动范围扩大时会跟着扩大

而且每个武功要算一遍~这……

如果要用加权的算法,应该先选武功种类,再跟移动范围结合来计算吧~~

一点建议~~希望你早日作出人性化智能化的AI~

[发帖际遇]: winson7891完成赞美飞天神龙洪安通巨侠的对联一副,得到赏赐银两15。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-11 07:37 | 显示全部楼层
武功種類不是很好確定,只能確定是傷害類的,因為各個mod制作人做的武功很不好說,哪種高,哪種低。不過我跟著算法走了一下,這個重復應該是差不多影響降的很低了,能不能再降,可能還要在研究研究。
或者從注釋上寫的一樣,用判斷大致哪個(方向或范圍)攻擊合適的函數,我覺得這個函數不是很難,所以也沒去寫,或者說暫時不想寫ai這一塊了,所以寫了一段程序,拋磚引玉咯

[发帖际遇]: waxyzwa偷得虚竹身上的美女图卷轴,卖给段誉,得银子银两2。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-11 07:41 | 显示全部楼层
有了,面攻和點攻的這句
for i3 := max(i1-dis0, 0) to min(i1+dis0, 63) do
for i4 := max(i2-dis0, 0) to min(i2+dis0, 63) do
改作
for i3 := max(i1, 0) to min(i1+dis0, 63) do
for i4 := max(i2, 0) to min(i2+dis0, 63) do
應該還是可以達到遍歷,能降低不少運算量的。。。有興趣可以嘗試一下,最近在研究路徑,頭都暈咯,暫時不測試ai了

[发帖际遇]: waxyzwa发现瘫痪在地的殷梨亭,从他身上偷得银两8.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-23 14:19

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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