标题: 英杰传移动型AI算法
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-1-5 13:34 资料 个人空间 短消息 只看该作者 QQ
英杰传移动型AI算法

定义:        (A)部队当前的横纵坐标;
        (B)部队的目标坐标;
        (C)部队本回合的目标坐标。

若AI=0(移动)或4(无攻击移动):

1、如果存在仇人,则取仇人的坐标为目标坐标(B)。
2、在移动范围内,查找最近敌的战场代码。查找方法为:
        2.1、以(A)为中心,将所有的坐标都标上其消耗的总移动力,移动范围之外的标记-1
        2.2、令x=0~移动力的循环,每次循环,都按逐行扫描的方式检查该坐标的移动力总消耗是否等于x,如果是,就按上右下左的顺序检查该格的周围四格是否有敌人,若有,则结束查找,返回该敌人的战场代码。
        2.3、如果查找不到敌人,则返回-1。
3、如果最近敌恰好为仇人,那么
        3.1、若(B)没人则(B)的行动价值+30;
        3.2、以(B)为中心,周围4格中属于(A)为中心的移动范围内的格子,行动价值+30(若(B)没人则只+10);
        3.3、以(B)为中心,上2右2下2左2以及斜四格中属于(A)为中心的移动范围的格子,行动价值+10(若(B)没人则不加);
4、如果最近敌不是仇人或没有仇人或之前返回-1,则
        4.1、以(B)作为中心坐标,移动力无限,计算战场上所有坐标的总消耗移动力;
        4.2、如果发现(B)到(A)的路线被封堵(注意是(B)到(A)不是(A)到(B),即以无限的移动力经过一个回合的移动无法到达(A),或者(B)是不可移动地形),则本回合采用AI=1(攻击最近敌)的方式操作,否则转下一步。
        4.3、取(C)=(A);
        4.4、以(C)作为中心坐标,按上右下左的顺序查找周围四格中总消耗移动力最小的格子,并用那个格子取代(C)作为新的(C);
        4.5、重复4.4,直到移动力消耗完毕或者(C)=(B)为止。
        4.6、若(C)没人则(C)的行动价值+30;
        4.7、以(C)为中心,周围4格中属于(A)为中心的移动范围内的格子,行动价值+30(若(C)没人则只+10);
        4.8、以(C)为中心,上2右2下2左2以及斜四格中属于(A)为中心的移动范围的格子,行动价值+10(若(C)没人则不加);


若AI=1(攻击最近敌)

1、以(A)为中心,如果移动范围+攻击范围内有敌人,则按照AI=3(休息)的方式操作;
2、以(A)为中心,无限移动力,如果移动范围+攻击范围内没有敌人,则本回合不动,也不用策略,否则转第3步;
3、查找最近敌坐标
        3.1、以(A)为中心,将所有的坐标都标上其消耗的总移动力,移动范围之外的标记-1
        3.2、令x=0~移动力的循环,每次循环,都按逐行扫描的方式检查该坐标的移动力总消耗是否等于x,如果是,就按上右下左的顺序检查该格的周围四格是否有敌人,若有,则结束查找,返回该敌人的战场代码。
        3.3、(C)取为该敌人的坐标
        3.4、以(B)作为中心坐标,移动力无限,计算战场上所有坐标的总消耗移动力;
        3.5、如果发现(B)到(A)的路线被封堵(即以无限的移动力经过一个回合的移动无法到达(A),或者(B)是不可移动地形),则本回合不动也不使用策略,否则转下一步。
        3.6、取(C)=(A);
        3.7、以(C)作为中心坐标,按上右下左的顺序查找周围四格中总消耗移动力最小的格子,并用那个格子取代(C)作为新的(C);
        3.8、重复3.7,直到移动力消耗完毕或者(C)=(B)为止。
        3.9、若(C)没人则(C)的行动价值+30;
        3.10、以(C)为中心,周围4格中属于(A)为中心的移动范围内的格子,行动价值+30(若(C)没人则只+10);
        3.11、以(C)为中心,上2右2下2左2以及斜四格中属于(A)为中心的移动范围的格子,行动价值+10(若(C)没人则不加);


最后,计算移动范围内各个坐标的行动价值。(AI=4时不计算攻击或策略的行动价值)

[ 本帖最后由 阿尔法孝直 于 2011-3-3 16:16 编辑 ]


顶部
性别:男-离线 muzhi
(木之)

谏议大夫

Rank: 12Rank: 12Rank: 12
组别 翰林学士
级别 前将军
功绩 684
帖子 1733
编号 151018
注册 2007-5-3


发表于 2011-1-5 13:38 资料 文集 短消息 只看该作者
回复 #1 阿尔法孝直 的帖子

好东西!
对实战的影响呢?或者有没有什么以前未能解释的问题得到了解释?

1. “若(B)没人则(B)的行动价值+30”
    (B)不是仇人的坐标吗?还会没人?莫非这部分函数还被定向移动的AI调用?

2. “以(B)作为中心坐标,移动力无限,计算战场上所有坐标的总消耗移动力”
   不同兵种移动力消耗不同,此处是按照关心的位于(A)的单位的兵种对吧

[ 本帖最后由 muzhi 于 2011-1-5 14:22 编辑 ]


顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-1-5 14:51 资料 个人空间 短消息 只看该作者 QQ
回复 #2 muzhi 的帖子

(1)是的,调用同一个函数

(2)是以(A)的兵种为准,这也就解释了
http://xycq.online/forum/thread-12345-1-1.html
1L的问题2。

[ 本帖最后由 阿尔法孝直 于 2021-5-31 01:00 编辑 ]
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-1-5 16:16 资料 个人空间 短消息 只看该作者 QQ
以下是伪代码:



if AI==0 or AI==4 then{
   if 仇人≠255 then
      目标(x,y)=仇人当前(x,y)
   else
      目标(x,y)=部队目标(x,y)

   最近敌代码=search(当前(x,y),8,移动力,(-1,-1))
   if 仇人==最近敌代码 then
      addvalue(目标(x,y))
   else
      addvalue(目标(x,y))

   if search(目标(x,y),2,-1,当前(x,y))-1
      本回合目标坐标(x,y)=searchway(当前(x,y),移动力,目标(x,y))
   else
      goto(label_AI==1)

   search((-1,-1),4,移动力,当前(x,y))
}
else if AI==1 then{
label_AI==1:
   
   最近敌代码=search(当前(x,y),8,移动力,(-1,-1))

   if 最近敌代码=-1 then{
      最近敌代码=search(当前(x,y),8,-1,(-1,-1))
      if 最近敌代码≠-1 then{
         目标(x,y)=最近敌当前(x,y)
         if search(目标(x,y),2,-1,当前(x,y))≠-1
            本回合目标坐标(x,y)=searchway(当前(x,y),移动力,目标(x,y))
         else
            本回合不动,且不用策略
            goto(label_AI==1_end)

      }
      else{
         本回合不动,且不用策略
         goto(label_AI==1_end)
      }
   }
   search(当前(x,y),4,移动力,(-1,-1))

label_AI==1_end:
}



function search(A(x,y),action,移动力,B(x,y)){
   以A(x,y)为中心,计算去(x,y)所消耗的移动力P(x,y)

   for M=0 to 移动力-1{
      for X=0 to 战场高-1{
         for Y=0 to 战场宽-1{
            for T=0~3{
               if (T==0) then N(x,y)=(X,Y-1)
               if (T==1) then N(x,y)=(X+1,Y)
               if (T==2) then N(x,y)=(X,Y+1)
               if (T==3) then N(x,y)=(X-1,Y)
               if P(N(x,y))<=移动力 and P(X,Y)==M then{
                  if (action==2){
                     if N(x,y)==B(x,y) then
                        return 1
                  }
                  if (action==4){
                     计算N(x,y)的行动价值
                  }
                  if (action==8){
                     if N(x,y) 有人 then
                        return 人物代码(N(x,y))
                  }
               }
            }
         }
      }
   }
   return -1
}



function searchway(当前(x,y),移动力,目标(x,y)){
        1、取(C)=当前(x,y);
        2、以(C)作为中心坐标,按上右下左的顺序查找周围四格中总消耗移动力最小的格子,并用那个格子取代(C)作为新的(C);
        3、回到2,直到移动力消耗完毕或者(C)==目标(x,y)为止。

   
   if C(x,y)上有人 then
      addvalue(C(x,y))
   else
      addvalue(C(x,y))
}



function addvalue(A(x,y)){
   if A(x,y)有人 then
   {
      0   0   +10   0   0
      0   +10  +30  +10   0
      +10  +30  0   +30  +10
      0   +10  +30  +10   0
      0   0   +10   0   0
   }
   else
   {
      0   +10   0
      +10  +30  +10
      0   +10   0
   }   
   以上加成对于可以移动到的格子有效,有人或不可移动到的格子则无加成。
}


[ 本帖最后由 阿尔法孝直 于 2014-4-9 21:24 编辑 ]
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-1-6 12:01 资料 个人空间 短消息 只看该作者 QQ
另外发个无聊的东西——伏兵出场位置被占时,出场的实际位置(同样适用于孔明传)

如图,位置0为原先出场的坐标,如果位置n有人或不可移动地形或边界,则向位置n+1搜索,直到找到空位。

出于算法速度考虑,系统只能提供如果60个空位。如果这60个都被占,则系统出错。



[ 本帖最后由 阿尔法孝直 于 2011-1-6 12:03 编辑 ]
顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2011-1-6 12:27 资料 个人空间 短消息 只看该作者
60个空位,我军+友军最大15人,敌军最大30人,如果不考虑不可移动的地形已经足够了。
不知道是否适用于曹操传中。
顶部
性别:未知-离线 edmund_liyc

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 仁勇校尉
功绩 2
帖子 172
编号 332186
注册 2009-7-31


发表于 2011-1-6 15:29 资料 短消息 只看该作者
回复 #5 阿尔法孝直 的帖子

這次序並不符合我當時在徐州2堵程昱出場位置的情況(詳見31樓附圖)

按上圖的序號,以程昱原出現位置為0
那麼李典是17,于禁是32,最上四行超出戰場邊界
我軍人員佔了0,1,16,18,20和27,讓程昱出現在25
但按上圖,還有19,21,22放在前面......
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-1-6 17:19 资料 个人空间 短消息 只看该作者 QQ
回复 #7 edmund_liyc 的帖子

为什么我自己写的测试程序也是出现在25。。。。。。边界问题回头再看看

[ 本帖最后由 阿尔法孝直 于 2011-1-6 17:22 编辑 ]
顶部
性别:未知-离线 edmund_liyc

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 仁勇校尉
功绩 2
帖子 172
编号 332186
注册 2009-7-31


发表于 2011-1-6 22:29 资料 短消息 只看该作者
回复 #8 阿尔法孝直 的帖子

找了自己當時的GB4存檔,有限度測試了分別封堵程昱李典于禁3人位置,各人實際前六個順序(按上圖編號)如下︰

程昱(李典17,于禁32)︰
01
16
25
27
28
29

李典(程昱35,于禁53)︰
18
28
29
31
30
19       

于禁(程昱02,李典08)︰
01
02(程昱01)
03(程昱16)
08(李典18,程昱25)
09(李典28,程昱27)
10(李典28,程昱27)

值得注意的是,18優於28及29只適用於李典,對程昱則不然
孝直兄試試是否得出同樣結果吧
若是的話,那麼相關算法並非如你所述,純粹參照單一優次分佈圖查找部隊可進入位置......
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2011-1-8 03:56 资料 个人空间 短消息 只看该作者 QQ
当0在上边界时,如果
(1)0、14、19、18、25、26为右边界,则将下图中19和18对调
(2)1、13、12、16、17为右边界,则将下图中13和12对调
(3)其他情况:不需要调整

图片附件: 边界3.jpg (2011-1-8 03:57, 28.73 K)




当0距离上边界还有一行时,如下图

图片附件: 边界2.jpg (2011-1-8 03:56, 34.65 K)




当0距离上边界还有两行时,如下图

图片附件: 边界1.jpg (2011-1-8 03:56, 40.47 K)




对于其他情况,直接看5楼即可。貌似右、下、左边界的情况都不需要调整。

[ 本帖最后由 阿尔法孝直 于 2011-1-8 03:59 编辑 ]
顶部
性别:未知-离线 edmund_liyc

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 仁勇校尉
功绩 2
帖子 172
编号 332186
注册 2009-7-31


发表于 2011-1-8 11:32 资料 短消息 只看该作者
回复 #10 阿尔法孝直 的帖子

這就解釋了9樓所列的實際順序,孝直辛苦了!

另個人以為4幅圖合在同一樓較方便查閱,省得翻上翻下......
顶部
性别:未知-离线 fjshnan

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 45
编号 404482
注册 2010-11-23


发表于 2011-1-8 20:09 资料 短消息 只看该作者
英杰传真是“麻雀虽小,五脏俱全”
连出场位置被占时都有多方面的考虑~
这个...我一向推崇的汉堂战棋在这方面却只是重叠位置了事...
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6036
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2012-7-11 22:54 资料 个人空间 短消息 只看该作者 QQ
貌似有用,先顶上来
顶部
性别:未知-离线 ayuayu

Rank: 4
组别 士兵
级别 护军
功绩 4
帖子 430
编号 459087
注册 2012-3-15
来自 Ferxtel


发表于 2012-7-11 23:00 资料 短消息 只看该作者
原來還有這個AI算法的嗎(大驚
之前翻的時候完全沒有注意到這篇,先消化消化.....
顶部
性别:未知-离线 clubjack

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 6
编号 544597
注册 2021-5-11


发表于 2021-5-16 01:52 资料 短消息 只看该作者
回复 #1 阿尔法孝直 的帖子

补充一个关于最近敌判断的说明.

下邳之战, 刘备放吊桥. 此时, 城内左侧许汜和步兵, 右侧骑兵和弓兵均转化为攻击最近敌类型.
(1) 若刘备右侧有人左侧无人, 则左边许汜和右边弓兵都不动.
(2) 若刘备左侧有人右侧无人, 则左边许汜不动, 右边弓兵前进.
(3) 若刘备左右两侧都有人, 则同 (1).

不动的时候, 是把刘备左或右的部队当作了目标, 进而刘备阻挡了目标与当前坐标的通路, 导致不动.

搜索最近敌的过程, 如果处在同一个移动目标上有多个可攻击到的部队, 由于循环不会提前结束, 因此会搜索到最远处的敌人 (坐标顺序可以参考 http://www.xycq.online/forum../viewthread.php?tid=12340). 这就导致从最近敌坐标反向建立到当前坐标通路时, 可能会被异常地形卡住.

回过头解释一下一开始的现象. 刘备右方有部队时, 弓兵移动力最小可打到我方的位置是刘备右方部队上两格, 并且此时会把刘备右方部队作为最近敌. 但该部队被刘备卡住了桥头, 导致弓兵不会前进. 当刘备左或右有人时, 武术家移动力最小坐标为刘备上方, 但找到的最近敌是刘备旁边的部队, 同样被刘备卡住, 从而会原地休息.

一般不会发生这种情况. 因为如果某个坐标的近位置有可攻击敌人 A, 远位置也有可攻击敌人 B, 那么在更小的移动力上, 大概率可以攻击到处于远位置 A, 因此不会阻隔最近敌到当前坐标的通路. 相比于 http://www.xycq.online/forum/thread-12345-1-1.html 帖中提到的最近敌在不可达地形且一步够不到从而不动的情况, 下邳桥头的地形可算非常特殊了.

[ 本帖最后由 clubjack 于 2021-5-16 02:03 编辑 ]
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-1-28 10:51
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.013986 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP