diff --git a/funcs.lua b/funcs.lua index cd1bed1..77a8284 100644 --- a/funcs.lua +++ b/funcs.lua @@ -66,4 +66,13 @@ end function Mod1(n, m) -- returns a number congruent to n modulo m in the range [1;m] (as opposed to [0;m-1]) return ((n-1) % m) + 1 -end \ No newline at end of file +end + +function table.contains(table, element) + for _, value in pairs(table) do + if value == element then + return true + end + end + return false + end \ No newline at end of file diff --git a/load/graphics.lua b/load/graphics.lua index b527e0d..73fd409 100644 --- a/load/graphics.lua +++ b/load/graphics.lua @@ -61,6 +61,11 @@ blocks = { F = love.graphics.newImage("res/img/gem9.png"), A = love.graphics.newImage("res/img/gem9.png"), X = love.graphics.newImage("res/img/gem9.png"), + }, + ["square"] = { + F = love.graphics.newImage("res/img/squares.png"), + Y = love.graphics.newImage("res/img/squareg.png"), + X = love.graphics.newImage("res/img/squares.png"), } } diff --git a/res/img/squareg.png b/res/img/squareg.png new file mode 100644 index 0000000..e1fae09 Binary files /dev/null and b/res/img/squareg.png differ diff --git a/res/img/squares.png b/res/img/squares.png new file mode 100644 index 0000000..34eb958 Binary files /dev/null and b/res/img/squares.png differ diff --git a/tetris/components/grid.lua b/tetris/components/grid.lua index 3078b1d..d6c81da 100644 --- a/tetris/components/grid.lua +++ b/tetris/components/grid.lua @@ -100,12 +100,14 @@ end function Grid:getClearedRowCount() local count = 0 + local cleared_row_table = {} for row = 1, self.height do if self:isRowFull(row) then count = count + 1 + table.insert(cleared_row_table, row) end end - return count + return count, cleared_row_table end function Grid:markClearedRows() @@ -299,6 +301,80 @@ function Grid:applyMap(map) end end +-- inefficient algorithm for squares +function Grid:markSquares() + -- goes up by 1 for silver, 2 for gold + local square_count = 0 + for i = 1, 2 do + for y = 5, self.height - 3 do + for x = 1, self.width - 3 do + local age_table = {} + local age_count = 0 + local colour_table = {} + local is_square = true + for j = 0, 3 do + for k = 0, 3 do + if self.grid[y+j][x+k].skin == "" or self.grid[y+j][x+k].skin == "square" then + is_square = false + end + if age_table[self.grid_age[y+j][x+k]] == nil then + age_table[self.grid_age[y+j][x+k]] = 1 + age_count = age_count + 1 + else + age_table[self.grid_age[y+j][x+k]] = age_table[self.grid_age[y+j][x+k]] + 1 + end + if age_count > 4 or age_table[self.grid_age[y+j][x+k]] > 4 then + is_square = false + end + if not table.contains(colour_table, self.grid[y+j][x+k].colour) then + table.insert(colour_table, self.grid[y+j][x+k].colour) + end + end + end + if is_square then + if i == 1 and #colour_table == 1 then + for j = 0, 3 do + for k = 0, 3 do + self.grid[y+j][x+k].colour = "Y" + self.grid[y+j][x+k].skin = "square" + end + end + square_count = square_count + 2 + elseif i == 2 then + for j = 0, 3 do + for k = 0, 3 do + self.grid[y+j][x+k].colour = "F" + self.grid[y+j][x+k].skin = "square" + end + + end + square_count = square_count + 1 + end + end + end + end + end + return square_count +end + +-- square scan +function Grid:scanForSquares() + local table = {} + for row = 1, self.height do + local silver = 0 + local gold = 0 + for col = 1, self.width do + local colour = self.grid[row][col].colour + if self.grid[row][col].skin == "square" then + if colour == "Y" then gold = gold + 1 + else silver = silver + 1 end + end + end + table[row] = gold * 2.5 + silver * 1.25 + end + return table +end + function Grid:update() for y = 1, self.height do for x = 1, self.width do