zoukankan      html  css  js  c++  java
  • 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( ) )

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

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

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

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

  • 相关阅读:
    FusionCharts数据展示成饼状图、柱状图和折线图
    Js获取request中的对象的属相值
    在grid结果集中实现全选或全不选某些特定的行
    JQuery的一些基础知识
    查询的数据插入不到临时表中的原因
    Javascript获取页面表格中的数据
    ajax实现菜单联动显示信息(当选择单位的时候,动态关联出人员信息)
    form表单只提交数据而不进行页面跳转的解决方案
    NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
    LINQ to SQL语句
  • 原文地址:https://www.cnblogs.com/dou-ya/p/4290494.html
Copyright © 2011-2022 走看看