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小游戏的代码,能给到大家一些帮助