代码接口说明
本文档对文件中的Client \ AI_SDK \ AI_SDK.lua文件中的部分接口功能做了一些解释,同时还加上了一些常用的功能函数的解释,未解释的部分用户可以不用关注。
注:可使用 Ctrl + F 搜索想找的接口。
接口
AI_SDK.lua
0 .重要变量
--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}
1 .AI_SDK.MoveTo(不建议使用)
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为移动一半。
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是用于将此步骤发送到服务端以请求执行此步骤。
if not AI_SDK.IsConnected(Core.SelectPos.x, Core.SelectPos.y, x, y) then
return
end
这一步判断移动目标点与选中点是否相邻,四个参数分别为选择要移动的点的坐标和移动终点坐标,若不相邻则无法移动。
local NewRequest = {
...
}
ClientSock.SendMove(NewRequest)
这一步仍是定义当前步骤并发送到服务端执行。
2 .AI_SDK.DirectionToDestination
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。
3 .AI_SDK.MoveByDirection(推荐)
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。
4 .AI_SDK.MoveByCoordinates(推荐)
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的封装,用户调用此函数时只需传入起始点坐标,终点坐标和移动兵力。
5 .AI_SDK.IsConnected
function AI_SDK.IsConnected(posX1, posY1, posX2, posY2)
...
end
这是用来判断原点与移动目标点是否相邻的接口,若是返回true,否则返回false。
6 .AI_SDK.setSelected
function AI_SDK.setSelected(x, y)
AI_SDK.SelectPos.x, AI_SDK.SelectPos.y = x, y
end
此函数用于配合MoveTo使用,将( x,y )设定为选中点,但是实际写AI时我们建议使用AI_SDK.MoveByCoordinates和AI_SDK.MoveByDirection,这两个函数避免了设置选定点的操作。
常用功能函数
在知道了以上的接口之后,您还需要知道一些常用的功能函数才能完成对AI的开发。
-- 获取此点的归属,0代表未占领
CGameMap.GetBelong(x,y)
-- 获取ArmID这一方王的位置,ArmyID是一个全局变量,代表自己的id(不要用来搞歪门邪道哦)
CGameMap.GetKingPos(ArmyID)
-- 获取此点的类型,返回
-- "NODE_TYPE_KING"(王) "NODE_TYPE_FORT"(堡垒)
-- "NODE_TYPE_HILL"(山) "NODE_TYPE_BLANK"(空格)
-- 中的一个
CGameMap.GetNodeType(x,y)
-- 获取此点兵力,返回数值
CGameMap.GetUnitNum(x,y)
-- 判断当前能否看到此点,返回true/false
CGameMap.GetVision(x,y)
现在您已经获取了所有与AI设计相关的接口了,剩下需要的是您通过逻辑的设计将他们组合成一个强力的AI,如果您仍有疑惑,可以参考开发指南中的AI示例