2011-1-5 13:34
阿尔法孝直
英杰传移动型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时不计算攻击或策略的行动价值)
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2011-3-3 16:16 编辑 [/i]][/color]
2011-1-5 13:38
muzhi
回复 #1 阿尔法孝直 的帖子
好东西!
对实战的影响呢?或者有没有什么以前未能解释的问题得到了解释?
1. “若(B)没人则(B)的行动价值+30”
(B)不是仇人的坐标吗?还会没人?莫非这部分函数还被定向移动的AI调用?
2. “以(B)作为中心坐标,移动力无限,计算战场上所有坐标的总消耗移动力”
不同兵种移动力消耗不同,此处是按照关心的位于(A)的单位的兵种对吧
[color=Silver][[i] 本帖最后由 muzhi 于 2011-1-5 14:22 编辑 [/i]][/color]
2011-1-5 14:51
阿尔法孝直
回复 #2 muzhi 的帖子
(1)是的,调用同一个函数
(2)是以(A)的兵种为准,这也就解释了
[url]http://xycq.online/forum/thread-12345-1-1.html[/url]
1L的问题2。
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2021-5-31 01:00 编辑 [/i]][/color]
2011-1-5 16:16
阿尔法孝直
[font=宋体]以下是伪代码:[/font]
[font=宋体][/font]
[font=宋体]
if AI==0 or AI==4 then{
if 仇人≠255 then
目标(x,y)=仇人当前(x,y)
else
目标(x,y)=部队目标(x,y)[/font]
[font=宋体] 最近敌代码=search(当前(x,y),8,移动力,(-1,-1))[/font]
[font=宋体] if 仇人==最近敌代码 then
addvalue(目标(x,y))
else
addvalue(目标(x,y))[/font]
[font=宋体] if search(目标(x,y),2,-1,当前(x,y))-1
本回合目标坐标(x,y)=searchway(当前(x,y),移动力,目标(x,y))
else
goto(label_AI==1)[/font]
[font=宋体] search((-1,-1),4,移动力,当前(x,y))
}
else if AI==1 then{
label_AI==1:
最近敌代码=search(当前(x,y),8,移动力,(-1,-1))[/font]
[font=宋体] if 最近敌代码=-1 then{[/font]
[font=宋体] 最近敌代码=search(当前(x,y),8,-1,(-1,-1))[/font]
[font=宋体] if 最近敌代码≠-1 then{[/font]
[font=宋体] 目标(x,y)=最近敌当前(x,y)[/font]
[font=宋体] if search(目标(x,y),2,-1,当前(x,y))≠-1
本回合目标坐标(x,y)=searchway(当前(x,y),移动力,目标(x,y))
else
本回合不动,且不用策略
goto(label_AI==1_end)[/font]
[font=宋体] }
else{
本回合不动,且不用策略
goto(label_AI==1_end)
}
}
search(当前(x,y),4,移动力,(-1,-1))[/font]
[font=宋体]label_AI==1_end:
}[/font]
[font=宋体][/font]
[font=宋体][/font]
[font=宋体]function search(A(x,y),action,移动力,B(x,y)){
以A(x,y)为中心,计算去(x,y)所消耗的移动力P(x,y)[/font]
[font=宋体] 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
}[/font]
[font=宋体][/font]
[font=宋体][/font]
[font=宋体]function searchway(当前(x,y),移动力,目标(x,y)){[/font]
[font=宋体] 1、取(C)=当前(x,y);
2、以(C)作为中心坐标,按上右下左的顺序查找周围四格中总消耗移动力最小的格子,并用那个格子取代(C)作为新的(C);
3、回到2,直到移动力消耗完毕或者(C)==目标(x,y)为止。[/font]
[font=宋体]
if C(x,y)上有人 then
addvalue(C(x,y))
else
addvalue(C(x,y))
}[/font]
[font=宋体][/font]
[font=宋体][/font]
[font=宋体]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
}
以上加成对于可以移动到的格子有效,有人或不可移动到的格子则无加成。
}[/font]
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2014-4-9 21:24 编辑 [/i]][/color]
2011-1-6 12:01
阿尔法孝直
另外发个无聊的东西——伏兵出场位置被占时,出场的实际位置(同样适用于孔明传)
如图,位置0为原先出场的坐标,如果位置n有人或不可移动地形或边界,则向位置n+1搜索,直到找到空位。
出于算法速度考虑,系统只能提供如果60个空位。如果这60个都被占,则系统出错。
[img]http://www.xycq.net/forum/attachments/month_1101/20110106_53546b3834888e479db9jqFg8JmMnVE7.jpg[/img]
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2011-1-6 12:03 编辑 [/i]][/color]
2011-1-6 12:27
godtype
60个空位,我军+友军最大15人,敌军最大30人,如果不考虑不可移动的地形已经足够了。
不知道是否适用于曹操传中。
2011-1-6 15:29
edmund_liyc
回复 #5 阿尔法孝直 的帖子
這次序並不符合我當時在徐州2堵程昱出場位置的情況(詳見31樓附圖)
按上圖的序號,以程昱原出現位置為0
那麼李典是17,于禁是32,最上四行超出戰場邊界
我軍人員佔了0,1,16,18,20和27,讓程昱出現在25
但按上圖,還有19,21,22放在前面......
2011-1-6 17:19
阿尔法孝直
回复 #7 edmund_liyc 的帖子
为什么我自己写的测试程序也是出现在25。。。。。。边界问题回头再看看
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2011-1-6 17:22 编辑 [/i]][/color]
2011-1-6 22:29
edmund_liyc
回复 #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只適用於李典,對程昱則不然
孝直兄試試是否得出同樣結果吧
若是的話,那麼相關算法並非如你所述,純粹參照單一優次分佈圖查找部隊可進入位置......
2011-1-8 03:56
阿尔法孝直
当0在上边界时,如果
(1)0、14、19、18、25、26为右边界,则将下图中19和18对调
(2)1、13、12、16、17为右边界,则将下图中13和12对调
(3)其他情况:不需要调整[attach]104648[/attach]
当0距离上边界还有一行时,如下图[attach]104649[/attach]
当0距离上边界还有两行时,如下图[attach]104650[/attach]
对于其他情况,直接看5楼即可。貌似右、下、左边界的情况都不需要调整。
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2011-1-8 03:59 编辑 [/i]][/color]
2011-1-8 11:32
edmund_liyc
回复 #10 阿尔法孝直 的帖子
這就解釋了9樓所列的實際順序,孝直辛苦了!
另個人以為4幅圖合在同一樓較方便查閱,省得翻上翻下......
2011-1-8 20:09
fjshnan
英杰传真是“麻雀虽小,五脏俱全”
连出场位置被占时都有多方面的考虑~
这个...我一向推崇的汉堂战棋在这方面却只是重叠位置了事...
2012-7-11 22:54
阿尔法孝直
貌似有用,先顶上来
2012-7-11 23:00
ayuayu
原來還有這個AI算法的嗎(大驚
之前翻的時候完全沒有注意到這篇,先消化消化.....
2021-5-16 01:52
clubjack
回复 #1 阿尔法孝直 的帖子
补充一个关于最近敌判断的说明.
下邳之战, 刘备放吊桥. 此时, 城内左侧许汜和步兵, 右侧骑兵和弓兵均转化为攻击最近敌类型.
(1) 若刘备右侧有人左侧无人, 则左边许汜和右边弓兵都不动.
(2) 若刘备左侧有人右侧无人, 则左边许汜不动, 右边弓兵前进.
(3) 若刘备左右两侧都有人, 则同 (1).
不动的时候, 是把刘备左或右的部队当作了目标, 进而刘备阻挡了目标与当前坐标的通路, 导致不动.
搜索非移动+攻击范围内最近敌的过程, (虽然伪代码显示为上右下左), 但根据猜想, 应该会用当前部队的可攻击范围循环. 如果处在同一个移动目标上有多个可攻击到的部队, 因此会搜索到最远处的敌人 (坐标顺序可以参考 [url]https://www.xycq.org.cn/forum/viewthread.php?tid=12340&page=1[/url] 这就导致从最近敌坐标反向建立到当前坐标通路时, 可能会被异常地形卡住.
回过头解释一下一开始的现象. 刘备右方有部队时, 弓兵移动力最小可打到我方的位置是刘备右方部队上两格, 并且此时会把刘备右方部队作为最近敌. 但该部队被刘备卡住了桥头, 导致弓兵不会前进. 当刘备左或右有人时, 武术家移动力最小坐标为刘备上方, 但找到的最近敌是刘备旁边的部队, 同样被刘备卡住, 从而会原地休息.
一般不会发生这种情况. 因为如果某个坐标的近位置有可攻击敌人 A, 远位置也有可攻击敌人 B, 那么在更小的移动力上, 大概率可以攻击到处于远位置 A, 因此不会阻隔最近敌到当前坐标的通路. 相比于 [url]http://www.[url]https://www.xycq.org.cn/forum/viewthread.php?tid=12345&page=1[/url] 帖中提到的最近敌在不可达地形且一步够不到从而不动的情况, 下邳桥头的地形可算非常特殊了.
[color=Silver][[i] 本帖最后由 clubjack 于 2025-2-6 19:39 编辑 [/i]][/color]
2026-8-8 17:14
jkoko
请教一个移动型AI算法及实战走位的实例
把版主15年前的帖子翻出来,想仔细研究一下敌军AI类型转变和行动走位的规律
先把自己学习后的一些初步理解说出来,希望各位大佬能勘误并解释指导
一、第11回合,我军行动完毕后如附件图1所示
此时敌我双方的人员状态为:
我方:关羽 兵力289防御510 敌方:张郃 兵力749攻击705
张飞 兵力575防御382 步兵 兵力201攻击306
简雍 兵力388防御294 高览 兵力679攻击374
藩宫 兵力202防御331 弓兵 兵力420攻击270
敌军行动的顺序和走位如下:
张郃村庄内右攻张飞,伤害529
步兵向下移动2格
高览向上移动1格
弓兵右1上1移动至藩宫右侧
我的理解敌人的走位如下:
1、先看4名敌军与刘备的距离(先无视是否有敌军阻挡影响移动力)
张郃距离4格,步兵距离4格,高览距离5格,弓兵距离6格
2、按照之前函数里分析的,以刘备B点视角,4名敌军均无法通过一次移动进行到身边。敌军先执行移动指令,接着看移动后最近距离时攻击范围内是否有最近敌
张郃距离刘备4格,移动距离中(亮格)除了村庄外就只有步兵所占位置与刘备距离同为4,故停留在村庄内,转而寻找最近敌进行攻击,同时张郃被围后定向攻击得优先方向是左侧张飞>上方关羽
故张郃无视关羽残血可秒杀的情况,定向攻击张飞。
张郃行动完毕后,步兵因为3面被围,要向刘备继续移动,最近的距离是下2左3再上2(不考虑悬崖等无法进入地形),因此向下移动2格,行动后攻击范围无可攻击敌军
步兵行动完毕后,高览上方有空格可移动,故继续向仇人刘备移动,向上移动1格后因3面被围,攻击范围内无可攻击敌军,故停止休息
高览行动完毕后,弓兵要向刘备移动有2条路线:先上2再左3或者先左3再上2,我猜测是根据X轴或者Y轴长短选择先走完短轴再走长轴,因此弓兵右1上1移动到藩宫右侧
那为什么不移动到藩宫右2位置去射击藩宫呢?我理解是先优先向仇敌移动(因为移动型时仇敌身边格子的行动价值高),故不会选择远离目标位置的路线
二、第12回合,我方行动完毕后如附件图2所示,后续友军关纯会移动至刘备左侧,左上攻击张郃
此时敌我双方的人员状态为:
我方:刘备 兵力410防御354 敌方:张郃 兵力749攻击705(混乱)
张飞 兵力575防御382 步兵 兵力201攻击306
简雍 兵力388防御311 高览 兵力679攻击374
藩宫 兵力202防御331 弓兵 兵力420攻击270
关纯 兵力198防御285
敌军行动的顺序和走位如下:
步兵向上移动1格
高览向上移动1格并从右上攻击刘备
弓兵向左移动2格来到刘备右侧并射击关纯
这回合敌军走位相对容易理解
步兵兵力<40%,因此先于高览行动,向刘备行动,向上1格已是最近距离,范围内无可攻击敌军
高览已在刘备身边1格,最近敌亦是仇人,故选择向上移动1格攻击刘备
弓兵先向刘备移动,来到身边后选择攻击范围内最近敌军,此时关纯、简雍、藩宫均是最近敌,但关纯防御力最低,故选择攻击关纯
三、第14回合,我方行动完毕后如附件图2所示
此时敌我双方的人员状态为:
我方:刘备 兵力410防御354 敌方:张郃 兵力749攻击705(混乱)
张飞 兵力575防御382 步兵 兵力201攻击306
简雍 兵力91防御298 高览 兵力151攻击350
藩宫 兵力202防御331
关纯 兵力198防御285
敌军行动的顺序和走位如下:
因高览血量也<40%,按列表先后顺序先行动。高览下1右1下射藩宫
步兵向上移动1格右攻关羽
此时高览和步兵均处于一次行动能抵达刘备身边,故不执行移动性AI算法,转而执行攻击最近敌
这个地方我就不能理解了
1、对高览而言,因为原地即可攻击,如果最近敌是藩宫和简雍,简雍无论是兵力还是防御均低于高览,而且简雍可以一箭秒杀
是因为藩宫位置在左上优先于右2的原因么?然后下1右1移动是因为上2的优先级>左上?
2、对步兵而言,刘备和关羽都是最近敌,那为什么不是左1去攻击刘备而是上1去攻击关羽呢?明明刘备兵力与防御更低,而且关羽还是兵种克制的一方
[color=Silver][[i] 本帖最后由 jkoko 于 2026-8-8 18:29 编辑 [/i]][/color]
页:
[1]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.