• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    lua+love2d制作的2048游戏

    使用lua和love2d编写的pc版2048游戏,适用于linux和windows平台。依赖love2d游戏引擎,love2d需0.9及以上版本。

    core.lua

    复制代码 代码如下:

    core = {}
    core.block = {}
    core.score = 0
    core.best = 0
    love.filesystem.setIdentity("2048")
    local function get_best()
        if not love.filesystem.exists("best") then
            core.best = 0
            return
        end
        core.best = love.filesystem.read("best")
        core.best = tonumber(core.best)
    end
    function core.initial()
        core.block = {}
        local pos1 = love.math.random(1, 16)
        local pos2
        while true do
            pos2 = love.math.random(1, 16)
            if pos2 ~= pos1 then break end
        end
        local val
        val = love.math.random()
        if val 0.8 then val = 2 else val = 4 end
        core.block[pos1] = val
        val = love.math.random()
        if val 0.8 then val = 2 else val = 4 end
        core.block[pos2] = val
        core.score = 0
    end
    function core.set_best()
        if core.score > core.best then
            core.best = core.score
            local ret, err = love.filesystem.write("best", core.best)
        end
    end
    function core.tblclone(t1, num)
        local t2 = {}
        for i = 1, num do
            t2[i] = t1[i]
        end
        return t2
    end
    function core.isfull(testtbl)
        local block
        if testtbl then block = testtbl else block = core.block end
        for i = 1, 16 do
            if not block[i] then return false end
        end
        return true
    end
    local function combine(lstart, lend, lstep, rstart, rend, rstep, flag, testtbl)
        local index
        local tflag, block
        if testtbl then
            tflag = true
            block = testtbl
        else
            block = core.block
        end
        local cflag = false
        for i = lstart, lend, lstep do
            for j = rstart, rend, rstep do
                if flag == "up" then index = (i - 1) * 4 + j
                elseif flag == "down" then index = (i + 1) * 4 + j
                elseif flag == "left" then index = i * 4 + j - 1
                else index = i * 4 + j + 1 end
                if block[index] and block[i * 4 + j] and
                block[index] == block[i * 4 + j] and
                block[index] 2048 then
                    cflag = true
                    if tflag then return cflag end
                    block[index] = 2 * block[i * 4 + j]
                    block[i * 4 + j] = nil
                    core.score = core.score + block[index]
                end
            end
        end
        return cflag
    end
    local function move(lstart, lend, lstep, rstart, rend, rstep, flag)
        local mflag = false
        local index, kstart, kend, kstep
        for i = lstart, lend, lstep do
            for j = rstart, rend, rstep do
                if flag == "up" then
                    kstart = 0
                    kend = i - 1
                    kstep = 1
                elseif flag == "down" then
                    kstart = 3
                    kend = i + 1
                    kstep = -1
                elseif flag == "left" then
                    kstart = 1
                    kend = j - 1
                    kstep = 1
                else
                    kstart = 4
                    kend = j + 1
                    kstep = -1
                end
                for k = kstart, kend, kstep do
                    if flag == "up" or flag == "down" then index = k * 4 + j
                    else index = i * 4 + k end
                    if not core.block[index] and core.block[i * 4 + j] then
                        core.block[index] = core.block[i * 4 + j]
                        core.block[i * 4 + j] = nil
                        mflag = true
                        break
                    end
                end
            end
        end
        return mflag
    end
    local function do_tsk(lstart, lend, lstep, rstart, rend, rstep, flag, testtbl)
        if testtbl then return combine(lstart, lend, lstep, rstart, rend, rstep, flag, testtbl) end
        local mret = move(lstart, lend, lstep, rstart, rend, rstep, flag)
        local cret = combine(lstart, lend, lstep, rstart, rend, rstep, flag)
        if not mret and not cret then return false end
        core.score = core.score + 1
        move(lstart, lend, lstep, rstart, rend, rstep, flag)
        return true
    end
    function core.up_move(testtbl)
        return do_tsk(1, 3, 1, 1, 4, 1, "up", testtbl)
    end
    function core.down_move(testtbl)
        return do_tsk(2, 0, -1, 1, 4, 1,"down", testtbl)
    end
    function core.left_move(testtbl)
        return do_tsk(0, 3, 1, 2, 4, 1, "left", testtbl)
    end
    function core.right_move(testtbl)
        return do_tsk(0, 3, 1, 3, 1, -1, "right", testtbl)
    end
    function core.new_block()
        local val = love.math.random()
        if val 0.8 then val = 2 else val = 4 end
        local empty_tbl = {}
        for i = 1, 16 do
            if not core.block[i] then
                table.insert(empty_tbl, i)
            end
        end
        if #empty_tbl == 1 then
            return {index = empty_tbl[1], value = val}
        end
        local pos = love.math.random(1, #empty_tbl)
        return {index = empty_tbl[pos], value = val}
    end
    get_best()
    return core

    main.lua

    复制代码 代码如下:

    local core = require("core")
    local block_pic = {}
    local bk
    local over_flag = false
    local new_block = {flag = false}
    local wH    --window height
    local wW    --window weight
    local bW    --block width
    local startpos = {}
    local delay = 0
    function love.load()
        love.window.setFullscreen()
        wH = love.window.getHeight()
        wW = love.window.getWidth()
        bW = 0.8 * wH / 4
        bk = love.graphics.newImage("src/bk.jpg")
        for i = 1, 11 do
            block_pic[tostring(math.pow(2,i))] = love.graphics.newImage("src/"..tostring(math.pow(2,i))..".PNG")
        end
        love.graphics.setBackgroundColor(255, 255, 255)
        love.graphics.setNewFont(24)
        love.graphics.setColor(255, 255, 255)
        core.initial()
    end
    local function draw_block(index, value)
        local line = math.modf((index - 1)/4)
        local row = (index - 1) % 4
        local pic_index = tostring(value)
        love.graphics.draw(block_pic[pic_index], 0.1 * wH + row * bW, 0.1 * wH + line * bW, 0, bW/block_pic[pic_index]:getWidth(), bW/block_pic[pic_index]:getHeight())
    end
    function love.draw()
        local scorestr = "SCORE:\n"..core.score.."\nBEST:\n"..core.best
        love.graphics.draw(bk, 0, 0, 0, wW/bk:getWidth(), wH/bk:getHeight())
        love.graphics.setColor(255, 255, 255)
        love.graphics.rectangle("line", 0.1 * wH, 0.1 * wH, 0.8 * wH, 0.8 * wH)
        for i = 1, 16 do
            if core.block[i] then
                draw_block(i, core.block[i])
            end
        end
        if new_block.flag then
            if delay 10 then delay = delay + 1
            else
                draw_block(new_block.index, new_block.value)
                core.block[new_block.index] = new_block.value
                new_block.flag = false
                delay = 0
            end
        end
        love.graphics.print(scorestr, wH, wH * 0.1)
        if over_flag then
            love.graphics.setColor(0, 0, 255)
            love.graphics.rectangle("fill", 0.25 * wW, 0.25 * wH, 0.5 * wW, 0.5 * wH)
            love.graphics.setColor(255,255,255)
            love.graphics.print(scorestr, 0.45 * wW, 0.45 * wH)
        end
    end
    function love.mousepressed(x, y, button)
        if button == 'l' then
            startpos.x = x
            startpos.y = y
        end
    end
    function love.mousereleased(x, y, button)
        if button == 'l' then
            if over_flag then
                over_flag = false
                core.initial()
                return
            end
            local x_dis = x - startpos.x
            local y_dis = y - startpos.y
            local ret
            if y_dis 0 and math.abs(y_dis) > math.abs(x_dis) then
                ret = core.up_move()
            elseif y_dis > 0 and math.abs(y_dis) > math.abs(x_dis) then
                ret = core.down_move()
            elseif x_dis 0 and math.abs(x_dis) > math.abs(y_dis) then
                ret = core.left_move()
            elseif x_dis > 0 and math.abs(x_dis) > math.abs(y_dis) then
                ret = core.right_move()
            end
            if not ret then return end
            new_block = core.new_block()
            if not new_block then return end
            new_block.flag = true
            local testtbl = core.tblclone(core.block, 16)
            testtbl[new_block.index] = new_block.value
            if core.isfull(testtbl) then
                if core.up_move(testtbl) or core.down_move(testtbl) or core.left_move(testtbl) or core.right_move(testtbl) then
                    return
                end
                core.set_best()
                over_flag = true
            end
        end
    end

    以上便是本文的全部内容了,希望大家能够喜欢。也希望通过这几个2048小游戏的代码,能给到大家一些帮助

    您可能感兴趣的文章:
    • lua实现的2048小游戏
    • Lua脚本语言简明入门教程
    • Lua游戏开发教程之时区问题详解
    上一篇:lua实现的2048小游戏
    下一篇:使用nginx+lua实现信息访问量统计
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    lua+love2d制作的2048游戏 lua+love2d,制作,的,2048,游戏,