function stateGame() local board = Board.new() local selectedId = 1 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 _enter() -- Create a board repeat board:reset() repeat board:solveStep(true) until board:isComplete() until board:isValid() -- Remove tiles until randomness is unavoidable local previous = {board:getTilesCopy()} -- initial state local invalidcount = 0 while true do -- remove a random tile board:setTiles(previous[#previous]) local i = board:getRandomNonZero() board:fill(i, 0) add(previous, board:getTilesCopy()) -- try to solve the board local solved = "" repeat solved = board:solveStep() until board:isComplete() or solved == "invalid" if board:isComplete() then invalidcount = 0 end if solved == "invalid" then deli(previous) invalidcount += 1 end if invalidcount == 100 then break end end -- end while board:setTiles(previous[#previous]) printh(board:tostring()) end local function _draw() 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 printh(x.." "..y) 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