标题: DOS版三国志英杰传的研究心得——柒, 让人琢磨不透的搜索算法
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 116
编号 545816
注册 2023-12-25


发表于 2026-9-9 19:19 资料 短消息 只看该作者
DOS版三国志英杰传的研究心得——柒

本来是不打算先开始讲这个章节的(本来这章也是打算系统介绍英杰传中的行动结算系统(道具和策略)),但是上个月看到孝直前辈在他的英杰传移动型AI算法对我的一句回复:

QUOTE:
原帖由 阿尔法孝直 于 2026-8-19 21:23 发表
已经基本上分析完了,近期(估计是这个月底或下个月)会发布比较完整的版本。

于是这段时间就十分期待他出一个全面的分析,这样既可以从他的研究中学到了不少理论方法,也能加固自己的研究,同时如果有疏漏也可以补遗,但是等了不少天还是没等到,于是我想先开个头,就当成是个抛砖引玉。
本章的主要内容“战场地图和路径搜索”,自然是首先讲战场地图,再讲另一部分的路径搜索,但是目前论坛中突然很活跃,那么各位爱好者是否对DOS版英杰传的路径搜索有一定的研究?对英杰传研究水平不同的各色人等都在讨论着极限练级相关话题,通过路径搜索和AI行动有较高的了解,才能做到更好地利用敌军的走位实现更高效率地获得经验,而不是只能实现简单的仿打,对其中不一样的情况进行简单的变通,如果要达成更高的目标,就算是纸上谈兵也得懂得兵法之道吧。

目录
  • 一、战场地图及路径搜索总述(1)
    二、战场地图及路径搜索总述(2)
    三、战场地图及路径搜索总述(3)
    三、战场地图及路径搜索总述(3)


[ 本帖最后由 漫漫苦短 于 2026-10-9 19:19 编辑 ]


顶部
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 116
编号 545816
注册 2023-12-25


发表于 2026-9-9 19:19 资料 短消息 只看该作者
一、战场地图及路径搜索总述(1)

如果还是从战场地图开始讲起,怕是又要过上好久才能讲到重点了,干脆趁现在活跃人数多,直接介绍一下本章的重点。这里就默认各位是懂战场地图和简单路径相关的知识了。这一大节先不放反汇编的代码了,本节论述的相关代码在后续章节都会介绍的。

本节的主要内容还是对孝直前辈的英杰传移动型AI算法的一些补充说明,但是可能大部分的爱好者都不是很理解这篇文章,其实在根据反汇编的代码的加工理解后,其实能更好说明其中的算法。

首先如果想要真正理解DOS版英杰传中的路径搜索的原理,一定要准备好几张二维表格,表格的宽高和战场地图的宽高一样,要理解路径搜索,这些表格需要互相搭配利用起来才能理解,这些表格可以命名,比如说一个表格里记录的全是地图的地形数据,[x][y]对应坐标为 (x, y) 的地图点的地形,这张表格名为地形图。

地形图可以说是路径搜索中最基础的一张表格了,那么从路径搜索在游戏中的实际作用,便可以拓展出以下的表格:

  1. 部队战场代码图,这个表格记录的内容就是部队战场代码,坐标为 (x, y) 的地图点如果有一支部队,[x][y]对应这支部队的战场代码(0-2C),如果没有就是FF。
  2. 路径搜索图,这个表格一开始除了搜索起始点为0,其他点都是FF,而搜索的范围则是从原点开始拓展到搜索函数传入的最大移动力,随着搜索的变化,最终"亮格"会标记为从起始点到该点所需消耗的移动力,而"暗格"依然是FF。
  3. (坐标)行动价值图,这个表格记录的内容就是某只部队的行动价值,[x][y]对应该部队坐标为 (x, y) 的地图点的行动价值。
  4. 反向路径搜索图,这个表格其实在程序中和路径搜索图占用的是同一块内存空间,但还是得单独将其拆出来,主要原因是两者的移动力算法是不一样。

关于(坐标)行动价值图实际上是这些表格中最特殊的,也是其中最难讲诉清楚的,但是游戏中计算行动价值的过程与很多人理解的不一样,正常的想法是部队每搜索到一个路径节点,就计算该坐标的行动价值,最终取其中最大的行动价值的坐标和行动目标,然而实际上行动价值是先将整个表初始化为0,然后再将这个表的某些特殊坐标的[x][y]设为一个行动价值,然后再进行路径搜索,将该坐标的行动价值,加上(坐标)行动价值图中对应节点坐标的数值。

真正的行动价值的公式是

总行动价值 = 坐标价值 + 地形价值 + 行动价值

坐标价值重要吗?不重要,因为大部分情况下都不会对敌军行动产生影响,只需要会计算行动价值,就能理解AI行动的逻辑,而有的情况下又很重要,很多敌军的诡异现象实际上就是因为其中的坐标价值导致出现了难以理解的行动,而且很多看似正常的行动,实际上都是因为坐标价值导致的,又或者说有些敌军明明能有多种行动的可能,但由于坐标价值导致没有出现多种行动的情况。

这节先把这些图与英杰传移动型AI算法中的对应关系简单介绍一下,这样应该有助于理解其中的内容,下节开始在详细分析其中的算法逻辑。

以下内容全部与地形图和部队战场代码图有关:

与路径搜索图有关:

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

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

1、如果存在仇人,则取仇人的坐标为目标坐标(B)。
2、在移动范围内,查找最近敌的战场代码。查找方法为:
        2.1、以(A)为中心,将所有的坐标都标上其消耗的总移动力,移动范围之外的标记-1
        2.2、令x=0~移动力的循环,每次循环,都按逐行扫描的方式检查该坐标的移动力总消耗是否等于x,如果是,就按上右下左的顺序检查该格的周围四格是否有敌人,若有,则结束查找,返回该敌人的战场代码。
        2.3、如果查找不到敌人,则返回-1。

与(坐标)行动价值图有关:

QUOTE:
3、如果最近敌恰好为仇人,那么
        3.1、若(B)没人则(B)的行动价值+30;
        3.2、以(B)为中心,周围4格中属于(A)为中心的移动范围内的格子,行动价值+30(若(B)没人则只+10);
        3.3、以(B)为中心,上2右2下2左2以及斜四格中属于(A)为中心的移动范围的格子,行动价值+10(若(B)没人则不加);

与反向路径搜索图有关:

QUOTE:
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)为止。

与(坐标)行动价值图有关:

QUOTE:
        4.6、若(C)没人则(C)的行动价值+30;
        4.7、以(C)为中心,周围4格中属于(A)为中心的移动范围内的格子,行动价值+30(若(C)没人则只+10);
        4.8、以(C)为中心,上2右2下2左2以及斜四格中属于(A)为中心的移动范围的格子,行动价值+10(若(C)没人则不加);

与路径搜索图有关:

QUOTE:
若AI=1(攻击最近敌)

1、以(A)为中心,如果移动范围+攻击范围内有敌人,则按照AI=3(休息)的方式操作;
2、以(A)为中心,无限移动力,如果移动范围+攻击范围内没有敌人,则本回合不动,也不用策略,否则转第3步;
3、查找最近敌坐标
        3.1、以(A)为中心,将所有的坐标都标上其消耗的总移动力,移动范围之外的标记-1
        3.2、令x=0~移动力的循环,每次循环,都按逐行扫描的方式检查该坐标的移动力总消耗是否等于x,如果是,就按上右下左的顺序检查该格的周围四格是否有敌人,若有,则结束查找,返回该敌人的战场代码。

与反向路径搜索图有关:

QUOTE:
        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)为止。

与(坐标)行动价值图有关:

QUOTE:
        3.9、若(C)没人则(C)的行动价值+30;
        3.10、以(C)为中心,周围4格中属于(A)为中心的移动范围内的格子,行动价值+30(若(C)没人则只+10);
        3.11、以(C)为中心,上2右2下2左2以及斜四格中属于(A)为中心的移动范围的格子,行动价值+10(若(C)没人则不加);

不过我不打算按照这篇文章的以同样的方式介绍AI行动,通过这几张图的交互,希望能更加有效理解路径搜索和AI行动的关系。

孝直前辈有新的英杰传AI算法分析2026版文章了,等后续内容完结再更新他的新内容和我的理解中的交叉部分吧。

[ 本帖最后由 漫漫苦短 于 2026-9-19 19:29 编辑 ]


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

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

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


发表于 2026-9-10 01:06 资料 个人空间 短消息 只看该作者 QQ
本来这几天打算出的,无奈这几天突然冒出一大堆事情导致天天加班,没办法,这两天我先写一个大致的框架吧……
顶部
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 116
编号 545816
注册 2023-12-25


发表于 2026-9-19 19:19 资料 短消息 只看该作者
二、战场地图及路径搜索总述(2)

先感谢一下孝直的回复,你的大纲也让我有了新的理解。

这一节就说一下最近敌的内容。
最近敌这个概念,从字面意思就很好理解也不需要做过多的解释,但是从游戏程序的实际逻辑上来看有必要从两个角度来理解最近敌了,一是为什么找最近敌,二是怎么找最近敌。

首先为什么要找最近敌,哪些类型的AI要找最近敌,从个人的角度理解,是因为AI不愿意做没有意义的事,另外从孝直的新文章的AI算法总流程图大图,也能看出AI算法的一种趋势,就是AI行动的复杂度是会退化的。
后续中中AI行动的复杂度简称为复杂度,根据程序代码是否找到最近敌(找到返回目标部队战场代码,未找到返回FF)设两个条件:

  • 条件一:可以找到移动力大于0且在自身移动力范围可以攻击到敌军的(包括友方部队)位置
  • 条件二:可以找到移动力大于0且在255移动力范围可以攻击到敌军的(包括友方部队)位置


AI=2(原地)是不需要找最近敌的,因为它只能在原地,那么复杂度可以设为0;除此之外,其他类型都是要找最近敌,那么AI=3(休息)判断最近敌的目的就很明显了,就是不希望随便移动自己的位置,如果满足条件一,复杂度可以设为2,反之复杂度可以设为1(最后不动相对于复杂度0),然而不能找最近敌的情况程序代码是有BUG,如果部队被包围(当然不一定要四面包围),理论上确实应该按照复杂度2来判断行动,然而它会做定向攻击,这种情况的复杂度设为-1;然后,AI=0|1|4三种类型在不满足条件一的情况下,还要判断条件二,如果满足条件二,复杂度则是≥3,不满足复杂度为0(如果也出现包围现象复杂度依然是为-1)。

由于是总述,就不对最近敌的更多概念进行多的分析了,接下来看看孝前辈还有没有新的更新了。

[ 本帖最后由 漫漫苦短 于 2026-9-19 19:23 编辑 ]
顶部
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 116
编号 545816
注册 2023-12-25


发表于 2026-9-29 19:19 资料 短消息 只看该作者
三、战场地图及路径搜索总述(3)

注意临界点和攻击点的移动消耗不一定要最小,只要攻击点没有受到移动限制即可,攻击点和临界点都可以是友方部队(记住这句话,不然后续容易闹乌龙或产生误解)。

根据上一节提到的临界点和攻击点,我们就可以根据临界点和攻击点兵种的攻击范围
好那么在掌握临界点和攻击点的理论后,要怎么判断在同一个攻击点的最近敌方位优先顺序,我们来看前辈关于其他两个类型方位的研究,看一下能不能找出相似和有差异的部分。
龙吟的研究,这个对于行动价值相等的目标的优先研究。

QUOTE:
   5.攻击方位的判定
     部队可以攻击若干个方位,如果这些方位上存在行动价值相等的目标,部队按以下方位顺序选择攻击对象(在前者优先):
     第一优先级:上、右、下、左、右上、右下、左下、左上
     第二优先级:
       对于弓兵而言:右2、左2、下2、上2
       对于连弩兵和投石车而言:上2左1、下2左1、上2、下2、上2右1、下2右1、右2上1、左2上1、右2、左2、右2下1、左2下1
     第三优先级:
       右3、左3、下3、上3、右2上2、右2下2、左2下2、左2上2

重阳、周瑜的研究,这个是关于被包围敌军的定向攻击优先研究。

QUOTE:
2、敌人的任何兵种被围后都不可能使用任何策略,而只用攻击。若攻击范围内没有我军,就会什么也不干。被围敌人攻击时不再以最大伤害为原则,改为定向攻击。
下面是定向攻击优先方位图,适用于所有兵种:
00 00 00 05 00 00 00
00 01 20 18 16 04 00
00 13 21 28 24 14 00
07 11 25 @ 27 12 08
00 09 22 26 23 10 00
00 02 19 17 15 03 00
00 00 00 06 00 00 00
2.我来解释一下这幅图吧,中心的@!表示被围住的敌人,旁边除了00的数字表示被围敌军的攻击意向,01表示最愿意攻击的目标,02其次,28表示最不愿意攻击的目标。

众所周知,这两张图的优先顺序,大部分是相反的。那么在最近敌的搜索中是否也有类似的优先级,最近敌的搜索是更接近下图还是上图?

如果原地即可攻击,那么按照龙吟研究的优先顺序确定最近敌。
否则说明必须移动才能攻击到最近敌。在找到地图最上且最左的临界点后,并按照上右下左的顺序确定攻击点,由于临界点与攻击点相邻,那么必然只有四种相对位置。
按照临界点与攻击点的相对位置和兵种的攻击范围来分类。0在攻击点和临界点显然都不可能攻击到,要套用其他的情况,或重新搜索临界点。数值从小到大为识别最近敌的优先度。
以下四向攻击兵种(短兵、輕騎兵、重騎兵、近衛隊、山賊、軍樂隊、妖術師)简称为四向兵,八向攻击兵种(長兵、戰車、惡賊、義賊、猛獸兵團、武術家隊、異民族、運輸隊)简称为八向兵。

四向兵、八向兵、弓兵

            連弩兵           

            發石車           

████

0

0

0

8

0

0

0

8

██

0

3

4

6

0

██

0

10

3

5

9

0

4

9

1

██

8

7

██

0

0

6

11

攻击点

10

5

██攻击点██

7

攻击点

6

3

临界点

2

██

2

临界点

1

██

2

临界点

1

7

██

5

██

4

████
████████████图1-1██████████████████████████图2-1██████████████████████████图3-1████████████
图1-1注:
对于弓兵只有1-8有意义,2、3、7只适用于临界点为原地的情况,9-11在临界点即可攻击。
对于八向兵只有1、4、9有意义,2、3、7、10、11在临界点即可攻击。
对于四向兵只有9-11有意义。

四向兵、八向兵、弓兵

            連弩兵           

            發石車           

████

7

0

0

0

8

██

6

██

8

0

4

9

1

██

*

2

██

*

2

0

6

临界点攻击点

10

5

██

4

临界点攻击点

3

██

3

临界点攻击点

5

3

11

2

██

1

5

██

1

4

0

7

██

7

██

9

0

████

6

0

0

0

████████████图1-2██████████████████████████图2-2██████████████████████████图3-2████████████
图1-2注:
此图成立时,4不能是攻击点,要么适用图1-1。
对于弓兵只有1-8有意义,3、4、6只适用于临界点为原地的情况,9-11在临界点即可攻击。
对于八向兵只有1、2、10有意义,4、7、8、9、11在临界点即可攻击。
对于四向兵只有9-11有意义。

四向兵、八向兵、弓兵

            連弩兵           

            發石車           

████

8

██

*

██

*

4

临界点

1

██

1

临界点

*

██

1

临界点

*

6

11

攻击点

9

5

██攻击点██

5

攻击点

4

3

10

2

██

6

5

██

0

0

7

██

2

3

4

██

0

8

2

3

7

0

████

0

0

0

6

0

0

0

████████████图1-3██████████████████████████图2-3██████████████████████████图3-3████████████
图1-3注:
此图成立时,1、8不能是攻击点,要么适用图1-1图1-2。
对于弓兵只有1-8有意义,1、5、8只适用于临界点为原地的情况,9-11在临界点即可攻击。
对于八向兵只有2、3、10有意义,1、5、8、9、11在临界点即可攻击。
对于四向兵只有9-11有意义。

四向兵、八向兵、弓兵

            連弩兵           

            發石車           

████

0

0

0

5

8

██

5

██

0

7

4

9

1

██

1

*

██

0

1

*

6

11

攻击点临界点

5

██

2

攻击点临界点

*

██

3

攻击点临界点

*

3

10

2

██

3

*

██

0

2

*

7

██

4

██

0

6

████

0

0

0

4

████████████图1-4██████████████████████████图2-4██████████████████████████图3-4████████████
图1-4注:
此图成立时,1、2、5不能是攻击点,要么适用图1-1图1-2图1-3。
对于弓兵只有1-8有意义,1、2、5只适用于临界点为原地的情况,9-11在临界点即可攻击。
对于八向兵只有3、4、11有意义,1、2、5、9、10在临界点即可攻击。
对于四向兵只有9-11有意义。
图2-2图2-3图2-4图3-2图3-3图3-4注:
*不能是攻击点

从这些图可以看到,大部分情况下是按照龙吟研究的攻击方位相似的顺序,只是由于临界点的原因减去了一些位点。

[ 本帖最后由 漫漫苦短 于 2026-9-29 21:59 编辑 ]
顶部
性别:未知-离线 漫漫苦短

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 116
编号 545816
注册 2023-12-25


发表于 2026-10-9 19:19 资料 短消息 只看该作者
、战场地图及路径搜索总述(4)

提起反向搜索,似乎没有人,的确反向搜索出现的场景似乎不多见,在游戏中重要性远远不如路径搜索和行动价值这些概念,但实际上依然是值得研究的一个方向。

其实在平常的手动操纵部队的情况,就会遇到了反向搜索的出现的场景,一般情况下我们设置的游戏移动速度都是5,如果把这个移动速度调慢,就能清晰看到每个人物的移动路线,其实这个就是反向搜索的运用场景之一,那么这个移动路线与反向搜索有什么关系?

假设在这个简易的5*5地图中,中间的点为村庄移动消耗为2,其余点都是平原一类移动消耗为1的点,玩家移动一个可操纵的部队从A点到B点,记为A->B,四个点排列组合总共有12种路径,共有6对互为相反的路径,例如A->B、B->A,那么是不是每一对互为相反的路径,都走的同样路线?
首先对角线2对A->C、C->A、B->D、D->B,如果可以到达的话,正常情况下都是会走直线。
另外4对路径,A->B、B->A都是沿着边缘走,而C->D、D->C则是往中心沿着村庄走,但仔细看这两对,其实它们走的路线方向类似,C->D、D->C由于村庄的移动消耗为2,最小消耗需要绕过去,导致会沿着村庄走,总的来说是先往上/右方向,后往左/下方向。
那如果不是上右下左的搜索顺序,难道这又是什么神奇的搜索顺序?
这时候就得从反向搜索的角度来看,例如B->C这条路径,从C->B的角度来看就很合理,从C->B就是先上后右,而反过来就是先左后下,那么这两对的移动路径的。

[ 本帖最后由 漫漫苦短 于 2026-10-9 19:24 编辑 ]
顶部

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




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

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

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