本文档对文件中的Client \ AISDK \ AISDK.lua文件中的部分接口功能做了一些解释,同时还加上了一些常用的功能函数的解释,未解释的部分用户可以不用关注。
注:可使用 Ctrl + F 搜索想找的接口。
`lua
--READY:游戏未开始 Start:游戏进行中 Over:游戏结束 Menu:菜单界面
AI_SDK.gameState = "READY"
--用户ID AI_SDK.armyID = nil
--军队总数量 AI_SDK.armyNum = 0
--王的位置 AI_SDK.KingPos = {x = -1, y = -1}
--选中的点
AI_SDK.SelectPos = {x = -1, y = -1}
`
`lua
function AI_SDK.MoveTo(x, y, moveNum)
if AI_SDK.gameState ~= "Start" then
return
end
`
这是移动军队的接口,非开始阶段不运行。( x , y ) 为目标点,(Core.SelectPos.x , Core.SelectPos.y)为选中点,用户调用MoveTo函数之前需要提前设定好选中的点。
moveNum为移动兵力,其中,其值为0时只在原地留一个士兵;大于1时移动其值数量的兵力;小于1时按比例移动,如0.5为移动一半。
`lua
if x == -1 and y == -1 then
local NewRequest = {
armyID = AI_SDK.armyID,
srcX = -1,
srcY = -1,
dstX = -1,
dstY = -1,
num = 0
}
ClientSock.SendMove(NewRequest)
return
end
`
这一步是撤销操作,如果用户将 x 与 y 都设置为-1,则撤销之前的移动操作。NewRequest为定义的操作步骤,这里将其值全设置为-1,代表这一步是撤销。下面的接口ClientSock.SendMove是用于将此步骤发送到服务端以请求执行此步骤。
`lua
if not AI_SDK.IsConnected(Core.SelectPos.x, Core.SelectPos.y, x, y) then
return
end
`
这一步判断移动目标点与选中点是否相邻,四个参数分别为选择要移动的点的坐标和移动终点坐标,若不相邻则无法移动。
`lua
local NewRequest = {
...
}
ClientSock.SendMove(NewRequest)
`
这一步仍是定义当前步骤并发送到服务端执行。
`lua
function AI_SDK.DirectionToDestination(x, y, direction)
local mode = x % 2 + 1
return x + BasicMap.direction[mode][direction][1], y + BasicMap.direction[mode][direction][2]
end
`
这是一个获取目标点的函数。传入的参数为起始点( x,y )和移动方向direction。其中正六边形自右上边顺时针方向分别为1~6。最后返回在该方向上移动一步后(实际未移动,只是假设往此方向移动)点的 x 和 y。
`lua
function AI_SDK.MoveByDirection(srcX, srcY, moveNum, direction)
local dstX, dstY = AI_SDK.DirectionToDestination(srcX, srcY, direction)
AI_SDK.SelectPos = {srcX, srcY}
AI_SDK.MoveTo(dstX, dstY, moveNum)
end
`
这个函数是对MoveTo的封装,用户调用此函数时只需传入起始点坐标,移动兵力和方向,moveNum参考MoveTo中的moveNum,direction参考上面函数的direction。
`lua
function AI_SDK.MoveByCoordinates(srcX, srcY, dstX, dstY, moveNum)
if not AI_SDK.IsConnected(srcX, srcY, dstX, dstY) then
return
end
AI_SDK.SelectPos = {srcX, srcY}
AI_SDK.MoveTo(dstX, dstY, moveNum)
end
`
这个函数是对MoveTo的封装,用户调用此函数时只需传入起始点坐标,终点坐标和移动兵力。
`lua
function AI_SDK.IsConnected(posX1, posY1, posX2, posY2)
...
end
`
这是用来判断原点与移动目标点是否相邻的接口,若是返回true,否则返回false。
`lua
function AI_SDK.setSelected(x, y)
AI_SDK.SelectPos.x, AI_SDK.SelectPos.y = x, y
end
`
此函数用于配合MoveTo使用,将( x,y )设定为选中点,但是实际写AI时我们建议使用AISDK.MoveByCoordinates和AISDK.MoveByDirection,这两个函数避免了设置选定点的操作。
在知道了以上的接口之后,您还需要知道一些常用的功能函数才能完成对AI的开发。
`lua
-- 获取此点的归属,0代表未占领
CGameMap.GetBelong(x,y)
-- 获取ArmID这一方王的位置,ArmyID是一个全局变量,代表自己的id(不要用来搞歪门邪道哦) CGameMap.GetKingPos(ArmyID)
-- 获取此点的类型,返回 -- "NODETYPEKING"(王) "NODETYPEFORT"(堡垒) -- "NODETYPEHILL"(山) "NODETYPEBLANK"(空格) -- 中的一个 CGameMap.GetNodeType(x,y)
-- 获取此点兵力,返回数值 CGameMap.GetUnitNum(x,y)
-- 判断当前能否看到此点,返回true/false
CGameMap.GetVision(x,y)
`
现在您已经获取了所有与AI设计相关的接口了,剩下需要的是您通过逻辑的设计将他们组合成一个强力的AI,如果您仍有疑惑,可以参考开发指南中的AI示例