From 7fcd9b4ee0b59f8ec1d4eb38aabe46d0d45a6f2f Mon Sep 17 00:00:00 2001 From: Simon Cambier Date: Thu, 2 Jun 2022 17:55:52 +0200 Subject: [PATCH] Commit before algo change --- 0hh1.p8 | 1 + coroutines.lua | 43 +++++++++++++++++++++++++++++++++++++++++++ main.lua | 5 ++--- states/game.lua | 22 ++++++++++++++++------ states/rules.lua | 2 +- 5 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 coroutines.lua diff --git a/0hh1.p8 b/0hh1.p8 index c6fcab1..ac0aecd 100644 --- a/0hh1.p8 +++ b/0hh1.p8 @@ -10,6 +10,7 @@ poke4(0x5700,unpack(split"0x0000.0000,0x0000.0000,0x0202.0202,0x0000.0200,0x0000 #include main.lua #include board.lua +#include coroutines.lua #include ui.lua #include states/menu.lua #include states/game.lua diff --git a/coroutines.lua b/coroutines.lua new file mode 100644 index 0000000..52603e2 --- /dev/null +++ b/coroutines.lua @@ -0,0 +1,43 @@ +local coroutines={} + +local _cocounter = 0 +local _cocreate = cocreate + +function cocreate(fn) + _cocounter += 1 + k = k or _cocounter + coroutines[_cocounter] = _cocreate(fn, k) + return coroutines[_cocounter], _cocounter +end + +function getcoroutine(key) + return coroutines[key] +end + +function stepcoroutine(key) + coresume(coroutines[key]) +end + +function stopcoroutine(key) + coroutines[key] = nil +end + +function _coresolve() + for k,co in pairs(coroutines) do + if costatus(co)!='dead' then + coresume(co) + else + stopcoroutine(k) + end + end +end + +function wait(seconds) + wait_frames(seconds*60) +end + +function wait_frames(frames) + for i=1,frames do + yield() + end +end \ No newline at end of file diff --git a/main.lua b/main.lua index 59bff9e..9a5d1fe 100644 --- a/main.lua +++ b/main.lua @@ -132,7 +132,6 @@ end local create = true function _init() - cls() printh(" ") printh(" ") mouse_x = 0 @@ -146,12 +145,13 @@ function _init() game = stateGame() } - setState(states.menu) + setState(states.game) end function _update60() frameCount += 1 + _coresolve() gs._update() -- if not create then -- board:solveStep() @@ -163,7 +163,6 @@ function _update60() end function _draw() - cls() gs._draw() spr(1, stat(32), stat(33)) end diff --git a/states/game.lua b/states/game.lua index b318418..43fc9e4 100644 --- a/states/game.lua +++ b/states/game.lua @@ -3,33 +3,37 @@ function stateGame() local selectedId = 1 - function drawSelectedTile() + 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 _enter() - -- Create a board + 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 invalidcount = 0 while true do - -- remove a random tile board:setTiles(previous[#previous]) + -- remove a random tile local i = board:getRandomNonZero() 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" @@ -40,16 +44,23 @@ function stateGame() deli(previous) invalidcount += 1 end - if invalidcount == 100 then + if invalidcount > 50 then break end end -- end while + printh("c: " .. time()) board:setTiles(previous[#previous]) printh(board:tostring()) + printh(count(board:getTilesCopy(), 0).." zeroes") + end + + local function _enter() + local c = cocreate(create_board) end local function _draw() + cls() board:draw() drawSelectedTile() end @@ -66,7 +77,6 @@ function stateGame() 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 diff --git a/states/rules.lua b/states/rules.lua index 95ea88b..34bdc3d 100644 --- a/states/rules.lua +++ b/states/rules.lua @@ -11,7 +11,7 @@ function stateRules() setState(states.menu) end - local btnBack = makeButton({x=1, y=118, w=30, h=7, text="❎ mENU", color=8, + local btnBack = makeButton({x=1, y=118, w=30, h=7, text="❎menu", color=8, onClick=function() goBack() end, onHover=function(btn) btn.color = 7 end})