168 lines
4.4 KiB
Lua
168 lines
4.4 KiB
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[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
|
||
|
|
||
|
|
||
|
|