记录一个简单的24点游戏代码(Lua)

废话不多打了,直接上代码得了

local _24PointManager = {}
local _24PointResult = 24
local OperateType = {
    Add = 1,
    Sub = 2,
    Mul = 3,
    Div = 4,
}

local TempNumberLine = {}
local TempNumberList = {}
local HandlerList = {}
local Handlers = {
    [OperateType.Add] = function (a, b) return a + b end,
    [OperateType.Sub] = function (a, b) return a - b end,
    [OperateType.Mul] = function (a, b) return a * b end,
    [OperateType.Div] = function (a, b) return a / b end,
}

local OperateSymbol = {
    [OperateType.Add] = " + ",
    [OperateType.Sub] = " - ",
    [OperateType.Mul] = " * ",
    [OperateType.Div] = " / ",
}

local function InitOperateMap()
    for _, operate_1 in pairs(OperateType) do
        for _, operate_2 in pairs(OperateType) do
            for _, operate_3 in pairs(OperateType) do
                local operates = {operate_1, operate_2, operate_3}
                table.insert(HandlerList, operates)
            end
        end
    end
end

local function CopyNumberTable(t)
    local new_t = {}
    for k, v in pairs(t) do
        new_t[k] = v
    end

    return new_t
end

local function Swap(t, i1, i2)
    local new_t = _24PointManager.CopyNumberTable(t)
    local temp = new_t[i1]
    new_t[i1] = new_t[i2]
    new_t[i2] = new_t
    return new_t
end

local function GetNumberMap(nums)
    for i = 1, #nums do
        TempNumberLine[#nums] = nums[i]
        if #nums == 1 then
            table.insert(TempNumberList, TempNumberLine)
            TempNumberLine = _24PointManager.CopyNumberTable(TempNumberLine)
            return
        end

        local tempNums = _24PointManager.CopyNumberTable(nums)
        table.remove(tempNums, i)

        _24PointManager.GetNumberMap(tempNums)
    end
end

local function DoCal(operates, numbers)
    local result = numbers[1]

    for i, operate in ipairs(operates) do
        result = Handlers[operate](result, numbers[i + 1])
    end

    if math.abs(result - _24PointResult) > 0.0001 then
        return false
    end

    _24PointManager.PrintResult(operates, numbers, result)
    return true
end

local function PrintResult(operates, numbers, result)
    local str = tostring(numbers[1])

    for i, operate in ipairs(operates) do
        str = str .. OperateSymbol[operate] .. numbers[i + 1]
    end

    XLog.Error("[dragon] ---------->>", str .. " = " .. result, "<<----------")
end

function _24PointManager.GetResult(nums)
    local resultCount = 0
    TempNumberList = {}

    for k, v in pairs(nums) do
        nums[k] = tonumber(v)
    end

    _24PointManager.GetNumberMap(nums)
    XLog.Debug("24点结果:")
    for _, operates in pairs(HandlerList) do
        for _, numbers in pairs(TempNumberList) do
            if _24PointManager.DoCal(operates, numbers) then
                resultCount = resultCount + 1
            end
        end
    end

    XLog.Debug("[dragon] 匹配数量:", resultCount)
end

-- 初始化符号表
InitOperateMap()

return _24PointManager

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值