├── README.md ├── block.lua ├── images ├── background.jpg ├── blue.png ├── green.png ├── orange.png ├── pink.png ├── red.png ├── turquoise.png └── yellow.png ├── main.lua └── shape.lua /README.md: -------------------------------------------------------------------------------- 1 | Tetirs Game 2 | 3 | Developed using Love2d framework 4 | Game includes 5 | 1. Algo to produce difficult block - can be tweaked to play in a normal mode 6 | 2. Score 7 | 3. Difficulty level based on the score 8 | 9 | 10 | -------------------------------------------------------------------------------- /block.lua: -------------------------------------------------------------------------------- 1 | 2 | Block = {} 3 | 4 | function Block:new() 5 | o = { 6 | image = nil, 7 | row = 1, 8 | coll = 1, 9 | x = 0, --width in px -32 10 | y = 0 11 | } 12 | 13 | setmetatable(o, self) 14 | self.__index = self 15 | return o 16 | end 17 | 18 | function Block:draw() 19 | love.graphics.draw(self.image, self.x, self.y, 0, 1, 1, 0, 0) 20 | end 21 | 22 | function Block:setTableVal(coll, row) 23 | self.coll = coll 24 | self.row = row 25 | self.x = (coll - 1) * 32 26 | self.y = (row - 1) * 32 27 | --print(self.coll,",",self.row) 28 | end 29 | 30 | function Block:setCoordinates(x, y) 31 | self.x = x 32 | self.y = y 33 | end 34 | -------------------------------------------------------------------------------- /images/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/background.jpg -------------------------------------------------------------------------------- /images/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/blue.png -------------------------------------------------------------------------------- /images/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/green.png -------------------------------------------------------------------------------- /images/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/orange.png -------------------------------------------------------------------------------- /images/pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/pink.png -------------------------------------------------------------------------------- /images/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/red.png -------------------------------------------------------------------------------- /images/turquoise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/turquoise.png -------------------------------------------------------------------------------- /images/yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blganesh101/love2d/3f7f326f9c4534a9e01d69e98e4851f2f3fd726c/images/yellow.png -------------------------------------------------------------------------------- /main.lua: -------------------------------------------------------------------------------- 1 | DrawList = {} 2 | Game = {} 3 | Game.height = 640 4 | Game.width = 320 5 | Game.score = 0 6 | Game.speed = 1 7 | Game.lineCount = 0 8 | Game.nextIncreatment = 5 9 | Game.displayMenu = true 10 | Game.paused = false 11 | Game.EOG = false 12 | 13 | Game.flagCount = 0 14 | 15 | require "shape" 16 | 17 | tmr = 0 18 | 19 | -- load the basic graphics 20 | function love.load() 21 | love.graphics.setCaption("Tetris") 22 | love.graphics.setBackgroundColor(205,183,158) 23 | love.graphics.setMode(Game.width, Game.height, false, true, 0) 24 | love.graphics.setColorMode("replace") 25 | love.graphics.newImage("images/background.jpg") 26 | currentBlock = Shape:new() 27 | currentBlock:initShape() 28 | end 29 | 30 | 31 | --menu to play tetris 32 | function showMenu() 33 | love.graphics.setColor(0, 0, 0, 220) 34 | love.graphics.rectangle("fill", 0, 0, 320, 590 ) 35 | love.graphics.printf("TETRIS" , 80, 160, 150, "center") 36 | love.graphics.printf("Press Enter to start New Game" , 60, 250, 200, "center") 37 | end 38 | 39 | 40 | --pause screen configuration 41 | function showPauseScreen() 42 | love.graphics.setColor(0, 0, 0, 220) 43 | love.graphics.rectangle("fill", 0, 140, 320, 80 ) 44 | love.graphics.printf("Game Paused", 80, 160, 150, "center") 45 | love.graphics.printf("press F1 to Un-pause" , 60, 180, 200, "center") 46 | end 47 | 48 | -- game over 49 | function showGameOver() 50 | love.graphics.setColor(0, 0, 0, 220) 51 | love.graphics.rectangle("fill", 0, 140, 320, 100 ) 52 | love.graphics.printf("Game Over" , 80, 160, 150, "center") 53 | love.graphics.printf("Your Score was: " .. Game.score , 60, 180, 200, "center") 54 | love.graphics.printf("Enter for new game." , 60, 200, 200, "center") 55 | end 56 | 57 | --score window 58 | 59 | function showScore() 60 | love.graphics.setColor(0, 0, 0, 220) 61 | love.graphics.rectangle("fill", 0, 570, 320, 70 ) 62 | love.graphics.printf("Score: " .. Game.score , 10, 600, 80, "left") 63 | love.graphics.printf("Speed: " .. Game.speed .. "s" , 80, 600, 80, "left") 64 | end 65 | 66 | 67 | --new game 68 | function newGame() 69 | DrawList = {} 70 | currentBlock = Shape:new() 71 | currentBlock:initShape() 72 | Game.speed = 0.5 73 | Game.score = 0 74 | Game.EOG = false 75 | Game.paused = false 76 | Game.displayMenu = false 77 | 78 | end 79 | 80 | 81 | function checkGameOver() 82 | for i,v in ipairs(DrawList) do 83 | if v.row <= 1 then 84 | return true 85 | end 86 | end 87 | return false 88 | end 89 | 90 | --love upadte method 91 | function love.update(dt) 92 | math.randomseed(os.time() + dt) 93 | tmr = tmr + dt 94 | 95 | if Game.paused == false and Game.EOG == false then 96 | 97 | if tmr >= Game.speed then 98 | if currentBlock:checkHitFloor() == false and checkHitBlock() == false then 99 | currentBlock:down() 100 | tmr = 0 101 | else 102 | makeNewBlock() 103 | end 104 | end 105 | 106 | local linesThisDelta = checkLine() 107 | Game.lineCount = Game.lineCount + linesThisDelta 108 | --print ("Game.lineCount",Game.lineCount) 109 | Game.EOG = checkGameOver() 110 | Game.score = Game.score + (linesThisDelta * 10) 111 | 112 | if Game.lineCount >= Game.nextIncreatment and linesThisDelta ~= 0 then 113 | Game.speed = Game.speed - 0.1 114 | local r = Game.lineCount % 5 115 | Game.nextIncreatment = (Game.lineCount - r) + 5 116 | end 117 | end 118 | end 119 | 120 | function love.draw() 121 | 122 | for i,v in ipairs(DrawList) do 123 | v:draw() 124 | end 125 | currentBlock:draw() 126 | --Draw the menus and score 127 | if Game.displayMenu == true then 128 | Game.paused = true 129 | showMenu() 130 | elseif Game.displayMenu == false and Game.paused == true then 131 | showPauseScreen() 132 | end 133 | 134 | if Game.EOG == true then 135 | showGameOver() 136 | end 137 | 138 | showScore() 139 | end 140 | 141 | function love.keypressed(e) 142 | 143 | if currentBlock:checkHitWall(e) == false then 144 | currentBlock:move(e) 145 | end 146 | 147 | if e == "down" then 148 | if currentBlock:checkOnScreen() == true then 149 | local flag = false 150 | while flag == false do 151 | if currentBlock:checkHitFloor() == false and checkHitBlock() == false then 152 | currentBlock:down() 153 | else 154 | makeNewBlock() 155 | flag = true 156 | end 157 | end 158 | end 159 | end 160 | 161 | if e == "up" then 162 | currentBlock:rotate() 163 | end 164 | 165 | 166 | if Game.paused == true or Game.displayMenu == true or Game.EOG == true then 167 | if e == "kpenter" or e == "return" then 168 | newGame() 169 | end 170 | end 171 | 172 | if e == "f1" then 173 | if Game.paused == true then 174 | Game.paused = false 175 | else 176 | Game.paused = true 177 | end 178 | end 179 | end 180 | 181 | 182 | function checkHitBlock() 183 | for i,v in ipairs(DrawList) do 184 | for j,w in ipairs(currentBlock.blockArray) do 185 | if w.row + 1 == v.row and w.coll == v.coll then 186 | return true 187 | end 188 | end 189 | end 190 | return false 191 | end 192 | 193 | 194 | function makeNewBlock() 195 | for i,v in ipairs(currentBlock.blockArray) do 196 | table.insert(DrawList, v) 197 | end 198 | --getNextBlock() 199 | 200 | local noOfLines = 0 201 | local lineCount = 0 202 | local lineVals = {} 203 | local colVals = {} 204 | 205 | for i=1,20 do 206 | colVals[i]={} 207 | end 208 | 209 | 210 | --build colVals matrix so that from that we could identify empty nodes 211 | for i = 1, 20 do 212 | local lineCount = 0 213 | local c = 0; 214 | for j,v in ipairs(DrawList) do 215 | if v.row == i then 216 | colVals[i][v.coll]=1 217 | --print(i,v.coll) 218 | lineCount = lineCount + 1 219 | end 220 | 221 | --print(i,j) 222 | 223 | end 224 | --print(lineCount) 225 | table.insert(lineVals, lineCount) 226 | end 227 | 228 | local topRow = 18 229 | 230 | 231 | -- calculate the topmost row, so that we can cut short the other loops and save processing 232 | for i = 1, 18 do 233 | for j = 1,20 do 234 | if colVals[i][j]==1 then 235 | if i <= topRow then 236 | topRow = i; 237 | end 238 | end 239 | end 240 | 241 | end 242 | 243 | local scoreLine = topRow 244 | local nilFlag = true 245 | 246 | 247 | -- find the row num which use is most probably to score the point, so that we can block that line fill 248 | for i = topRow, 18 do 249 | nilFlag = true 250 | for j = 1,20 do 251 | if colVals[i][j]==nil then 252 | for k = topRow,i do 253 | if colVals[k][j] == 1 then 254 | --print(k,j) 255 | nilFlag = false 256 | end 257 | end 258 | end 259 | end 260 | if nilFlag == true then 261 | scoreLine = i 262 | end 263 | 264 | end 265 | 266 | 267 | 268 | 269 | -- identify the num of adjacent empty spaces so that we can fire a appropriate worst block 270 | 271 | local c = 0 272 | local count = 0 273 | local emptyCount = 0 274 | --print("scoreLine: ",scoreLine) 275 | for j = 1,10 do 276 | if colVals[scoreLine][j] == nil then 277 | c = c + 1 278 | emptyCount = emptyCount + 1 279 | --print("c ",j,c) 280 | if c >= count then 281 | count = c 282 | end 283 | 284 | else 285 | c = 0 286 | end 287 | end 288 | 289 | 290 | 291 | if count == 1 and emptyCount == 1 then -- only single empty cell, shoot a cube 292 | currentBlock = Shape:getBlock(1) 293 | currentBlock:initShape() 294 | elseif count == 2 and emptyCount == 2 then -- only single two-cell empty, shoot a line 295 | currentBlock = Shape:getBlock(2) 296 | currentBlock:initShape() 297 | elseif count == 3 and emptyCount == 3 then -- only single three-cell empty, shoot a Z or S 298 | currentBlock = Shape:getBlock(6) 299 | currentBlock:initShape() 300 | else 301 | currentBlock = Shape:new() -- all other cases take a random block 302 | currentBlock:initShape() 303 | 304 | end 305 | 306 | end 307 | 308 | 309 | 310 | 311 | -- function to check the line for removing the successfull complettion 312 | function checkLine() 313 | local noOfLines = 0 314 | local lineCount = 0 315 | local lineVals = {} 316 | local aboveVals = {} 317 | 318 | for i = 1, 20 do 319 | for j,v in ipairs(DrawList) do 320 | if v.row == i then 321 | lineCount = lineCount + 1 322 | table.insert(lineVals, j) 323 | elseif v.row < i then 324 | table.insert(aboveVals, v) 325 | end 326 | end 327 | 328 | if lineCount == 10 then 329 | for j,v in ipairs(lineVals) do 330 | --print("line clear") 331 | --love.graphics.line() 332 | table.remove(DrawList, v - j + 1) 333 | end 334 | for j,v in ipairs(aboveVals) do 335 | v:setTableVal(v.coll, v.row + 1) 336 | end 337 | noOfLines = noOfLines + 1 338 | end 339 | 340 | lineCount = 0 341 | lineVals = {} 342 | aboveVals = {} 343 | end 344 | 345 | --print("no of lines ",noOfLines) 346 | 347 | return noOfLines 348 | end 349 | 350 | 351 | -------------------------------------------------------------------------------- /shape.lua: -------------------------------------------------------------------------------- 1 | require "block" 2 | 3 | BlockImages = 4 | { 5 | love.graphics.newImage("images/red.png"), 6 | love.graphics.newImage("images/blue.png"), 7 | love.graphics.newImage("images/yellow.png"), 8 | love.graphics.newImage("images/green.png"), 9 | love.graphics.newImage("images/turquoise.png"), 10 | love.graphics.newImage("images/orange.png"), 11 | love.graphics.newImage("images/pink.png") 12 | } 13 | 14 | Shape = {} 15 | 16 | function Shape:new() 17 | math.random() 18 | o = { 19 | blockArray = {}, 20 | angle = 1, 21 | shapeType = math.random(7) 22 | } 23 | setmetatable(o, self) 24 | self.__index = self 25 | return o 26 | end 27 | 28 | function Shape:getBlock(t) 29 | o = { 30 | blockArray = {}, 31 | angle = 1, 32 | shapeType = t 33 | } 34 | setmetatable(o, self) 35 | self.__index = self 36 | return o 37 | 38 | end 39 | 40 | 41 | 42 | 43 | function Shape:initShape() 44 | 45 | for i = 1, 4 do 46 | table.insert(self.blockArray, Block:new()) 47 | self.blockArray[i].image = BlockImages[self.shapeType] 48 | end 49 | 50 | buildShapeType(self.blockArray, self.shapeType) 51 | end 52 | 53 | 54 | function Shape:initShapeCol(t) 55 | 56 | for i = 1, 4 do 57 | table.insert(self.blockArray, Block:new()) 58 | self.blockArray[i].image = BlockImages[self.shapeType] 59 | end 60 | 61 | buildShapeTypeCol(self.blockArray, self.shapeType,t) 62 | end 63 | 64 | function Shape:draw() 65 | for i, v in ipairs(self.blockArray) do 66 | v:draw() 67 | end 68 | end 69 | 70 | function Shape:checkHitFloor() 71 | local flag = false 72 | for i, v in ipairs (self.blockArray) do 73 | if (v.row + 1) > 18 then 74 | return true 75 | else 76 | flag = false 77 | end 78 | end 79 | return flag 80 | end 81 | 82 | function Shape:checkHitWall(e) 83 | if e == "left" then 84 | for i,v in ipairs(self.blockArray) do 85 | if v.coll - 1 < 1 then 86 | return true 87 | else 88 | for j, w in ipairs(DrawList) do 89 | if v.coll - 1 == w.coll and v.row == w.row then 90 | return true 91 | end 92 | end 93 | end 94 | end 95 | return false 96 | end 97 | 98 | if e == "right" then 99 | for i,v in ipairs(self.blockArray) do 100 | if v.coll + 1 > 10 then 101 | return true 102 | else 103 | for j, w in ipairs(DrawList) do 104 | if v.coll + 1 == w.coll and v.row == w.row then 105 | return true 106 | end 107 | end 108 | end 109 | end 110 | return false 111 | end 112 | 113 | end 114 | 115 | function Shape:checkOnScreen() 116 | for i,v in ipairs(self.blockArray) do 117 | if v.row > 0 then 118 | return true 119 | end 120 | end 121 | return false 122 | end 123 | 124 | function Shape:move(e) 125 | 126 | if e == "left" then 127 | for i,v in ipairs(self.blockArray) do 128 | v:setTableVal(v.coll - 1, v.row) 129 | end 130 | end 131 | 132 | if e == "right" then 133 | for i,v in ipairs(self.blockArray) do 134 | v:setTableVal(v.coll + 1, v.row) 135 | end 136 | end 137 | end 138 | 139 | function Shape:down() 140 | for i,v in ipairs (self.blockArray) do 141 | v:setTableVal(v.coll, v.row + 1) 142 | end 143 | end 144 | 145 | function Shape:setTableVal(coll, row) 146 | for i,v in ipairs (self.blockArray) do 147 | v:setTableVal(v.coll, v.row + 1) 148 | end 149 | end 150 | 151 | function Shape:rotate() 152 | blocks = self.blockArray 153 | t = self.shapeType 154 | a = self.angle 155 | 156 | coll = blocks[1].coll 157 | row = blocks[1].row 158 | --no need to rotate a square... it has 4 planes of symmetry 159 | if t == 2 then 160 | --shape is a straight line 161 | 162 | if a == 1 then 163 | --make it go horizontal 164 | coll = coll - 2 165 | row = row + 2 166 | 167 | for i,v in ipairs (DrawList) do 168 | if 169 | (v.coll == (blocks[1].coll - 2) and v.row == (blocks[1].row + 2)) or 170 | (v.coll == (blocks[2].coll - 2 + 1) and v.row == (blocks[2].row + 2)) or 171 | (v.coll == (blocks[3].coll - 2 + 2) and v.row == (blocks[3].row + 2)) or 172 | (v.coll == (blocks[4].coll - 2 + 3) and v.row == (blocks[4].row + 2)) 173 | then 174 | return false 175 | end 176 | end 177 | 178 | if (coll >= 1 and coll + 3 <= 10) and row + 3 <= 20 then 179 | blocks[1]:setTableVal(coll, row) 180 | blocks[2]:setTableVal(coll + 1, row) 181 | blocks[3]:setTableVal(coll + 2, row) 182 | blocks[4]:setTableVal(coll + 3, row) 183 | self.angle = 2 184 | end 185 | elseif a == 2 then 186 | --make it go vertical 187 | coll = coll + 2 188 | row = row - 2 189 | 190 | for i,v in ipairs (DrawList) do 191 | if 192 | (v.coll == (blocks[1].coll + 2) and v.row == (blocks[1].row - 2)) or 193 | (v.coll == (blocks[2].coll + 2) and v.row == (blocks[2].row - 2 + 1)) or 194 | (v.coll == (blocks[3].coll + 2) and v.row == (blocks[3].row - 2 + 2)) or 195 | (v.coll == (blocks[4].coll + 2) and v.row == (blocks[4].row - 2 + 3)) 196 | then 197 | return false 198 | end 199 | end 200 | 201 | if (coll >= 1 or coll + 3 <= 10) and row + 3 <= 20 then 202 | blocks[1]:setTableVal(coll, row) 203 | blocks[2]:setTableVal(coll, row + 1) 204 | blocks[3]:setTableVal(coll, row + 2) 205 | blocks[4]:setTableVal(coll, row + 3) 206 | self.angle = 1 207 | end 208 | end 209 | elseif t == 3 then 210 | --shape is a t shape 211 | 212 | if a == 1 then 213 | row = row - 2 214 | 215 | for i,v in ipairs (DrawList) do 216 | if 217 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row - 2)) or 218 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row - 2 + 1)) or 219 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row - 2 + 2)) or 220 | (v.coll == (blocks[4].coll) and v.row == (blocks[4].row)) 221 | then 222 | return false 223 | end 224 | end 225 | 226 | if (coll >= 1 and coll + 2 <= 10) and row + 2 <= 20 then 227 | blocks[1]:setTableVal(coll, row) 228 | blocks[2]:setTableVal(coll, row + 1) 229 | blocks[3]:setTableVal(coll, row + 2) 230 | blocks[4]:setTableVal(blocks[4].coll, blocks[4].row) 231 | self.angle = 2 232 | end 233 | elseif a == 2 then 234 | coll = coll + 2 235 | 236 | for i,v in ipairs (DrawList) do 237 | if 238 | (v.coll == (blocks[1].coll + 2) and v.row == (blocks[1].row)) or 239 | (v.coll == (blocks[2].coll + 2 - 1) and v.row == (blocks[2].row)) or 240 | (v.coll == (blocks[3].coll + 2 - 2) and v.row == (blocks[3].row)) or 241 | (v.coll == (blocks[4].coll) and v.row == (blocks[4].row)) 242 | then 243 | return false 244 | end 245 | end 246 | 247 | if (coll >= 1 and coll <= 10) and row <= 20 then 248 | blocks[1]:setTableVal(coll, row) 249 | blocks[2]:setTableVal(coll - 1, row) 250 | blocks[3]:setTableVal(coll - 2, row) 251 | blocks[4]:setTableVal(blocks[4].coll, blocks[4].row) 252 | self.angle = 3 253 | end 254 | elseif a == 3 then 255 | row = row + 2 256 | 257 | for i,v in ipairs (DrawList) do 258 | if 259 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row + 2)) or 260 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row + 2 - 1)) or 261 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row + 2 - 2)) or 262 | (v.coll == (blocks[4].coll) and v.row == (blocks[4].row)) 263 | then 264 | return false 265 | end 266 | end 267 | 268 | if (coll >= 1 and coll <= 10) and row <= 20 then 269 | blocks[1]:setTableVal(coll, row) 270 | blocks[2]:setTableVal(coll, row - 1) 271 | blocks[3]:setTableVal(coll, row - 2) 272 | blocks[4]:setTableVal(blocks[4].coll, blocks[4].row) 273 | self.angle = 4 274 | end 275 | elseif a == 4 then 276 | coll = coll - 2 277 | 278 | for i,v in ipairs (DrawList) do 279 | if 280 | (v.coll == (blocks[1].coll - 2) and v.row == (blocks[1].row)) or 281 | (v.coll == (blocks[2].coll - 2 + 1) and v.row == (blocks[2].row)) or 282 | (v.coll == (blocks[3].coll - 2 + 2) and v.row == (blocks[3].row)) or 283 | (v.coll == (blocks[4].coll) and v.row == (blocks[4].row)) 284 | then 285 | return false 286 | end 287 | end 288 | 289 | if (coll >= 1 and coll <= 10) and row <= 20 then 290 | blocks[1]:setTableVal(coll, row) 291 | blocks[2]:setTableVal(coll + 1, row) 292 | blocks[3]:setTableVal(coll + 2, row) 293 | blocks[4]:setTableVal(blocks[4].coll, blocks[4].row) 294 | self.angle = 1 295 | end 296 | end 297 | 298 | elseif t == 4 then 299 | 300 | --shape is a forward L 301 | if a == 1 then 302 | coll = coll + 2 303 | 304 | for i,v in ipairs (DrawList) do 305 | if 306 | (v.coll == (blocks[1].coll + 2) and v.row == (blocks[1].row)) or 307 | (v.coll == (blocks[2].coll + 2 - 1) and v.row == (blocks[2].row)) or 308 | (v.coll == (blocks[3].coll + 2 - 2) and v.row == (blocks[3].row)) or 309 | (v.coll == (blocks[4].coll + 2 - 2) and v.row == (blocks[4].row + 1)) 310 | then 311 | return false 312 | end 313 | end 314 | 315 | if (coll >= 1 and coll <= 10) and row <= 20 then 316 | blocks[1]:setTableVal(coll, row) 317 | blocks[2]:setTableVal(coll - 1, row) 318 | blocks[3]:setTableVal(coll - 2, row) 319 | blocks[4]:setTableVal(coll - 2, row + 1) 320 | self.angle = 2 321 | end 322 | elseif a == 2 then 323 | row = row + 2 324 | 325 | for i,v in ipairs (DrawList) do 326 | if 327 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row + 2)) or 328 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row + 2 - 1)) or 329 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row + 2 - 2)) or 330 | (v.coll == (blocks[4].coll - 1) and v.row == (blocks[4].row + 2 - 2)) 331 | then 332 | return false 333 | end 334 | end 335 | 336 | if (coll >= 1 and coll <= 10) and row <= 20 then 337 | blocks[1]:setTableVal(coll, row) 338 | blocks[2]:setTableVal(coll, row - 1) 339 | blocks[3]:setTableVal(coll, row - 2) 340 | blocks[4]:setTableVal(coll - 1, row - 2) 341 | self.angle = 3 342 | end 343 | elseif a == 3 then 344 | coll = coll - 2 345 | 346 | for i,v in ipairs (DrawList) do 347 | if 348 | (v.coll == (blocks[1].coll - 2) and v.row == (blocks[1].row)) or 349 | (v.coll == (blocks[2].coll - 2 + 1) and v.row == (blocks[2].row)) or 350 | (v.coll == (blocks[3].coll - 2 + 2) and v.row == (blocks[3].row)) or 351 | (v.coll == (blocks[4].coll - 2 + 2) and v.row == (blocks[4].row - 1)) 352 | then 353 | return false 354 | end 355 | end 356 | if (coll >= 1 and coll <= 10) and row <= 20 then 357 | blocks[1]:setTableVal(coll, row) 358 | blocks[2]:setTableVal(coll + 1, row) 359 | blocks[3]:setTableVal(coll + 2, row) 360 | blocks[4]:setTableVal(coll + 2, row - 1) 361 | self.angle = 4 362 | end 363 | elseif a == 4 then 364 | row = row - 2 365 | 366 | for i,v in ipairs (DrawList) do 367 | if 368 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row - 2)) or 369 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row - 2 + 1)) or 370 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row - 2 + 2)) or 371 | (v.coll == (blocks[4].coll + 1) and v.row == (blocks[4].row - 2 + 2)) 372 | then 373 | return false 374 | end 375 | end 376 | 377 | if (coll >= 1 and coll + 2 <= 10) and row + 2 <= 20 then 378 | blocks[1]:setTableVal(coll, row) 379 | blocks[2]:setTableVal(coll, row + 1) 380 | blocks[3]:setTableVal(coll, row + 2) 381 | blocks[4]:setTableVal(coll + 1, row + 2) 382 | self.angle = 1 383 | end 384 | end 385 | elseif t == 5 then 386 | --shape is a backward L 387 | if a == 1 then 388 | coll = coll + 2 389 | 390 | for i,v in ipairs (DrawList) do 391 | if 392 | (v.coll == (blocks[1].coll + 2) and v.row == (blocks[1].row)) or 393 | (v.coll == (blocks[2].coll + 2 - 1) and v.row == (blocks[2].row)) or 394 | (v.coll == (blocks[3].coll + 2 - 2) and v.row == (blocks[3].row)) or 395 | (v.coll == (blocks[4].coll + 2) and v.row == (blocks[4].row + 1)) 396 | then 397 | return false 398 | end 399 | end 400 | 401 | if (coll >= 1 and coll <= 10) and row <= 20 then 402 | blocks[1]:setTableVal(coll, row) 403 | blocks[2]:setTableVal(coll - 1, row) 404 | blocks[3]:setTableVal(coll - 2, row) 405 | blocks[4]:setTableVal(coll, row + 1) 406 | self.angle = 2 407 | end 408 | elseif a == 2 then 409 | row = row + 2 410 | 411 | for i,v in ipairs (DrawList) do 412 | if 413 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row + 2)) or 414 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row + 2 - 1)) or 415 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row + 2 - 2)) or 416 | (v.coll == (blocks[4].coll - 1) and v.row == (blocks[4].row + 2)) 417 | then 418 | return false 419 | end 420 | end 421 | 422 | if (coll >= 1 and coll <= 10) and row <= 20 then 423 | blocks[1]:setTableVal(coll, row) 424 | blocks[2]:setTableVal(coll, row - 1) 425 | blocks[3]:setTableVal(coll, row - 2) 426 | blocks[4]:setTableVal(coll - 1, row) 427 | self.angle = 3 428 | end 429 | elseif a == 3 then 430 | coll = coll - 2 431 | 432 | for i,v in ipairs (DrawList) do 433 | if 434 | (v.coll == (blocks[1].coll - 2) and v.row == (blocks[1].row)) or 435 | (v.coll == (blocks[2].coll - 2 + 1) and v.row == (blocks[2].row)) or 436 | (v.coll == (blocks[3].coll - 2 + 2) and v.row == (blocks[3].row)) or 437 | (v.coll == (blocks[4].coll - 2) and v.row == (blocks[4].row - 1)) 438 | then 439 | return false 440 | end 441 | end 442 | 443 | if (coll >= 1 and coll <= 10) and row <= 20 then 444 | blocks[1]:setTableVal(coll, row) 445 | blocks[2]:setTableVal(coll + 1, row) 446 | blocks[3]:setTableVal(coll + 2, row) 447 | blocks[4]:setTableVal(coll, row - 1) 448 | self.angle = 4 449 | end 450 | elseif a == 4 then 451 | row = row - 2 452 | 453 | for i,v in ipairs (DrawList) do 454 | if 455 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row - 2)) or 456 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row - 2 + 1)) or 457 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row - 2 + 2)) or 458 | (v.coll == (blocks[4].coll + 1) and v.row == (blocks[4].row)) 459 | then 460 | return false 461 | end 462 | end 463 | 464 | if (coll >= 1 and coll + 2 <= 10) and row + 2 <= 20 then 465 | blocks[1]:setTableVal(coll, row) 466 | blocks[2]:setTableVal(coll, row + 1) 467 | blocks[3]:setTableVal(coll, row + 2) 468 | blocks[4]:setTableVal(coll + 1, row) 469 | self.angle = 1 470 | end 471 | end 472 | elseif t == 6 then 473 | if a == 1 then 474 | coll = coll + 2 475 | 476 | for i,v in ipairs (DrawList) do 477 | if 478 | (v.coll == (blocks[1].coll + 2) and v.row == (blocks[1].row)) or 479 | (v.coll == (blocks[2].coll + 2 - 1) and v.row == (blocks[2].row)) or 480 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 481 | (v.coll == (blocks[4].coll + 2 - 2) and v.row == (blocks[4].row + 1)) 482 | then 483 | return false 484 | end 485 | end 486 | 487 | if (coll >= 1 and coll <= 10) and row <= 20 then 488 | blocks[1]:setTableVal(coll, row) 489 | blocks[2]:setTableVal(coll - 1, row) 490 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 491 | blocks[4]:setTableVal(coll - 2, row + 1) 492 | self.angle = 2 493 | end 494 | elseif a == 2 then 495 | row = row + 2 496 | 497 | for i,v in ipairs (DrawList) do 498 | if 499 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row + 2)) or 500 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row + 2 - 1)) or 501 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 502 | (v.coll == (blocks[4].coll - 1) and v.row == (blocks[4].row + 2 - 2)) 503 | then 504 | return false 505 | end 506 | end 507 | 508 | if (coll >= 1 and coll <= 10) and row <= 20 then 509 | blocks[1]:setTableVal(coll, row) 510 | blocks[2]:setTableVal(coll, row - 1) 511 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 512 | blocks[4]:setTableVal(coll - 1, row - 2) 513 | self.angle = 3 514 | end 515 | elseif a == 3 then 516 | coll = coll - 2 517 | 518 | for i,v in ipairs (DrawList) do 519 | if 520 | (v.coll == (blocks[1].coll - 2) and v.row == (blocks[1].row)) or 521 | (v.coll == (blocks[2].coll - 2 + 1) and v.row == (blocks[2].row)) or 522 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 523 | (v.coll == (blocks[4].coll - 2 + 2) and v.row == (blocks[4].row - 1)) 524 | then 525 | return false 526 | end 527 | end 528 | 529 | if (coll >= 1 and coll <= 10) and row <= 20 then 530 | blocks[1]:setTableVal(coll, row) 531 | blocks[2]:setTableVal(coll + 1, row) 532 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 533 | blocks[4]:setTableVal(coll + 2, row - 1) 534 | self.angle = 4 535 | end 536 | elseif a == 4 then 537 | row = row - 2 538 | 539 | for i,v in ipairs (DrawList) do 540 | if 541 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row - 2)) or 542 | (v.coll == (blocks[2].coll) and v.row == (blocks[2].row - 2 + 1)) or 543 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 544 | (v.coll == (blocks[4].coll + 1) and v.row == (blocks[4].row - 2 + 2)) 545 | then 546 | return false 547 | end 548 | end 549 | 550 | if (coll >= 1 and coll + 2 <= 10) and row + 2 <= 20 then 551 | blocks[1]:setTableVal(coll, row) 552 | blocks[2]:setTableVal(coll, row + 1) 553 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 554 | blocks[4]:setTableVal(coll + 1, row + 2) 555 | self.angle = 1 556 | end 557 | end 558 | elseif t == 7 then 559 | if a == 1 then 560 | row = row + 2 561 | 562 | for i,v in ipairs (DrawList) do 563 | if 564 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row + 2)) or 565 | (v.coll == (blocks[2].coll - 1) and v.row == (blocks[2].row + 2)) or 566 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 567 | (v.coll == (blocks[4].coll - 2) and v.row == (blocks[4].row + 2 - 1)) 568 | then 569 | return false 570 | end 571 | end 572 | 573 | if (coll >= 1 and coll <= 10) and row + 2 <= 20 then 574 | blocks[1]:setTableVal(coll, row) 575 | blocks[2]:setTableVal(coll - 1, row) 576 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 577 | blocks[4]:setTableVal(coll - 2, row - 1) 578 | self.angle = 2 579 | end 580 | elseif a == 2 then 581 | coll = coll - 2 582 | for i,v in ipairs (DrawList) do 583 | if 584 | (v.coll == (blocks[1].coll - 2) and v.row == (blocks[1].row)) or 585 | (v.coll == (blocks[2].coll - 2) and v.row == (blocks[2].row - 1)) or 586 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 587 | (v.coll == (blocks[4].coll - 2 + 1) and v.row == (blocks[4].row - 2)) 588 | then 589 | return false 590 | end 591 | end 592 | if (coll >= 1 and coll <= 10) and row + 2 <= 20 then 593 | blocks[1]:setTableVal(coll, row) 594 | blocks[2]:setTableVal(coll, row - 1) 595 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 596 | blocks[4]:setTableVal(coll + 1, row - 2) 597 | self.angle = 3 598 | end 599 | elseif a == 3 then 600 | row = row - 2 601 | for i,v in ipairs (DrawList) do 602 | if 603 | (v.coll == (blocks[1].coll) and v.row == (blocks[1].row - 2)) or 604 | (v.coll == (blocks[2].coll + 1) and v.row == (blocks[2].row - 2)) or 605 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 606 | (v.coll == (blocks[4].coll + 2) and v.row == (blocks[4].row - 2 + 1)) 607 | then 608 | return false 609 | end 610 | end 611 | if (coll >= 1 and coll <= 10) and row + 2 <= 20 then 612 | blocks[1]:setTableVal(coll, row) 613 | blocks[2]:setTableVal(coll + 1, row) 614 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 615 | blocks[4]:setTableVal(coll + 2, row + 1) 616 | self.angle = 4 617 | end 618 | elseif a == 4 then 619 | coll = coll + 2 620 | for i,v in ipairs (DrawList) do 621 | if 622 | (v.coll == (blocks[1].coll + 2) and v.row == (blocks[1].row)) or 623 | (v.coll == (blocks[2].coll + 2) and v.row == (blocks[2].row + 1)) or 624 | (v.coll == (blocks[3].coll) and v.row == (blocks[3].row)) or 625 | (v.coll == (blocks[4].coll + 2 - 1) and v.row == (blocks[4].row + 2)) 626 | then 627 | return false 628 | end 629 | end 630 | if (coll >= 1 and coll <= 10) and row + 2 <= 20 then 631 | blocks[1]:setTableVal(coll, row) 632 | blocks[2]:setTableVal(coll, row + 1) 633 | blocks[3]:setTableVal(blocks[3].coll, blocks[3].row) 634 | blocks[4]:setTableVal(coll - 1, row + 2) 635 | self.angle = 1 636 | end 637 | end 638 | 639 | local flag = false 640 | for i,v in ipairs (blocks) do 641 | if v.coll > 10 then 642 | flag = true 643 | end 644 | end 645 | 646 | if flag == true then 647 | for i,v in ipairs(blocks) do 648 | v:setTableVal(v.coll - 1, v.row) 649 | end 650 | end 651 | end 652 | end 653 | 654 | function buildShapeType(blocks, t) 655 | blocks[1]:setTableVal(5, 0) 656 | local coll = blocks[1].coll 657 | local row = blocks[1].row 658 | if t == 1 then 659 | --shape is a cube 660 | blocks[2]:setTableVal(coll + 1, row) 661 | blocks[3]:setTableVal(coll, row + 1) 662 | blocks[4]:setTableVal(coll + 1, row + 1) 663 | 664 | elseif t == 2 then 665 | --shape is a straight line 666 | blocks[2]:setTableVal(coll, row + 1) 667 | blocks[3]:setTableVal(coll, row + 2) 668 | blocks[4]:setTableVal(coll, row + 3) 669 | 670 | elseif t == 3 then 671 | --shape is a t shape 672 | blocks[2]:setTableVal(coll + 1, row) 673 | blocks[3]:setTableVal(coll + 2, row) 674 | blocks[4]:setTableVal(coll + 1, row - 1) 675 | 676 | elseif t == 4 then 677 | --shape is a forward L 678 | blocks[2]:setTableVal(coll, row + 1) 679 | blocks[3]:setTableVal(coll, row + 2) 680 | blocks[4]:setTableVal(coll + 1, row + 2) 681 | 682 | elseif t == 5 then 683 | --shape is a backwards L 684 | blocks[2]:setTableVal(coll, row + 1) 685 | blocks[3]:setTableVal(coll, row + 2) 686 | blocks[4]:setTableVal(coll + 1, row) 687 | 688 | elseif t == 6 then 689 | --shape is a forward Z 690 | 691 | blocks[2]:setTableVal(coll, row + 1) 692 | blocks[3]:setTableVal(coll + 1, row + 1) 693 | blocks[4]:setTableVal(coll + 1, row + 2) 694 | 695 | elseif t == 7 then 696 | --blocks[1]:setTableVal(2, 0) 697 | --shape is a backwards Z 698 | --blocks[1]:setTableVal(coll+1, 0) 699 | blocks[2]:setTableVal(coll , row + 1) 700 | blocks[3]:setTableVal(coll -1 , row + 1) 701 | blocks[4]:setTableVal(coll -1, row + 2) 702 | end 703 | 704 | end 705 | 706 | 707 | function buildShapeTypeCol(blocks, t,col) 708 | blocks[1]:setTableVal(col, 0) 709 | local coll = blocks[1].coll 710 | local row = blocks[1].row 711 | if t == 1 then 712 | --shape is a cube 713 | blocks[2]:setTableVal(coll + 1, row) 714 | blocks[3]:setTableVal(coll, row + 1) 715 | blocks[4]:setTableVal(coll + 1, row + 1) 716 | 717 | elseif t == 2 then 718 | --shape is a straight line 719 | blocks[2]:setTableVal(coll, row + 1) 720 | blocks[3]:setTableVal(coll, row + 2) 721 | blocks[4]:setTableVal(coll, row + 3) 722 | 723 | elseif t == 3 then 724 | --shape is a t shape 725 | blocks[2]:setTableVal(coll + 1, row) 726 | blocks[3]:setTableVal(coll + 2, row) 727 | blocks[4]:setTableVal(coll + 1, row - 1) 728 | 729 | elseif t == 4 then 730 | --shape is a forward L 731 | blocks[2]:setTableVal(coll, row + 1) 732 | blocks[3]:setTableVal(coll, row + 2) 733 | blocks[4]:setTableVal(coll + 1, row + 2) 734 | 735 | elseif t == 5 then 736 | --shape is a backwards L 737 | blocks[2]:setTableVal(coll, row + 1) 738 | blocks[3]:setTableVal(coll, row + 2) 739 | blocks[4]:setTableVal(coll + 1, row) 740 | 741 | elseif t == 6 then 742 | --shape is a forward Z 743 | 744 | blocks[2]:setTableVal(coll, row + 1) 745 | blocks[3]:setTableVal(coll + 1, row + 1) 746 | blocks[4]:setTableVal(coll + 1, row + 2) 747 | 748 | elseif t == 7 then 749 | --blocks[1]:setTableVal(2, 0) 750 | --shape is a backwards Z 751 | --blocks[1]:setTableVal(coll+1, 0) 752 | blocks[2]:setTableVal(coll , row + 1) 753 | blocks[3]:setTableVal(coll -1 , row + 1) 754 | blocks[4]:setTableVal(coll -1, row + 2) 755 | end 756 | 757 | end 758 | --------------------------------------------------------------------------------