设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
查看: 19133|回复: 25

[原创] [DLL系列]AI评估外交局势的基本算法整理

[复制链接]
发表于 2012-11-9 19:13:43 | 显示全部楼层 |阅读模式
为了这几天看DLL的笔记不白费了,赶在sweet大把坑填全之间,贡献一些资料性质的东西。

AI会用一套非常复杂的方法来评估当前的国际局势:要不要开战?要不要求和?给玩家什么脸色看?了解这其中的机制对玩家控制国际外交有着莫大的帮助。Sweet大的帖子里面已经开始涉及到这些内容了。从刚开始填的大坑中已经能够看出,AI做上层的策略判断的时候都会依赖于一些低层的基本判断量。小弟在这里就给sweet大做个垫脚石,从底层开始把AI进行判断依据的量的算法作一些介绍。大家可以在看sweet大的大作的时候参考,也减少一点sweet大的工作量。

目录:
2楼:军事单位的力量(Power),城市的力量(Power)和总军事力量(MilitaryMight)
3楼:和我们相比的军事实力和经济实力 (PlayerMilitaryStrengthComparedToUs & PlayerEconomicStrengthComparedToUs)
4楼:战争损失(WarValueLost)和战争伤害程度(WarDamageLevel)
5楼:战争状态(WarState)和全局战争状态(StateAllWar)
6楼:军事威胁(Threat)
7楼:战争预测(WarProjection)
8楼:和对方的距离(ProximityToPlayer),积极扩张态度(ExpansionAggressivePosture)和积极买地态度(PlotBuyingAggressivePosture)
9楼:纠纷程度(DisputeLevel)
10楼:对其它文明的看法(Opinion)
11楼:战争狂(Warmonger)和扩张狂(RecklessExpander)
12楼:对其它文明的态度(Approach)

[ 本帖最后由 landice 于 2012-11-11 11:33 编辑 ]
 楼主| 发表于 2012-11-9 19:14:14 | 显示全部楼层
军事单位的力量(Power)
这个值代表某个军事单位在AI心目中的力量,是AI所有评估军事实力依据的基础。这个值是一个整数,算法如下:

1.  初值:
    a)    近战单位:战斗力的1.5次方(战斗力2倍力量大致为3倍,战斗力3倍力量大致为5倍)
    b)    远程单位:战斗力的1.45次方
    c)    海军远程单位按照远程单位的算法再除2(海军好不值钱…)
2.  根据移动力加成:乘以移动力的0.3次方(移动力两倍的话增加50%)
3.  自杀武器(导弹这种),力量除2
4.  核武器碉堡了:力量+4000
5.  根据单位自带的晋升加成(只考虑白板自带的晋升,应该也包括UA带的晋升):
    a)    对城市攻击加成:加成对城市攻击加成的百分比除2(比如自带对城市攻击加成20%的晋升的话,增加到原值的110%)
    b)    攻击或防守加成(不包含平地/复杂地形加成):加成攻击或防守加成的百分比除2
    c)    空降:加成25%
    d)    闪击:加成20%
    e)    远程攻击前需要架起:减成20%
    f)     不能攻击的近战单位(匈奴的攻城车):减成25%
    g)    地形攻击或防守加成:加成攻击或防守加成百分比除4
    h)    Feature攻击或防守加成(这个我真猜不出来是啥了,回去翻翻XML):加成攻击或防守加成百分比除4
    i)     对特殊兵种加成(比如长枪的对骑兵加成):加成特殊兵种加成百分比除4
    j)     领土加成(境内加成或境外加成):加成领土加成百分比除4
6.  根据晋升情况进行加成:乘以单位等级的0.3次方(简单来说2级1.2,4级1.5,10级2)
7.  最后再乘以当前残血量的百分比(剩一半血力量减一半)

城市的力量(Power)
城市的力量算法相对就简单许多:城市战斗力的1.5次方(和近战单位的基本力量算法相同)

总军事力量(MilitaryMight)
这个值代表AI评估的对方的总军事力量,在评估整体局势的时候使用。这也是一个整数,算法如下:
1.  计算所有军事单位的力量之和
2.  用当前的现金数量进行加成,即乘以1+sqrt(Gold/100)。简单说500块钱乘1.2,2000块钱乘1.45,8000块钱乘1.9。最高乘2。

[ 本帖最后由 landice 于 2012-11-11 11:32 编辑 ]

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:15:36 | 显示全部楼层
和我们相比的军事实力和经济实力 (PlayerMilitaryStrengthComparedToUs & PlayerEconomicStrengthComparedToUs)

这两个量代表了AI认为对方和自己相比,军事/经济实力如何。这是一个枚举量,有以下几个值
  1. STRENGTH_PATHETIC,非常弱
  2. STRENGTH_WEAK,很弱
  3. STRENGTH_POOR,弱
  4. STRENGTH_AVERAGE,普通
  5. STRENGTH_STRONG,强
  6. STRENGTH_POWERFUL,很强
  7. STRENGTH_IMMENSE,非常强
复制代码
算法:分别计算自己和对方的军事实力/经济实力。
军事实力的算法是30+军事力量,军事力量的算法参考2楼。
经济实力的算法是5+总人口数(这个算法比较奇怪也比较糙,完全不考虑回合金啥的)
根据对方的实力除以自己的实力再乘以100的结果判断:
  • 大于250:非常强
  • 165到250:很强
  • 115到165:强
  • 85到115:普通
  • 60到85:弱
  • 40到60:很弱
  • 40以下:非常弱


[ 本帖最后由 landice 于 2012-11-9 19:49 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:16:01 | 显示全部楼层
战争损失(WarValueLost)和战争伤害程度(WarDamageLevel)

战争损失(WarValueLost)
战争损失用于文明之间互相评估战争对对方的打击程度,是一个整数。比如有A/B/C三家AI,A和B打仗的时候,A/B/C会分别评估A受到B和B受到A的战损。比如C评估的B受到A的战损,下面记为C|A->B
考虑下面的情况:
1.  A拿下B的城市:(CvPlayer::acquireCity)
  a)  A|A->B和B|A->B:增加150+城市的人口数乘100
  b)  C|A->B:增加150+城市的人口数乘120(因为C只能看到B的城市被拿下,而不知道军事单位的损失,所以这里估计的比较多)
2.  A杀掉B的军事单位:A|A->B和B|A->B均增加死掉的军事单位的价值(力量与B当前可建造的最强军事单位力量之间的比值乘100),C|A->B不增加(C看不见A消灭了B的单位)(CvUnit::kill)
如果双方没在战争状态,对双方的战争损失评估均每回合减少当前值的1/20。上面的例子中,当A和B讲和之后,A|A->B和C|A->B均每回合减少1/20(CvDiplomacyAI::DoWarDamageDecay)

战争伤害程度(WarDamageLevel)和其他玩家受到的战争伤害程度(OtherPlayerWarDamageLevel)
这两个量在计算战争损失的基础上得到,用于评估和对方之间的战争对自己造成损失的程度,或者其它玩家之间的战争互相造成损失的程度。这个量有以下几种:
  1. WAR_DAMAGE_LEVEL_NONE,没有
  2. WAR_DAMAGE_LEVEL_MINOR,小的
  3. WAR_DAMAGE_LEVEL_MAJOR,大的
  4. WAR_DAMAGE_LEVEL_SERIOUS,严重的
  5. WAR_DAMAGE_LEVEL_CRIPPLED,残了
复制代码
战争伤害程度的算法如下:
1.  计算和对方之间的战争损失
2.  计算自己的全部价值,包括城市的价值和单位的价值两部分。城市的价值是全部城市的人口乘100。单位的价值是全部军事单位的价值(力量和当前可建造的最强军事单位力量之间的比值乘100)之和。
3.  计算伤害程度因子为战争损失/(战争损失+全部价值),根据这个因子判断
  a)  高于67:残了
  b)  50到67:严重的
  c)  25到50:大的
  d)  10到25:小的
  e)  10以下:没有

玩家之间的战争伤害程度算法与上面类似,略有不同。比如C评价A对B的战争伤害程度的算法如下:
1.  计算C看到的A对B的战争损失(C|A->B)
2.  计算B的全部价值。这里只包括城市的价值,即全部城市的人口乘100。
3.  计算伤害程度因子为战争损失/(战争损失+全部价值),根据这个因子判断
  a)  高于50:残了
  b)  35到50:严重的
  c)  20到35:大的
  d)  10到20:小的
  e)  10以下:没有

[ 本帖最后由 landice 于 2012-11-10 10:10 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:16:45 | 显示全部楼层
战争状态(WarState)
战争状态用来评估当前和对手的战争进度,有下面几个值:
  1. WAR_STATE_NEARLY_DEFEATED,接近失败
  2. WAR_STATE_DEFENSIVE,守势
  3. WAR_STATE_STALEMATE,互角
  4. WAR_STATE_CALM,平静
  5. WAR_STATE_OFFENSIVE,攻势
  6. WAR_STATE_NEARLY_WON,接近胜利
复制代码
算法如下:
1.  分别评估我方和敌方的军事力量,分为在我方前线的在敌方前线的两部分,即包括
  a)  我方在我方前线的总军力(记为A)
  b)  我方在敌方前线的总军力(记为B)
  c)  敌方在我方前线的总军力(记为C)
  d)  敌方在敌方前线的总军力(记为D)
  总军力的评估包括全部军事单位的军力和全部城市的军力之和,具体来说
  a)  军事单位的军力:全部军事单位的力量之和
  b)  城市的军力:城市的力量乘以当前血量百分比,这个当然只加到我方前线的军力上
  注意这里面全部城市都是算进去的,所以多城在这里有十分显著的效果
2.  计算分别在我方前线和敌方前线,我方军力所占总兵力的比例,即
  a)  我方前线我方军力比例:M = A / (A+C)
  b)  敌方前线我方军力比例:N = B / (B+D)
3.  如果M小于25%并且N大于75%,即我方的军力大都在我方领土上并保持优势,战争状态为平静的。其它的情况,计算M和N的均值K = (M+N)/2,根据这个值判断:
  a)  大于75%,接近胜利
  b)  在57%到75%之间,攻势
  c)  在42%到57%之间,互角
  d)  在25%到42%之间,守势
  e)  小于25%,接近失败
4.  最后再对一些特殊情况做一点调整
  a)  如果战争状态为平静,并且对方很弱(目标价值高于有利的),将战争状态调整为攻势。因为这可能只是因为我们还没打过去。
  b)  如果战争状态为守势,并且我们的军力高于敌人的全部军力(包括我方前线和敌方前线两部分之和),将战争状态调整为互角。因为这可能只是因为在我们大举进攻的时候敌人的主力到了我们的地盘。

全局战争状态(StateAllWar)
这个值代表当前己方全局的一个战争状态,有下面几个值
  1. STATE_ALL_WARS_NEUTRAL,普通
  2. STATE_ALL_WARS_WINNING,胜利
  3. STATE_ALL_WARS_LOSING,失败
复制代码
这个值根据所有的战争状态统计得出:
1.  如果在战争状态为守势的时候首都受到攻击,或者有任何一场战争状态为接近失败,全局战争状态为失败
2.  其它的情况,根据所有的战争状态统计分数,接近胜利+2,攻势+1,守势-1。最终的分数大于0为胜利,小于0为失败,等于0为普通

[ 本帖最后由 landice 于 2012-11-9 20:16 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:17:03 | 显示全部楼层
军事威胁(Threat)

军事威胁是AI用来评估其它玩家对自己在军事上潜在的威胁的量,主要受到对方和自己的军事力量对比,以及当前和对方战争的状况等因素影响。这个值有如下几个取值:
  1. THREAT_NONE,没有
  2. THREAT_MINOR,小的
  3. THREAT_MAJOR,大的
  4. THREAT_SEVERE,严重的
  5. THREAT_CRITICAL,致命的
复制代码
算法如下:
1.  分别计算自己的军事实力和对方的军事实力。自己的军事实力是自己的军事力量再加上自己的全部城市力量之和的33%。对方的军事实力就是对方的军事力量。
    军事力量的算法见2楼
2.  计算威胁因子的初值为军力比,即对方军事实力与己方军事实力的比值再乘100
3.  如果和对方正处在战争之中,根据战争状态(WarState)修正威胁因子:
  a)  接近胜利:-100
  b)  攻势:-40
  c)  互角:+30
  d)  守势:+80
  e)  接近失败:+150
    战争状态的算法见5楼
4.  根据和对方的距离(ProximityToPlayer)修正威胁因子:
  a)  邻居:+100
  b)  近:+40
  c)  远:-40
  d)  很远:-100
    距离的算法见8楼
5.  根据对方已经攻击和征服了的文明数目修正威胁因子:
  a)  每攻击过一个城邦+20
  b)  每征服过一个城邦+10
  c)  每攻击过一个文明+40
  d)  每征服过一个文明+20
    征服和攻击的修正是累加的。就是说如果对一个文明宣战并征服之后,其它AI对你的威胁修正+60
6.  如果对方正在和其它的文明开战,威胁因子修正-30乘以对方同时进行的战争数目(处在战争之中的文明威胁要小)
7.  最后根据威胁因子得到威胁状态
  a)  大于300:致命的
  b)  220到300:严重的
  c)  170到220:大的
  d)  100到170:小的
  e)  小于100:没有

[ 本帖最后由 landice 于 2012-11-10 10:24 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:17:18 | 显示全部楼层
战争预测(WarProjection)

战争预测是AI用来预测当前如果和和对手开战的话,战争的结果。有这样几个值:
  1. WAR_PROJECTION_DESTRUCTION,毁灭性的
  2. WAR_PROJECTION_DEFEAT,失败
  3. WAR_PROJECTION_STALEMATE,互角
  4. WAR_PROJECTION_UNKNOWN,未知
  5. WAR_PROJECTION_GOOD,好
  6. WAR_PROJECTION_VERY_GOOD,很好
复制代码
评价的标准是战争分数(WarScore)。算法:
0.  初值为0
1.  如果对方是扩张狂,加25
2.  根据对方和我们相比的军事实力(PlayerMilitaryStrengthComparedToUs)修正:
  a)  非常弱:+100
  b)  很弱:+60
  c)  弱:+25
  d)  强:-25
  e)  很强:-60
  f)  非常强:-100
    和我们相比的军事实力的算法见3楼
3.  根据对方和我们相比的经济实力(PlayerEconomicStrengthComparedToUs)修正:
  a)  非常弱:+50
  b)  很弱:+30
  c)  弱:+12
  d)  强:-12
  e)  很强:-30
  f)  非常强:-50
    和我们相比的经济实力的算法见3楼
4.  根据对方对我们的战争伤害程度(WarDamageLevel)修正:
  a)  小的:-10
  b)  大的:-20
  c)  严重的:-30
  d)  残了:-40
    战争伤害程度的算法见4楼
5.  根据我们对对方的战争伤害程度修正:
  a)  小的:+5
  b)  大的:+10
  c)  严重的:+15
  d)  残了:+20
6.  根据战争已经持续的回合数修正,减去持续的回合数除3(最高20)
最后根据这个战争分数判断结果(越低战争结果越悲观):
1.  大于100:很好
2.  25到100:好
3.  0到25:未知
4.  -25到0:互角
5.  -100到-25:失败
6.  小于-100:毁灭性的

[ 本帖最后由 landice 于 2012-11-10 10:36 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:18:09 | 显示全部楼层
和对方的距离(ProximityToPlayer)

AI用这个值评估对方距离自己有多远,有下面几个值:
  1. PLAYER_PROXIMITY_DISTANT,很远
  2. PLAYER_PROXIMITY_FAR,远
  3. PLAYER_PROXIMITY_CLOSE,近
  4. PLAYER_PROXIMITY_NEIGHBORS,邻居
复制代码
算法简单来说就是计算自己和对方相邻最近的两个城的距离。小于等于7为邻居,7到11之间为近。远和很远的算法有点复杂,懒得看了,估计大家也不很关心。
特殊情况的修正:如果两家首都不在同一个大陆上,距离增加一级。如果只剩两家,那么距离至少是近,只剩四家以内,距离至少是远

积极扩张态度(ExpansionAggressivePosture)和积极买地态度(PlotBuyingAggressivePosture)

AI用这两个值来评估自己看来对方铺城或者买地侵犯自己权益的程度,均有下面几个值:
  1. AGGRESSIVE_POSTURE_NONE,没有
  2. AGGRESSIVE_POSTURE_LOW,低
  3. AGGRESSIVE_POSTURE_MEDIUM,中等
  4. AGGRESSIVE_POSTURE_HIGH,高
  5. AGGRESSIVE_POSTURE_INCREDIBLE,很高
复制代码
积极扩张态度主要考察对方的所有城市与己方首都和对方首都之间距离的关系:
1.  首先考察对方城市距离己方首都的距离:
  a)  小于等于3:高
  b)  3到5之间:中等
  c)  5到9之间:低
2.  如果这个城市距离己方首都比对方首都近,那么至少是中等
3.  在态度已经达到中等或以上的情况下,如果城市与己方首都的距离比双方首都的距离还小(飞城到己方首都后方的情况),立即定义为很高
4.  如果对方有一个以上的城市达到了当前的最高态度,最终态度再提高一级(比如有两个城市评估下来都是高,最终的态度为很高)

积极买地态度考察对方买下自己拥有的地块(自己任意城市周围三格以内的地块)的个数:
1.  大于等于10块:很高
2.  7到10块:高
3.  4到7块:中等
4.  2到4块:低
5.  小于2块:没有

[ 本帖最后由 landice 于 2012-11-10 20:43 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:18:44 | 显示全部楼层
纠纷程度(DisputeLevel)

AI共会评估对方和自己之间的领土纠纷(LandDisputeLevel),奇迹纠纷(WonderDisputeLevel)和城邦纠纷(MinorCivDisputeLevel)三种纠纷程度,这三个量的取值均有下面几种:
  1. DISPUTE_LEVEL_NONE,没有
  2. DISPUTE_LEVEL_WEAK,弱
  3. DISPUTE_LEVEL_STRONG,强
  4. DISPUTE_LEVEL_FIERCE,尖锐
复制代码
领土纠纷(LandDisputeLevel)
AI用这个量评估对方和自己总体上的领土发生纠纷的程度,判断的依据是领土纠纷因子,这个值的算法是:
0.  初值为0
1.  根据对方的积极扩张态度修正(算法见8楼):
  a)  低:+10
  b)  中等:+32
  c)  高:+50
  d)  很高:+60
2.  根据对方的积极买地态度修正(算法见8楼):
  a)  低:+5
  b)  中等:+12
  c)  高:+20
  d)  很高:+30
3.  根据对方和自己的距离修正(算法见8楼):
  a)  远:+10
  b)  近:+18
  c)  邻居:+30
4.  最后再乘以当前自己的扩张喜好修正因子。这个因子受到领袖喜好(FLOVAR_EXPANSION)和当前决定的大战略(比如开了自主会更倾向于扩张)影响,范围在0到20之间。
根据最后的领土纠纷因子判断:
1.  大于等于400:尖锐
2.  230到400之间:强
3.  100到230之间:弱
4.  100以下:没有
当领土纠纷第一次达到强或以上,而且对方的积极扩张态度为高或以上时,AI会警告你停止扩张。
领土纠纷为强或以上,而且对方的积极买地态度为低或以上时,AI会警告你不要再买他的地。

奇迹纠纷(WonderDisputeLevel)
AI用这个量评估对方和自己总体上的奇迹纠纷程度。判断依据是奇迹纠纷因子,计算方法是被抢的奇迹数目(奇迹建成时自己的某个城正在建造该奇迹)乘以奇迹喜好修正因子。奇迹喜好修正因子和领袖特性有关(WonderCompetitiveness),在游戏开始时决定,范围也是0到20之间。根据奇迹纠纷因子的值判断:
1.  大于等于10:尖锐
2.  7到10之间:强
3.  5到7之间:弱
4.  5以下:没有

城邦纠纷(MinorCivDisputeLevel)
AI用这个量评估对方和自己总体上的城邦纠纷程度。。判断依据是城邦纠纷因子,计算方法是:
1.  每个有大争端的城邦+10(对方保护了和我们同盟的城邦)
2.  每个有小争端的城邦+5(对方保护了和我们是朋友的城邦),本应该是这样,但由于code中的bug,事实上现在这个不会计算
3.  最后再乘以和领袖特性相关的因子(MinorCivCompetitiveness),同样在0到20之间
根据城邦纠纷因子判断:
1.  大于等于700:尖锐
2.  400到700之间:强
3.  200到400之间:弱
4.  200以下:没有

[ 本帖最后由 landice 于 2012-11-10 20:53 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:18:59 | 显示全部楼层
对其它文明的看法(Opinion)

这是AI决定如何对待其它文明的很重要的量,AI的外交策略几乎都围绕这个结果展开,其有下面几种可能:
  1. MAJOR_CIV_OPINION_UNFORGIVABLE,不可饶恕
  2. MAJOR_CIV_OPINION_ENEMY,敌人
  3. MAJOR_CIV_OPINION_COMPETITOR,竞争者
  4. MAJOR_CIV_OPINION_NEUTRAL,中性
  5. MAJOR_CIV_OPINION_FAVORABLE,喜欢
  6. MAJOR_CIV_OPINION_FRIEND,朋友
  7. MAJOR_CIV_OPINION_ALLY,盟友
复制代码
这个值根据OpinionWeight判断,这个值是一个整数,正的越大表示关系越差。其算法是AI外交中算法最复杂的几个之一,如下:
0.  初值为0
1.  根据领土纠纷修正(算法见9楼):
  a)  尖锐:+30
  b)  强:+20
  c)  弱:+10
  d)  没有:-6
2.  根据奇迹纠纷修正(算法见9楼):
  a)  尖锐:+20
  b)  强:+15
  c)  弱:+10
3.  根据城邦纠纷修正(算法见9楼):
  a)  尖锐:+30
  b)  强:+20
  c)  弱:+10
4.  对方是战争狂:加对方的战争狂分数(WarmongerScore)除2(战争狂分数的算法见11楼)
5.  对方归还过自己的非战斗单位(工人或移民),-20乘归还过单位的个数
6.  对方复活过自己,-200
7.  对方解放过自己的城市:
  a)  3个或以上:-60
  b)  2个:-50
  c)  1个:-30
8.  在对方首都有大使馆:-1
9.  对方原谅过自己的间谍行为:-10
10.  对方分享过针对自己的阴谋:-10乘分享过阴谋的次数
11.  对方要自己不要在附近建立城市:+20
12.  对方要自己停止间谍行为:+20
13.  对方管我们要过东西:+20
14.  对方用大军炸过我们的地:+30乘大军炸地的次数
15.  宗教纠纷:+2乘负面宗教影响点数。在自己建立了宗教的情况下,对方过来传教会增加负面宗教影响点数,算法为:
  a)  被转换的城是圣城:+25
  b)  被转换的城已经信了自己的教:+3
  c)  被转换的城还没信自己的教:+1
  d)  最后再乘以与时代有关的宗教对外交的影响因子(DiploEmphasisReligion):古典和工业乘2,中世纪和文艺复兴乘4,其余乘0(宗教纠纷对外交关系没有影响)
16.  自己没创立宗教的情况下,有半数以上城市信了对方的宗教:-5乘宗教对外交的影响因子(见上)
17.  对方没创立宗教的情况下,有半数以上城市信了自己的宗教:-3乘宗教对外交的影响因子
18.  对方和我们采纳了相同的后期政策树:-5乘政策对外交的影响因子(DiploEmphasisLatePolicies),工业和现代之后乘4,现代乘6
19.  对方和我们采纳了不同的后期政策树:+5乘政策对外交的影响因子
20.  对方劫掠过我们的设施:+20乘劫掠的次数(很大的影响!如果不想把关系搞崩了还是尽量少劫掠)
21.  诺言相关(没遵守指答应了之后还是做了,无视指交涉时直接不同意):
  a)  军事诺言:没遵守+40,无视+15,没遵守和第三者的诺言:+15
  b)  扩张诺言(包括铺城和买地):没遵守+20,无视+15(这两个值其实会随着时间推移变少,具体机制有点复杂,先按照这个算吧)
  c)  不攻击城邦的诺言:没遵守+40,无视+15,没遵守和第三者的诺言+15
  d)  不勒索城邦的诺言:没遵守+20,无视+10
  e)  不传教的诺言:没遵守+8乘宗教对外交的影响因子,无视+4乘宗教对外交的影响因子
  f)  不进行间谍行为的诺言:没遵守+20,无视+10
  g)  没遵守共同作战的诺言(说10回合后开战结果到时候反悔了):+20
22.  对方攻击或勒索了我们宣誓保护的城邦:
  a)  攻击城邦:发生在50回合内+20,50回合以上+15。此外从第二个保护的城邦被攻击开始,每个城邦再+15
  b)  征服城邦:+40。从第二个保护的城邦被征服开始,每个城邦再+10
  c)  勒索城邦:发生在50回合内+15,50回合以上+10。此外从第二个保护的城邦被勒索开始,每个城邦再+10
23.  我们攻击了对方宣誓保护的城邦,对方没有让步:+5(这个影响出乎意料的小啊)
24.  和宣友有关的修正:
  a)  对方和我们宣友:-35
  b)  对方和我们的朋友宣友:-15(不累加,就是说和几个朋友宣友都一样)
  c)  对方和我们的敌人宣友:+15(同样不累加)
25.  和背叛有关的修正,这里最后修正的量是下面五个量中的最大值:
  a)  对方被朋友背刺(宣友后谴责)过。对于每次背刺,又有几种情况。假设自己是A,正在评估的对手是B,背刺B的是C
    i.    如果C是不可信任的,不算。不可信任指的是C对朋友宣战过,或者有两次背刺过朋友
    ii.   如果我们对C的看法(Opinion)比B要好,+20(我们更相信B是坏人)
    iii.  如果我们对B的看法比C要好,-10(我们同情B,和B的关系反而更好了)
    iv.   如果我们对B的看法和C一样,不算
  b)  对方背刺过别人:每次背刺+15
  c)  对方背刺过我们:+35
  d)  对方对朋友宣战过:每次宣战+40
  e)  对方对我们宣友后宣战:+60
26.  和谴责有关的修正:
  a)  对方谴责过我们:+35
  b)  我们谴责过对方:+35
  c)  对方谴责了我们的朋友:+15
  d)  对方谴责了我们的敌人:-15
27.  对方是个扩张狂:+35
28.  我们在和对方的交易中占过便宜(RecentTradeValue):减去我们占到的便宜除10,最多-30。这个便宜是按照价值(Value)来算的,正常的外交关系下1 Value = 1 Gold,在关系恶化的情况下金币会贬值。这个价值体系后面再说。
交易中占到便宜的算法:对方提供的东西的价值比我们提供的多,就算是占到便宜。但只有这个便宜的价值超过100,或者对方提供的价值超过我们提供的价值的5倍以上,这些才全额算成我们占到的便宜。否则只算一半的价值。举例来说:奢侈品价值240的情况下,对方用300买,只算占到(300-240)/2=30的便宜。但如果用340块钱买,就算是占到100的便宜(便宜价值超过100);而对方白送钱总是可以算成全额的便宜,因为自己提供的价值是0,对方提供的价值总会超过5倍。
29.  对方和我们对共同的敌人作战:减去我们和对方的共同敌人价值(CommonFoeValue)除50,最多-50。共同敌人价值的算法和战争损失(WarValueLost)相同,比如A和B宣友,共同对C作战。那么C看到的B对C的战损会加到A认为B的共同敌人价值上
30.  对方给我们提供过援助:减去对方给我们援助的价值除10,最多-30
31.  对方拒绝给我们提供援助:加上对方拒绝援助的价值除10,最多+30
32.  被对方用核武器攻击过:+100
33.  首都被对方占领:+80
34.  给对方提供过援助:+20
到这里就算完了复杂的OpinionWeight,根据最终值判断:
1.  50或以上:不可饶恕
2.  30到50:敌人
3.  10到30:竞争者
4.  -10到10:中性
5.  -30到-10:喜欢
6.  -30到-50:朋友
7.  -50以下:盟友

[ 本帖最后由 landice 于 2012-11-10 21:12 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:19:11 | 显示全部楼层
战争狂(Warmonger)和扩张狂(RecklessExpander)

战争狂程度(WarmongerThreat)
这个值AI用来评估对方的战争狂程度,基本上是按照对方对外宣战和征服的次数评估。有下面几个值:
  1. THREAT_NONE,没有
  2. THREAT_MINOR,小的
  3. THREAT_MAJOR,大的
  4. THREAT_SEVERE,严重的
  5. THREAT_CRITICAL,致命的
复制代码
和这相关的有两个量:战争狂值(WarmongerAmount)和战争狂分数(WarmongerScore)
战争狂值根据对方对外宣战和征服的次数计算,每宣战一次加500,每征服一家加1000,城邦和文明相同。每回合减5(减的非常慢,所以基本上一旦成为战争狂就不太可能改变了)。
战争狂分数是战争狂值乘以和领袖相关的因子(WarmongerHate),这个因子在0到0.2之间,在游戏开始的时候决定(领袖特性再加上一个小的随机数)。
最后根据战争狂分数判断:
1.  大于200,致命的
2.  150到200之间,严重的
3.  100到150之间,大的
4.  50到100之间,小的
5.  50以下,没有
再最后有一些针对特殊情况的修正,就是如果对方征服的文明和城邦数目超过一定的比例就会直接定级到严重的或者致命的。
分级在大的或以上的时候就会被认定为战争狂。严重或以上的时候,每回合开始有1/3的概率会跳出来骂你。

扩张狂(RecklessExpander)
这个值AI用来评估对方是不是扩张的太厉害了。在同时满足下面三个条件的情况下对方会被认定为扩张狂:
1.  和对方的距离(ProximityToPlayer)是邻居(算法见8楼)
2.  对方的城市数量大于等于除对方之外的全部文明的平均城市数量的1.5倍
3.  对方和我们相比的军事实力(PlayerMilitaryStrengthComparedToUs,算法见3楼)小于普通(弱/很弱/非常弱)

[ 本帖最后由 landice 于 2012-11-10 21:45 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:19:56 | 显示全部楼层
对其它文明的态度(Approach)

这就是在外交界面中看到的AI对你的态度,有下面几个值:
  1. MAJOR_CIV_APPROACH_WAR,战争
  2. MAJOR_CIV_APPROACH_HOSTILE,敌对
  3. MAJOR_CIV_APPROACH_DECEPTIVE,欺骗
  4. MAJOR_CIV_APPROACH_GUARDED,提防
  5. MAJOR_CIV_APPROACH_AFRAID,畏惧
  6. MAJOR_CIV_APPROACH_FRIENDLY,友好
  7. MAJOR_CIV_APPROACH_NEUTRAL,中性
复制代码
AI每回合更新对其它所有文明的态度。对于每个态度有一个计数器,根据不同的条件对相应态度的计数进行增减,最后选取计数最高的态度作为最终态度。
计数器的算法如下:
0.  初始化:所有态度为4
1.  为了不让相邻两个回合的态度变化太快,根据上个回合的态度进行加成
  a)  首先给上个回合的态度+3
  b)  如果上个回合的态度是欺骗,那么战争+2
  c)  如果上个回合的态度是敌对,那么敌对+5。这让敌对态度比较难转换出来。
  d)  如果现在正在打仗,那么根据现在的战争状态(WarState)加成。当战争状态比互角更好的话,给战争+3(WarState的算法见5楼)
  e)  如果现在正在准备世界征服,那么只要战争状态比守势好,就给战争+5
2.  根据领袖的性格进行加成(MajorCivApproachBiases)。这个值是在游戏开始的时候就定下的,在XML中的值的基础上再加上一个小的随机数
3.  根据对目标文明的看法(Opinion)进行加成(算法见10楼)
  a)  不可原谅:战争+10,敌对+4,提防+4
  b)  敌人:战争+8,敌对+4,欺骗+1,提防+4
  c)  竞争者:战争+4,敌对+4,欺骗+2,提防+2
  d)  中性:友好+2
  e)  喜欢:敌对-5,友好+4
  f)  朋友:敌对-5,友好+10
  g)  盟友:友好+10
4.  如果正在宣友,欺骗+3,友好+15,敌对-100,提防-100
5.  外交谴责的效果:所有的谴责效果都是战争+10,敌对+10,提防+5,友好-100,欺骗-100。下面列出的各种情况叠加
  a)  我们谴责了对方
  b)  对方背刺了我们(宣友后谴责)
  c)  对方谴责了我们
6.  对方攻击了我们宣誓保护的城邦
  a)  对方攻击了城邦:战争+4,敌对+1,提防+1
  b)  对方征服了城邦,50回合以内:战争+6,敌对+2,提防+1
7.  对方管我们要过东西(Demand):欺骗-6,友好-6
8.  诺言相关,没遵守指答应了之后还是干了,无视指外交谈话时直接拒绝了:
  a)  军事诺言:
    i.   没遵守和我们的诺言:战争+4,欺骗-10,友好-10
    ii.  没遵守和别人的诺言:战争+5,欺骗-6,友好-6
    iii. 无视要求停止军事行动的要求(直接宣战了):欺骗-4,友好-4
  b)  领土扩张诺言(包括铺城和买地两种,分别计算):
    i.   没遵守:战争+4,欺骗-6,友好-6
    ii.  无视:战争+3,欺骗-4,友好-4
  c)  不攻击城邦的诺言
    i.   没遵守:战争+4,欺骗-10,友好-10
    ii.  没遵守和别人的诺言:战争+3,欺骗-3,友好-3
    iii. 无视:战争+4,欺骗-4,友好-4
  d)  不勒索城邦的诺言:
    i.   没遵守:战争+4,欺骗-10,友好-10
    ii.  无视:战争+4,欺骗-4,友好-4
9.  对方对自己的军事威胁(Threat,算法见6楼):
  a)  致命的:提防+4,畏惧+4
  b)  严重的:提防+3,畏惧+2
  c)  大的:提防+2,畏惧+1
  d)  小的:畏惧+1
  e)  没有:敌对+2
10.  如果自己正和任何一家处在战争之中,减少战争和敌对的态度(已经在和别人打仗的时候倾向于不再开战):
  a)  战争态度的加成取决于当前的全局战争状态(StateAllWar,算法见5楼):
    i.   现在的全局战争状态是中等,战争-9
    ii.  现在的全局战争状态是胜利,战争-3
    iii. 其他的情况,战争-12
  b)  敌对-2,欺骗+2,友好+2
11.  再看看本回合内已经评估过的态度(每一家分别评估,结果累加)
  a)  如果之前已经决定和其他家是战争态度,战争-12,敌对-2,欺骗+2
  b)  如果之前已经决定和其他家是敌对态度,战争-2,敌对-2,欺骗+2,友好+2
  c)  如果之前已经决定和其他家是恐惧态度,战争-4,敌对-4,欺骗+2,友好+2
  每回合AI评估对其它文明的态度是按照看法(Opinion)来排序的。看法越坏的对手越先评估。从上面的算法可以看出来,对于AI来说,如果和其它人的关系比和你的关系更差,AI对你宣战的可能性就会大幅减小。
12.  根据对对手的战争预测(WarProjection,算法见7楼)对战争态度加成
  a)  毁灭性的:战争*45%,提防*125%
  b)  失败:战争*60%,提防*115%
  c)  互角:战争*80%,提防*105%
  d)  好:战争*150%,提防*80%
  e)  很好:战争*180%,提防*60%
  f)  不知道:战争*100%,提防*100%(不变)
13.  如果对方是扩张狂(RecklessExpander,算法见11楼),战争*160%
14.  根据和对方的距离(ProximityToPlayer,算法见8楼)对战争态度加成
  a)  邻居:战争*115%
  b)  近:战争*100%
  c)  远:战争*60%
  d)  很远:战争*50%
15.  如果和对方在25回合内有停战协议,战争*65%
16.  如果已经答应和对方开战(10回合准备期间内):战争+1000
17.  最后再对每种态度加成当前值15%内的随机值
18.  最最后,根据难度给战争态度加成,PRINCE以下乘85%,其余不变
选取得分最高的态度为最终态度。

在外交界面上,可以直接看到除战争和欺骗之外的态度。
欺骗态度在外交界面看到的是友好。
战争态度,在真正宣战之前,根据排在第二位的态度决定外交界面的态度:
1.  排在第二位的态度为敌对,显示为敌对
2.  排在第二位的态度为欺骗/畏惧/友好,并且没有谴责过对方,显示为友好
3.  其它的情况,显示为中性

[ 本帖最后由 landice 于 2012-11-10 22:30 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:20:16 | 显示全部楼层
再占一楼
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-9 19:20:33 | 显示全部楼层
最后一楼
回复 支持 反对

使用道具 举报

发表于 2012-11-9 19:21:23 | 显示全部楼层
前排围观填坑
回复 支持 反对

使用道具 举报

发表于 2012-11-9 19:40:10 | 显示全部楼层
  这里是moonclub吧
回复 支持 反对

使用道具 举报

发表于 2012-11-9 20:15:13 | 显示全部楼层
慢慢都是坑
回复 支持 反对

使用道具 举报

发表于 2012-11-9 20:48:42 | 显示全部楼层
强帖留名
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-10 21:26:11 | 显示全部楼层
更新到11楼,添加目录
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-10 22:36:49 | 显示全部楼层
再更新一楼,对其它文明的态度
这样和AI外交有关的主要的评估量就差不多全了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|塞爱维(CIV)文明联盟    

GMT+8, 2024-3-29 06:48

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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