plan_war/core.lua

168 lines
4.4 KiB
Lua
Raw Permalink Normal View History

2025-05-13 17:52:48 +08:00
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[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, lned, 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 + kend
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
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
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