lua 实现公式配置

游戏开发中需要很多的配置,这些配置往往由程序提供固定格式的excel,由策划配置。借助于excel强大的功能可以很方便的进行很多配置。

但并不是所有配置都适合用表格,比如一套复杂的技能,可能是有很多参数,技能还可以有子技能。越是灵活性越强大的程序实现,对配置

的要求就越高。策划可能会被一大堆id在表里索引引来索引去,搞得晕头转向,毕竟人不是机器。

我们游戏中为了降低配置复杂度,部分配置采用lua文件(策划有脚本能力),很多地方策划还没想好,不能给出特定的需求。这就诞生了让

策划可以自己配置公式的需求

下边是我lua实现的一个简单原型:

-- 表达式计算
-- 2015年1月28日
Expresion = Expresion or {}
Expresion.__index = Expresion

function Expresion.new( cfg )
    
    local t = {}
    for _, v in ipairs( cfg ) do
        t[v.var] = v.value
    end
    

    local function replaceExp( str ) 
        
        local temp = { cfg.result }
        for k, v in pairs( t ) do
        
            local splitT = {}
            for i, str in ipairs( temp ) do
            
                repeat
                    local b, e = string.find( str, k )
                    if b then
                        table.insert( splitT, string.sub( str, 1, b - 1) )
                        table.insert( splitT, tostring( v ) )
                        str = string.sub( str, e + 1, -1 )
                    else
                        table.insert( splitT, str )
                        break
                    end            
                until false
                    
            end
            temp = splitT
        
        end

        local resultStr = ""
        for _, v in ipairs( temp ) do
            resultStr = resultStr .. v
        end
        
        return resultStr
        
    end
    
    
    t.result = replaceExp( cfg.result )

    setmetatable( t, Expresion )
    return t
end


function Expresion:run( )

    local r = loadstring( self.result )
    return r()

end


-- ==========================================================
-- 单元测试

config = 
{
    { var = "A", value = 100 },
    { var = "B", value = 8 },
    { var = "C", value = true },
    -- result = " c = A ^ ( 1 / 2 ); return c, c + B ",
    result =
    [[
        if C == true then
            print( A )
        else
            print( B )
        end
        
        return true
    ]]
    
}

local exp1 = Expresion.new( config )

 print( exp1:run( ) )

运用于游戏的时候 配置可更具需求变更,比如 变量 可以是某个英雄的某个属性值,可以是外部传入的参数。

策划,可以更具需求,想定义一堆变量。然后做一些逻辑,最终返回一个数值,比如 伤害计算之类的。

不好的地方是:字符串替换开销挺大的,不适合在频繁调用的地方用

好处:最大化策划配置的灵活性,可以不通过程序而自己改很多东西

原文地址:https://www.cnblogs.com/dou-ya/p/4290494.html