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]
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]