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