以下是伪代码:
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 编辑 ]
|