• lua环状表


    游戏中关于抽奖日志常常需要维护一个lua表,如果每次操作都是在头部,会引起后边元素进行内存拷贝。

    一般来说中奖日志都有一个长度上限,当超过时就需要将最前边的日志删除,而这个是我们不愿意看到的。

    这里实现了一个环状表,当长度超过上限后会自动将第一个位置替换未新加入的元素。

    结构如下:

    --[[

    环状表

    var={

      index,--即将使用的下标

      maxNum,--最大长度,超过从头开始(可扩展)

      items = {

        item,--日志节点

        ...

      }

    }

    ]]

    local mod = {}

    local function correctIndex(list)

      if list.index > list.maxNum then

        list.index=1

      end

    end

    function mod.initList(list,maxNum)

      assert(maxNum>0)

      list.index=1

      list.maxNum=maxNum

      list.items={}  

    end

    function mod.getCount(list)

      return #list.items

    end

    --表长变更

    function mod.resetMaxNum(list,maxNum)

      assert(maxNum>0)

      local oldItmes={}

      mod.for_each(list,function(item)

        table.insert(oldItems,item)

      end)

      if maxNum>=#oldItems then

        list.items=oldItems

      else

        list.items={}

        local items=list.items

        for i=#oldItem-maxNum+1,#oldItems do

          table.insert(items,oldItems[i])

        end

      end

      list.maxNum = maxNum

      list.index=#list.items+1

      correctIndex(list)

    end

    --添加元素

    function mod.addItem(list,item)

      list.items[list.index]=item

      list.index=list.index+1

      correctIndex(list)

    end

    --遍历

    function mod.for_each(list,f)

      local index = list.index

      local items = list.items

      local cnt = #items

      for i=index,cnt do

         f(items[i])

      end

      for i=1,index-1 do

         f(items[i])

      end

    end

    --反向遍历

    function mod.for_each_reverse(list,f)

      local index = list.index

      local items = list.items

      local cnt = #items

      for i=index-1,1,-1 do

         f(items[i])

      end

      for i=cnt,index,-1 do

         f(items[i])

      end

    end

    function mod.clear(list)

      mod.initList(list,list.maxNum)

    end

    return mod

    使用方法

    local loglist = require("loglist")

    local maxloglen = 50

    local getLog()

      local var = getSysVar()

      if not var.actorLog then

        var.actorLog={}

        loglist.initList(var.actorLogInfo,maxloglen)

      end

      return var.actorlog

    end

    --添加日志

    local addlog(log)

      local actorlog = getactorlog()

      loglist.additem(actorlog,log)

    end

    --遍历

    local logs = getactorlog()

    local len = loglist.getcount(logs)

    loglist.for_each_reverse(logs,function(log)

      ...

      end)

    end

    纯属记录程序人生,如有差错,欢迎指正,轻喷
  • 相关阅读:
    2017/09/02笔记:ps
    207/08/3学习笔记:pc端网站如何实现移动端适配知识点
    2017/0828xueix笔记:图像替代文本&css绘制的图形
    20170824:面试题笔记
    目前比较全的CSS重设(reset)方法总结
    学习笔记:css3实现多行文字溢出显示省略号&display:box;
    SVG圆形<circle> 标签
    k8s节点分配nodeSelector, Affinity和Anti-Affinity 亲和性和反亲和性
    kubernetes网络介绍
    centos6.7 安装docker
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/14428970.html
Copyright © 2020-2023  润新知