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( ) )

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

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

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

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

时间: 2024-10-25 02:46:34

lua 实现公式配置的相关文章

nginx+lua+redis(openresty)配置

nginx+lua+redis(openresty)配置 2014-07-18 11:10 2494人阅读 评论(1) 收藏 举报 方案一: 1.安装lua解释器 wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz (http://luajit.org/download.html) 配置lua Lib和include/luajit-$version目录为环境变量 2.下载ngx_devel_kit和lua-nginx-module https:

如果动态的执行java脚本,这个在脚本公式配置的时候很方便

package com.bfrj.core.groovy; import java.util.HashMap; import java.util.Map; import org.jeecgframework.core.util.ApplicationContextUtil; import org.springframework.context.ApplicationContext; /** * 公式计算 * */ public class GroovyParse { /** * 公式解析计算 *

新书《Nginx实战:基于Lua语言的配置、开发与架构详解》开始发售

新书<Nginx实战:基于Lua语言的配置.开发与架构详解>开始发售https://item.jd.com/12487157.html#none <Nginx实战:基于Lua语言的配置.开发与架构详解>主要讲解了Nginx在反向代理和应用开发中的作用,阅读本书可以了解Nginx在互联网开发中扮演的多个角色,充分利用这些角色的各项功能有助于提升服务的整体性能.<Nginx实战:基于Lua语言的配置.开发与架构详解>所介绍的大部分功能是通过Nginx+Lua进行开发和配置的

Windows7下Lua的编译和配置,Visual Studio2013

在Windows7下配置Lua 一. 配置环境 操作系统:windows7 64位 旗舰版 Lua:lua5.3 IDE:Visual Studio 2013 二.准备工作 1.去lua的官方网站下载Lua的源代码,最新版是5.3,lua的官网: http://www.lua.org/,下载完后解压到你想要的目录. 2.安装好Visual Studio 2013. 其实不一定是2013版本,2010也可以. 三.开始配置 1.打开VS2013,新建一个空的解决方案(兴建项目?其他项目类型?Vis

Bolt XML和JQBolt Lua代码自动补全插件配置教程

Bolt没有提供官方IDE,缺少强大的代码提示和自动补全,Notepad++写起界面和脚本来比较费劲. Notepad++有个QuickText插件,支持多语言的自动补全,进行简单的配置就可以支持Bolt XML和JQBolt Lua代码. 配置后的效果,输入关键字,Ctrl+Enter自动补全: 下面介绍一下配置方法: 1.在JQBolt中下载QuickText插件和已经配置好的配置文件:https://github.com/zhenghecn/JQBolt,这两个文件在plugins目录下:

lua学习笔记1 环境配置

1 开发平台 windows7 64位 2 下载链接 http://www.lua.org/download.html 3 安装完成-环境配置 4  运行 WIN+R 运行 cmd 运行lua,显示配置成功.

ngx lua模块源码简单解析

ngx lua模块源码简单解析分类: nginx 2014-07-11 11:45 2097人阅读 评论(0) 收藏 举报nginxlua数据结构架构目录(?)[+]对nginx lua模块的整个流程,原理简单解析.由于nginx lua模块相关配置,指令,API非常多,所以本文档只以content_by_lua指令举例说明. 读本文档最好配合读源码. 不适合对nginx和lua一点都不了解的人看.1.相关配置详细配置见 https://github.com/openresty/lua-ngin

关于windows下创建cocos2d lua工程 无法断点调试 relative (file not exist) 的问题

环境搭建:按照网上给出的攻略,安装pyhton2.7, 下载cocos2d-x-3.x的引擎, 安装VS2012,babelua插件. 创建工程:在cocos2d-x-3.6\tools\cocos2d-console\bin 目录下使用命令 cocos -new HelloLua -p HelloLua -d X:\ 开始编译:除了一些弃用接口和符号数的比较警告之外没有报错,经过我小破机二十几分钟的编译,全部通过,成功生成各种库和Windows下的模拟器. 使用babelua插件创建lua工程

lua中的坑

在工作中使用lua也有一年了,代码也写了不少,踩过不少坑,这里记录一下. table.sort table.sort是lua自带的排序函数,数据量小时,也还是不错的.不过要注意你传入的compare函数.例如: local tb = { 9,8,3,777,0,36548,556,0 } table.sort( tb,function(a,b) return a>=b end ) 上面的代码够简单了,但是你运行起来,却是报错了. Program starting as '"D:\progr