脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Lua - lua+love2d制作的2048游戏

lua+love2d制作的2048游戏

2020-04-20 12:28脚本之家 Lua

前面给大家分享的是一个超级简单版的使用lua实现的2048小游戏的代码,今天我们加上love2d游戏引擎,制作PC版的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深入探究Lua中的解析表达式

    深入探究Lua中的解析表达式

    这篇文章主要介绍了深入探究Lua中的解析表达式,对于其语法部分的说明和示例都超详细,极力推荐此文!需要的朋友可以参考下 ...

    脚本之家3542020-05-05
  • LuaLua实现__add方法重载示例

    Lua实现__add方法重载示例

    这篇文章主要介绍了Lua实现__add方法重载示例,本文直接给出实现代码,需要的朋友可以参考下 ...

    脚本之家7452020-04-24
  • LuaLua中计算、执行字符串中Lua代码的方法

    Lua中计算、执行字符串中Lua代码的方法

    这篇文章主要介绍了Lua中计算、执行字符串中Lua代码的方法,类似JavaScript中eval函数的功能,在Lua中也可以实现,需要的朋友可以参考下 ...

    脚本之家6322020-04-30
  • LuaLua中table库函数方法介绍

    Lua中table库函数方法介绍

    这篇文章主要介绍了Lua中table库函数方法介绍,本文讲解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以参考下 ...

    脚本之家2502020-04-17
  • LuaLua中的元方法__newindex详解

    Lua中的元方法__newindex详解

    这篇文章主要介绍了Lua中的元方法__newindex详解,本文讲解了查询与更新、监控赋值、通过table给另一个table赋值等内容,需要的朋友可以参考下 ...

    笨木头8872020-04-09
  • LuaLua和C语言的交互详解

    Lua和C语言的交互详解

    这篇文章主要介绍了Lua和C语言的交互详解,Lua和C语言通过栈完成交互,本文结合代码实例详细讲解了交互的方法,需要的朋友可以参考下 ...

    果冻想3702020-04-14
  • LuaLua简介、编译安装教程及变量等语法介绍

    Lua简介、编译安装教程及变量等语法介绍

    这篇文章主要介绍了Lua简介、编译安装教程及变量等语法介绍,本文同时讲解了lua注释语法、Lua命令行方式等内容,需要的朋友可以参考下 ...

    junjie3632020-04-14
  • LuaLua教程(二):基础知识、类型与值介绍

    Lua教程(二):基础知识、类型与值介绍

    这篇文章主要介绍了Lua教程(二):基础知识、类型与值介绍,本文讲解了Hello World程序、代码规范、全局变量、类型与值等内容,需要的朋友可以参考下 ...

    脚本之家5922020-04-28