pico8-0hh1/states/game.lua

91 lines
1.7 KiB
Lua

function stateGame()
local board = Board.new()
local selectedId = 1
local function drawSelectedTile()
local x, y = board:draw_coords(selectedId)
local w = board:getTileWidth()
rect2(x-1, y-1, w+2, w+2, 6)
end
local function create_board()
printh("a: " .. time())
repeat
board:reset()
repeat
board:solveStep(true)
yield()
until board:isComplete()
until board:isValid()
printh("b: " .. time())
-- Remove tiles until randomness is unavoidable
local previous = {board:getTilesCopy()} -- initial state
local i = 0
while true do
board:setTiles(previous[#previous])
-- remove a random tile
repeat
i += 1
until i == 100 or board:getTilesCopy()[i] ~= 0
if i == 100 then
break
end
board:fill(i, 0)
add(previous, board:getTilesCopy())
-- try to solve the board
local solved = ""
yield()
repeat
solved = board:solveStep()
until board:isComplete() or solved == "invalid"
if solved == "invalid" then
deli(previous)
end
end -- end while
printh("c: " .. time())
board:setTiles(previous[#previous])
printh(board:tostring())
printh(count(board:getTilesCopy(), 0).." zeroes")
end
local function _enter()
cocreate(create_board)
end
local function _draw()
cls()
board:draw()
drawSelectedTile()
end
local function _update()
local size = board:getSize()
local x, y = board:idx_xy(selectedId)
if btnp(UP) then
y -= 1
elseif btnp(DOWN) then
y += 1
elseif btnp(LEFT) then
x -= 1
elseif btnp(RIGHT) then
x += 1
end
if (x<1) x=size
if (x>size) x=1
if (y<1) y=size
if (y>size) y=1
selectedId = board:xy_idx(x, y)
end
return {
_enter = _enter,
_update = _update,
_draw = _draw,
}
end