- UID
 - 9701
 
- UCC
 -  
 
- 声望
 -  
 
- 好评
 -  
 
- 贡献
 -  
 
- 最后登录
 - 1970-1-1
 
 
 
 
 
 
 | 
 
玩转游戏---制定你自己的游戏规则(高级篇) 
 
在中级篇教程中,我们已经可以独立的完成一个完整的规则逻辑了. 
在高级篇中,我们将开始探讨一些复杂的规则逻辑.并对其中的部分逻辑进行代码实现. 
我们借用FX MOD,<<家园>>模式中的随机奖励,来讲解复杂的规则逻辑. 
 
我们直接跳过选项的设置和取值关联,直接进入规则逻辑部分. 
 
首先,我们对所需要实现的规则逻辑进行细致的分析. 
 
一.素材准备 
 
    最先的准备,如果你连你想要奖励什么都不清楚的话...就很难进行下面的工作了... 
    1.我们需要一张详细的奖励清单,用来确定那些单位或者其他项目将会被奖励. 
    2.我们需要确定奖励承载物(<<家园>>模式中的资源箱). 
 
二.逻辑顺序分析及简单设计 
 
    将复杂的逻辑分解成若干个简单的逻辑,并使用调用来联系他们. 
    1.规则:放置奖励承载物.(function rule_CrateAdd()) 
      运行方式:间隔一定时间执行一次(低频率) 
 
        1-1.规则:在地图中产生随机位置(用于放置奖励承载物)并将值返回给调用者.(function getCratePoint() return P) 
            运行方式:普通函数,调用运行. 
 
            1-1-1.规则:接收参数(位置),判断这个位置附近是否有玩家拥有的单位.如周围"安全".告知调用者当前位置可以放置奖励承载者.(function isPointOkToAddCrate(P) return IsOk) 
                  运行方式:普通函数,调用运行. 
 
    2.规则:检测奖励承载物是否过时,并将过时的奖励承载物剔除.判断玩家的单位是否接近现有的奖励承载物.(function checkPlayerGetCrate()) 
      运行方式:间隔一定时间执行一次(高频率) 
 
        2-1.规则:给予玩家奖励.(function givePlayerCrateReward(playerId)) 
            运行方式:普通函数,调用执行. 
 
            2-1-1.规则:检索奖励列表,并将选中的奖励返回给调用者.(function checkCrateReward(playerId) return rewardType) 
                  运行方式:普通函数,调用执行. 
 
 
三.执行流程伪代码描述(超级伪...还杂交了中文...-_-...) 
 
function 初始化函数() 
    规则加载("rule_CrateAdd","间隔时间") 
    规则加载("checkPlayerGetCrate","间隔时间") 
end 
 
function rule_CrateAdd()            --向地图中添加奖励承载物,把选择位置的工作扔给了getCratePoint()函数 
    local P = getCratePoint() 
    添加模型("箱子", P) 
end 
 
function getCratePoint()            --产生随机点,把检测位置是否合理的工作交给了isPointOkToAddCrate(P)函数 
    代码块(一系列算法产生一个随机点P) 
    while (isPointOkToAddCrate(P) ~= 可以放置) do 
        P = P + 随机数 
    end 
    return P 
end 
 
function isPointOkToAddCrate(P)     --检测位置是否合乎要求,并将结果返回调用者 
    local isOk = "可以放置" 
    local playerId = 0 
    local playercount = 累计玩家数量() 
    while (playerId < playercount) do 
        if (玩家是否存在(playerId) == 1) then 
            local sobGroup 
            将指定范围内指定玩家的单位累计入指定组(sobGroup, playerId, 范围半径) 
            if (sobGroup ~= 空) then 
                isOk = "不可放置" 
                break 
            end 
        end 
        playerId = playerId + 1 
    end 
    return isOk 
end 
 
function checkPlayerGetCrate()      --剔除过期的奖励承载物,以及判断玩家是否可以拾取奖励.把具体的奖励工作交给了givePlayerCrateReward(playerId)函数 
    代码块(检测奖励承载物是否过时并把过时的奖励承载物剔除.) 
    local playerId = 0 
    local playercount = 累计玩家数量函数() 
    while (playerId < playercount) do 
        if (玩家是否存在(playerId) == 1) then 
            local sobGroup 
            将指定范围内指定玩家的单位累计入指定组(sobGroup, playerId, 范围半径) 
            if (sobGroup ~= 空) then 
                代码块(剔除拣起的奖励承载物) 
                givePlayerCrateReward(playerId) 
                break 
            end 
        end 
        playerId = playerId + 1 
    end 
end 
 
function givePlayerCrateReward(playerId)      --为玩家颁发奖品,把挑选奖品的工作交给了checkCrateReward(playId)函数 
    local rewardType = checkCrateReward(playerId) 
    将指定奖励给予指定玩家(playerId, rewardType) 
end 
 
function checkCrateReward(playId)             --挑选奖品并返回给调用者 
    local rewardType 
    代码块(按照一定规则选出奖励并赋值给rewardType) 
    return rewardType 
end 
 
(PS:以上巨伪的代码流程中...中文描述的函数,一些是使用HW2的内置函数实现功能,另一些是使用一些结合HW2内置函数的代码块来实现功能,大家是否看了暴汗呢...-_-) 
(再PS:同时我们也看到,将多个互相关联的逻辑细分开来,让一个函数尽量只做1~2件简单的工作,能够使得我们的代码实现更为简便和有条理,也保证了低错误率) 
 
到这里,对规则逻辑的分析已经完成了.我们已经得到了最基本的流程. 
现在,我们来完成挑选奖品的函数~~相信每个人都喜欢挑东西吧~~~ 
首先,随便整个奖励列表吧(模仿<<家园>>模式的结构). 
 
PrsentsList =  
{ 
    { 
        prob = 0.1 , 
        ships =  
        { 
            {ship = "A" , prob = 0.5 ,}, 
            {ship = "B" , prob = 1.0 ,}, 
        }, 
    }, 
    { 
        prob = 0.3 , 
        ships =  
        { 
            {ship = "C" , prob = 0.6 ,}, 
            {ship = "D" , prob = 1.0 ,}, 
        }, 
    }, 
    { 
        prob = 0.8 , 
        ships =  
        { 
            {ship = "E" , prob = 0.3 ,}, 
            {ship = "F" , prob = 0.8 ,}, 
            {ship = "G" , prob = 1.0 ,}, 
        }, 
    }, 
    { 
        prob = 1.0 , 
        ships =  
        { 
            {ship = "H" , prob = 1.0 ,}, 
        }, 
    }, 
} 
 
嘿嘿~~奖励列表就被我们胡乱搞出来了... 
然后,我们来实现一个不需要参数的挑选奖励的简单函数 
 
function checkCrateReward() 
    local iClass = 1 
    local probsNum = RandomRange(0.0 ,1.0)                 --浮点数随机函数RandomRange(<iMin> ,<iMax>) 
    while (PrsentsList[iClass].prob < probsNum) do 
        iClass = iClass + 1 
    end 
    probsNum = RandomRange(0.0 ,1.0)                       --再取一次随机数,不然出来的结果就傻了...-_- 
    local iShip = 1 
    while (PrsentsList[iClass].ships[iShip].prob < probsNum) do 
        iShip = iShip + 1 
    end 
    return PrsentsList[iClass].ships[iShip].ship 
end 
 
具体的语法结构要看先前所设计的奖励列表的结构而定,在这里再举一个更简单的实现方式(各有各的好处,就看具体问题了). 
 
PrsentsList =  
{ 
    {ship = "A" , prob = 0.1}, 
    {ship = "B" , prob = 0.2}, 
    {ship = "C" , prob = 0.3}, 
    {ship = "D" , prob = 0.4}, 
    {ship = "E" , prob = 0.5}, 
    {ship = "F" , prob = 0.6}, 
    {ship = "G" , prob = 0.8}, 
    {ship = "H" , prob = 1.0}, 
} 
 
function checkCrateReward() 
    local iShip = 1 
    local probsNum = RandomRange(0.0 ,1.0) 
    while (PrsentsList[iShip].prob < probsNum) do 
        iShip = iShip + 1 
    end 
    return PrsentsList[iShip].ship 
end |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |