Hey guys! I have finally finished the first working prototype of Snake! Here is the code:
Main
function setup()
displayMode(FULLSCREEN)
supportedOrientations(LANDSCAPE_ANY)
alive = true
Grid = {}
for x = 1, 32 do
for y = 1, 24 do
table.insert(Grid, Cell(x * 32, y * 32))
end
end
QUEUE = 1
LEVEL = 1
Walls = {}
levelUp(LEVEL)
initializeSnake()
Basket = { Food() }
FRAME = 1
SPEED = 10
SCORE = 0
end
function draw()
background(255, 255, 255, 255)
if alive == true then
if #Snake > 10 then
LEVEL = LEVEL + 1
levelUp()
end
if FRAME < SPEED then
FRAME = FRAME + 1
else
FRAME = 0
end
for k, cell in ipairs(Grid) do
cell:clear()
end
for k, brick in ipairs(Walls) do
brick:draw(k)
end
Snake[#Snake]:last()
Snake[ 1 ]:check()
for k, snake in pairs(Snake) do
snake:draw()
end
Snake[ 1 ]:check()
for k, fruit in ipairs(Basket) do
fruit:draw()
end
else
for k, cell in ipairs(Grid) do
cell:clear()
end
if SCORE < 10 then
for k,n in ipairs(Numbers[SCORE + 1]) do
Grid[ gridValue(n) ].state = BODY
end
else
for k,n in ipairs(Numbers[math.floor(SCORE / 10) + 1]) do
Grid[ gridValue(n - vec2(3,0)) ].state = BODY
end
for k,n in ipairs(Numbers[SCORE - math.floor(SCORE / 10) * 10 + 1]) do
Grid[ gridValue(n + vec2(3,0)) ].state = BODY
end
end
end
for k, cell in ipairs(Grid) do
cell:draw()
end
end
function touched(t)
Snake[1]:touched(t)
end
function gridValue(v)
return (v.x - 1) * 24 + v.y
end
function initializeSnake()
Snake = { Head(), Body(16, 13, 2) }
QUEUE = 1
end
Cell.lua
Cell = class()
EMPTY = 1
FOOD = 2
HEAD = 3
BODY = 4
WALL = 5
colors =
{
color(0, 0, 0, 255),
color(0, 255, 0, 255),
color(255, 0, 0, 255),
color(255, 255, 255, 255),
color(127, 127, 127, 255),
color(127, 127, 127, 255),
color(255, 0, 255, 255),
color(0, 255, 255, 255),
color(0, 0, 0, 255),
color(50, 50, 50, 255)
}
------------------------------------------------------------
function Cell:init(x, y)
self.pos = vec2(-16 + x, -16 + y)
self.state = EMPTY
end
------------------------------------------------------------
function Cell:draw()
stroke(colors[ self.state + 5])
strokeWidth(4)
fill(colors[ self.state ])
rectMode(CENTER)
rect(self.pos.x, self.pos.y, 32, 32)
end
function Cell:clear()
self.state = EMPTY
end
function Cell:isFull()
if self.state > HEAD then
return true
else
return false
end
end
Brick.lua
Brick = class()
function Brick:init(pos)
self.pos = pos
end
function Brick:draw()
Grid[ gridValue(self.pos) ].state = WALL
end
Body.lua
Body = class()
function Body:init(x,y,i)
self.pos = vec2(x, y)
self.prevPos = self.pos
self.index = i
end
function Body:draw()
if FRAME == 0 then
print()
self.prevPos = self.pos
self.pos = Snake[self.index - 1].prevPos
end
Grid[ gridValue(self.pos) ].state = BODY
end
function Body:last()
if QUEUE > 0 and FRAME == 0 then
table.insert(Snake, Body(self.prevPos.x, self.prevPos.y, self.index + 1))
QUEUE = QUEUE - 1
end
end
Head.lua
Head = class()
RIGHT = vec2(1, 0)
LEFT = vec2(-1, 0)
UP = vec2(0, 1)
DOWN = vec2(0, -1)
------------------------------------------------------------
function Head:init()
self.pos = vec2(17,13)
self.speed = RIGHT
self.changeTo = RIGHT
self.prevPos = self.pos
end
function Head:draw(i)
if FRAME == 0 then
self.prevPos = self.pos
self.speed = self.changeTo
self.pos = self.pos + self.speed
if self.pos.x < 1 then
self.pos.x = 32
elseif self.pos.x > 32 then
self.pos.x = 1
elseif self.pos.y < 1 then
self.pos.y = 24
elseif self.pos.y > 24 then
self.pos.y = 1
end
end
Grid[ gridValue( self.pos ) ].state = HEAD
end
function Head:touched(t)
d = vec2(t.x - self.pos.x * 32, t.y - self.pos.y * 32)
primeAxis = math.max( math.abs(d.x), math.abs(d.y))
if primeAxis == math.abs(d.x) and (self.speed == UP or self.speed == DOWN) then
if d.x > 0 then
self.changeTo = RIGHT
end
if d.x < 0 then
self.changeTo = LEFT
end
elseif primeAxis == math.abs(d.y) and (self.speed == LEFT or self.speed == RIGHT) then
if d.y > 0 then
self.changeTo = UP
end
if d.y < 0 then
self.changeTo = DOWN
end
end
end
function Head:check()
if Grid[ gridValue(self.pos) ]:isFull() then
endGame()
end
end
Food.lua
Food = class()
function Food:init()
self.pos = vec2(math.random(1,32),math.random(1,24))
while Grid[ gridValue(self.pos)]:isFull() do
self.pos = vec2(math.random(1,32),math.random(1,24))
end
end
function Food:draw()
if Snake[1].pos == self.pos then
QUEUE = QUEUE + 1
SCORE = SCORE + 1
self:init()
end
Grid[gridValue(self.pos)].state = FOOD
end