代码接口说明

​ 本文档对文件中的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示例

results matching ""

    No results matching ""