zoukankan      html  css  js  c++  java
  • 好的开发计划

    游戏抽奖活动中下限保底的简单实现
    原创xiaoyanzi521 最后发布于2014-03-02 20:53:29 阅读数 1044 收藏
    展开
      同事说:“下限保底就是前多次不出第一次,前多少次不出第二次等等”。第一次接触下限保底时没有理解什么意思,因为我"前多次"理解错了,我把它理解成了“该道具被抽中了前多少次”,但实际“前多少次”就是指玩家抽奖抽了多少次。搞清楚这一点后下限保底就很简单了。

      项目中下限保底就是这样实现的,挺简单的。首先就是要记录玩家抽奖的次数。然后配置需要下限保底的道具。最后根据玩家的抽奖次数判断被保底的道具能不能给玩家。由于很简单,直接贴Lua脚本的代码了。


    --[[
    日期:2014年2月12日
    程序:游戏中下限抽奖保底。
    ]]


    -------------------------------------------------------
    --配置
    ProbabilityConf =
    {
    --[[下限保底说明:对于指定道具,前多次肯定不出第1次,前多少次肯定不出第2次,...]]
    lowerItems =
    {
    {
    id = 117,
    --[[说明:前5次肯定不出第1次,前10次肯定不出第2此,前13次肯定不出第3次,后面便没有限制]]
    grade = {5, 10, 13,},
    },
    {
    id = 118,
    grade = {15, 25, 35, 40, 60, },
    },
    },

    --[[抽奖物品,由于取的是[1,10000]内的一个随机数,所以物品的总rate值需要是10000。重要的物品配置两端,
    道具配置的顺序需要考虑抽中保底物品时,如果此次物品被保底则不能被抽取,返回下一个道具时应返回一个很普通道具。]]
    rewards =
    {
    --[[{id = 111, name = "item_111", rate = 100, },
    {id = 112, name = "item_112", rate = 200, },
    {id = 113, name = "item_113", rate = 300, },
    {id = 114, name = "item_114", rate = 400, },
    {id = 115, name = "item_115", rate = 1000, },
    {id = 116, name = "item_116", rate = 1100, },]] --物品少一点,重要的物品概率配置大一点,为了测试
    {id = 119, name = "item_119", rate = 1000, },
    {id = 117, name = "item_117", rate = 4000, },
    {id = 118, name = "item_118", rate = 4000, },
    {id = 120, name = "item_120", rate = 1000, }, --这样是一个普通道具,保底物品不能被选中时,就会返回这个物品
    },
    }


    -------------------------------------------------------
    --脚本
    ProbabilityFunc = {}

    ProbaData = {} --用于存放数据
    --[[
    ProbaData.Lower[id]: 记录id被抽中的次数。
    ProbaData.LoterryTimes: 玩家总的抽奖次数。
    ]]

    --函数:设置随机值的seed。
    ProbabilityFunc.InitRandom = function(seed)
    local curTime = os.time()
    seed = seed or curTime

    --print("ProbabilityFunc.InitRandom: seed = "..seed)
    math.randomseed(seed)
    end


    --[[
    函数:返回一个在[min, max]区间内的随机数。
    ]]
    ProbabilityFunc.GetRandomNumber = function(min, max)
    local random = math.random(min, max)

    --print("ProbabilityFunc.GetRandomNumber: random = "..random)
    return random
    end


    --[[
    函数:查看index是否是下限保底物品。liyan
    返回:
    参数1: true/nil。
    ]]
    ProbabilityFunc.IsLowerItem = function(id)
    for _, one in ipairs(ProbabilityConf.lowerItems) do
    if one.id == id then
    return one
    end
    end
    return
    end


    --[[
    函数:index对应的物品是否可以被抽取。
    返回:
    参数1: true/nil,true表示物品可以被抽取,nil表示不能被抽取。
    ]]
    ProbabilityFunc.CanBeGiven = function(id)
    --是否是下限保底物品
    local oneLower = ProbabilityFunc.IsLowerItem(id)
    if not oneLower then return true end

    local lowerIndex = ProbaData.Lower[id]
    local needChouJiangTime = oneLower.grade[lowerIndex+1]
    --print("lowerIndex = "..lowerIndex)
    --print("needChouJiangTime = "..needChouJiangTime)
    --print("ProbaData.LoterryTimes = "..ProbaData.LoterryTimes)
    if not needChouJiangTime then return true end --已经突破了下限保底

    --大于配置中的值,才可以被抽取
    return needChouJiangTime < ProbaData.LoterryTimes
    end


    --[[
    函数:本次抽奖获得的物品。
    返回:
    参数1: ProbabilityConf.rewards中的索引。
    ]]
    ProbabilityFunc.GetItem = function()
    local random = ProbabilityFunc.GetRandomNumber(1, 10000)
    print("ProbabilityFunc.GetItem: random = "..random)

    local value, index = 0, 0
    for i, itemInfo in ipairs(ProbabilityConf.rewards) do
    index = i
    value = value + itemInfo.rate
    if value >= random and ProbabilityFunc.CanBeGiven(itemInfo.id) then
    --print("ProbabilityFunc.GetItem: i = "..i)
    return i
    end
    end

    return index
    end


    --函数:根据index打印物品信息。
    ProbabilityFunc.PrintItem = function(index)
    local itemInfo = ProbabilityConf.rewards[index]

    if not itemInfo then
    print("ProbabilityFunc.PrintItem: invalid index "..index)
    return
    end

    local str = string.format("you have id = %d, name = %s", itemInfo.id, itemInfo.name)
    print(str)
    end


    --函数:一次抽奖结束后,记录一些信息。
    ProbabilityFunc.RecordAfter = function(index)
    --记录玩家抽奖次数
    ProbaData.LoterryTimes = ProbaData.LoterryTimes + 1

    --记录保底物品被抽中
    local itemInfo = ProbabilityConf.rewards[index]
    if itemInfo then
    if ProbaData.Lower[itemInfo.id] then
    ProbaData.Lower[itemInfo.id] = ProbaData.Lower[itemInfo.id] + 1
    end
    end
    end


    --函数:抽奖业务。
    ProbabilityFunc.Lottery = function(num)
    local str = string.format("you have %d times", num)
    print(str)

    for i = 1, num do
    local index = ProbabilityFunc.GetItem()
    ProbabilityFunc.RecordAfter(index)

    ProbabilityFunc.PrintItem(index)
    end

    --debug,不需要的话,可以注释掉此函数的调用
    ProbabilityFunc.Debug()
    end


    --函数:初始化数据。
    ProbabilityFunc.InitData = function()
    ProbaData.Lower = {}

    for _, oneItem in ipairs(ProbabilityConf.lowerItems) do
    ProbaData.Lower[oneItem.id] = 0
    end
    ProbaData.LoterryTimes = 0
    end


    ProbabilityFunc.Debug = function()
    print(" -----ProbabilityFunc.Debug----")

    local str = string.format("DEBUG: you have loterry %d times", ProbaData.LoterryTimes)
    print(str)
    for _, oneItem in ipairs(ProbabilityConf.lowerItems) do
    print(oneItem.id, ProbaData.Lower[oneItem.id])
    end

    print("-----ProbabilityFunc.Debug---- ")
    end


    --函数:初始化
    ProbabilityFunc.Init = function()
    ProbabilityFunc.InitRandom()
    ProbabilityFunc.InitData()
    end


    --函数:脚本入口函数
    ProbabilityFunc.main = function()
    ProbabilityFunc.Init()

    local read
    while true do
    print("Enter a number to start, or 'quit' to exit:")
    read = io.read()
    if read == "quit" then break end
    --------------------------------------------

    ProbabilityFunc.Lottery(tonumber(read))
    print()
    end

    print("Exit!!!")
    end


    ProbabilityFunc.main()
    ————————————————
    版权声明:本文为CSDN博主「xiaoyanzi521」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/iirecord/article/details/20306421

  • 相关阅读:
    详解股票买卖算法的最优解(一)
    Broker的主从架构是怎么实现的?
    和同事谈谈Flood Fill 算法
    聊一聊RocketMQ的注册中心NameServer
    你懂RocketMQ 的架构原理吗?
    常见的消息中间件有哪些?你们是怎么进行技术选型的?
    什么是消息中间件?主要作用是什么?
    @staticmethod
    Pandas 简介
    pytorch 不同版本对应的cuda
  • 原文地址:https://www.cnblogs.com/vana/p/12203818.html
Copyright © 2011-2022 走看看