Getting issues
This commit is contained in:
parent
a22ab50f54
commit
14fc9693bb
43
board.lua
43
board.lua
|
@ -2,7 +2,7 @@ local Board = {}
|
|||
function Board.new()
|
||||
local debug = false
|
||||
|
||||
local width = 10
|
||||
local width = 6
|
||||
local tile_width = 10
|
||||
local padding = 1
|
||||
local tiles = {}
|
||||
|
@ -102,19 +102,21 @@ function Board.new()
|
|||
return #self:get_issues() == 0
|
||||
end,
|
||||
|
||||
-- returns a list of issues of the board's current state
|
||||
get_issues = function(self, details)
|
||||
local rows = self:get_rows()
|
||||
local issues = {}
|
||||
for y,row in ipairs(rows) do
|
||||
local filled = count(row, 0) == 0
|
||||
-- check count
|
||||
if count(row, BLUE) ~= count(row, YELLOW) then
|
||||
if filled and count(row, BLUE) ~= count(row, YELLOW) then
|
||||
add(issues, {"row", "count", row, y})
|
||||
if (debug) printh("uneven count on row "..y)
|
||||
if (not details) return issues
|
||||
end
|
||||
-- check identical lines
|
||||
for k,other in ipairs(rows) do
|
||||
if equal(other, row) and other ~= row then
|
||||
if filled and equal(other, row) and other ~= row then
|
||||
add(issues, {"row", "identical", row, y, k})
|
||||
if (debug) printh("equal rows "..k)
|
||||
if (not details) return issues
|
||||
|
@ -130,15 +132,17 @@ function Board.new()
|
|||
|
||||
local cols = self:get_cols()
|
||||
for x,col in ipairs(cols) do
|
||||
local filled = count(col, 0) == 0
|
||||
|
||||
-- check count
|
||||
if count(col, BLUE) ~= count(col, YELLOW) then
|
||||
if filled and count(col, BLUE) ~= count(col, YELLOW) then
|
||||
add(issues, {"col", "count", col, x})
|
||||
if (debug) printh("uneven count")
|
||||
if (not details) return issues
|
||||
end
|
||||
-- check identical lines
|
||||
for k,other in ipairs(cols) do
|
||||
if equal(other, col) and other ~= col then
|
||||
if filled and equal(other, col) and other ~= col then
|
||||
add(issues, {"col", "identical", col, x, k})
|
||||
if (debug) printh("equal cols")
|
||||
if (not details) return issues
|
||||
|
@ -163,7 +167,7 @@ function Board.new()
|
|||
top = max(current, top)
|
||||
current = 1
|
||||
last = v
|
||||
else
|
||||
elseif v~= 0 then
|
||||
current += 1
|
||||
end
|
||||
end
|
||||
|
@ -214,6 +218,7 @@ function Board.new()
|
|||
self:fill_lines()
|
||||
self:no_identical_lines()
|
||||
local changed = zeroes ~= count(tiles, 0)
|
||||
|
||||
if not changed and random and not self:is_complete() then
|
||||
-- Set a random color
|
||||
local z = self:get_random_zero()
|
||||
|
@ -333,31 +338,25 @@ function Board.new()
|
|||
end
|
||||
end,
|
||||
|
||||
-- Finds "identical" lines, and fill the 2 remaining tiles with inverted colors
|
||||
no_identical_lines = function(self)
|
||||
-- columns
|
||||
local cols = self:get_cols()
|
||||
for x,col in ipairs(cols) do
|
||||
-- if the line has the corrent number of colors,
|
||||
-- but missing 2 tiles
|
||||
if count(col, 0) == 2 and count(col, BLUE) == count(col, YELLOW) then
|
||||
local y1, y2 = unpack(find(col, 0))
|
||||
local y1, y2 = unpack(find(col, 0)) -- get the position of the 2 missing tiles
|
||||
-- create both both solutions
|
||||
local ab = copy(col) ab[y1] = BLUE ab[y2] = YELLOW
|
||||
local ba = copy(col) ba[y1] = YELLOW ba[y2] = BLUE
|
||||
-- Check if a dupe exists
|
||||
for x2,col in ipairs(cols) do
|
||||
if equal(col, ab) then
|
||||
if debug then
|
||||
printh("No-dupe at col " .. x .. " from col " .. x2)
|
||||
printh(" " .. self:xy_idx(x,y1) .. " in yellow")
|
||||
printh(" " .. self:xy_idx(x,y2) .. " in blue")
|
||||
end
|
||||
self:fill(self:xy_idx(x,y1), YELLOW)
|
||||
self:fill(self:xy_idx(x,y2), BLUE)
|
||||
goto continue
|
||||
elseif equal(col, ba) then
|
||||
if debug then
|
||||
printh("No-dupe at col " .. x .. " from col " .. x2)
|
||||
printh(" " .. self:xy_idx(x,y1) .. " in blue")
|
||||
printh(" " .. self:xy_idx(x,y2) .. " in yellow")
|
||||
end
|
||||
self:fill(self:xy_idx(x,y1), BLUE)
|
||||
self:fill(self:xy_idx(x,y2), YELLOW)
|
||||
goto continue
|
||||
|
@ -377,20 +376,10 @@ function Board.new()
|
|||
-- Check if a dupe exists
|
||||
for y2,row in ipairs(rows) do
|
||||
if equal(row, ab) then
|
||||
if debug then
|
||||
printh("No-dupe at row " .. y .. " from row " .. y2)
|
||||
printh(" " .. self:xy_idx(x1,y) .. " in yellow")
|
||||
printh(" " .. self:xy_idx(x2,y) .. " in blue")
|
||||
end
|
||||
self:fill(self:xy_idx(x1,y), YELLOW)
|
||||
self:fill(self:xy_idx(x2,y), BLUE)
|
||||
goto continue
|
||||
elseif equal(row, ba) then
|
||||
if debug then
|
||||
printh("No-dupe at row " .. y .. " from row " .. y2)
|
||||
printh(" " .. self:xy_idx(x1,y) .. " in blue")
|
||||
printh(" " .. self:xy_idx(x2,y) .. " in yellow")
|
||||
end
|
||||
self:fill(self:xy_idx(x1,y), BLUE)
|
||||
self:fill(self:xy_idx(x2,y), YELLOW)
|
||||
goto continue
|
||||
|
|
7
main.lua
7
main.lua
|
@ -107,10 +107,9 @@ function _init()
|
|||
printh(" ")
|
||||
printh("*************")
|
||||
printh(" ")
|
||||
local date = stat(80)..stat(81)..stat(82)
|
||||
-- srand(date)
|
||||
-- srand(20227149)
|
||||
printh(date)
|
||||
local date = stat(80)..stat(81)..stat(82)..stat(84)..stat(85)
|
||||
srand(date)
|
||||
printh("seed " .. date)
|
||||
mouse_x = 0
|
||||
mouse_y = 0
|
||||
|
||||
|
|
|
@ -5,11 +5,15 @@ function state_game()
|
|||
local timer_clue = 0
|
||||
|
||||
local function show_clues()
|
||||
-- local result = board:is_valid()
|
||||
-- if result ~= true and result ~= false then
|
||||
-- local rule,what,where = unpack(result)
|
||||
-- --printh("Rule: " .. rule .. " " .. what .. " " .. where[1].. " " .. where[2])
|
||||
-- end
|
||||
local issues = board:get_issues(true)
|
||||
for issue in all(issues) do
|
||||
local type, err, row, pos, other = unpack(issue)
|
||||
if err == "identical" and count(row,0)>0 then
|
||||
goto continue
|
||||
end
|
||||
printh(type .. " " .. err .. " " .. pos)
|
||||
::continue::
|
||||
end
|
||||
end
|
||||
|
||||
local function draw_selected_tile()
|
||||
|
|
|
@ -27,6 +27,7 @@ function state_loading()
|
|||
local removing_tile = 0
|
||||
|
||||
local create_board = cocreate(function()
|
||||
local start = time()
|
||||
repeat
|
||||
board:reset()
|
||||
repeat
|
||||
|
@ -35,8 +36,6 @@ function state_loading()
|
|||
until board:is_complete()
|
||||
until board:is_valid()
|
||||
|
||||
printh("b: " .. time())
|
||||
|
||||
-- Remove tiles that can be removed
|
||||
local previous = {board:get_tiles_copy()} -- initial state
|
||||
local size = board:get_size()*board:get_size()
|
||||
|
@ -64,7 +63,7 @@ function state_loading()
|
|||
deli(previous)
|
||||
end
|
||||
end -- end while
|
||||
printh("c: " .. time())
|
||||
printh("board generated in "..time()-start.." seconds")
|
||||
|
||||
board:set_tiles(previous[#previous])
|
||||
printh(board:tostring())
|
||||
|
|
Loading…
Reference in New Issue
Block a user