源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

lua+love2d制作的2048游戏

  • 时间:2021-01-09 09:43 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:lua+love2d制作的2048游戏
使用lua和love2d编写的pc版2048游戏,适用于linux和windows平台。依赖love2d游戏引擎,love2d需0.9及以上版本。 core.lua
[u]复制代码[/u] 代码如下:
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
[u]复制代码[/u] 代码如下:
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小游戏的代码,能给到大家一些帮助
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部