LuaYard/code/snake.lua
2019-08-18 02:01:00 +08:00

159 lines
4.2 KiB
Lua

local wnd = Window("Snake", 1024, 768)
local rnd = Renderer(wnd)
local font = Font("asserts/msyh.ttf", 18)
local musicPlayer = MusicPlayer()
require("code/helper")
math.randomseed(os.time())
function GameBox()
local box = {}
box.w = 20
box.h = 20
box.size = 25
box.dots = Point(10, 10)
box.update = function()
end
box.draw = function()
local c = rnd:getColor()
rnd:setColor(RGBA(127, 127, 127, 0))
for i=0, box.w-1 do
for j=0, box.h-1 do
rnd:fillRect(Rect(i * box.size, j * box.size, box.size, box.size))
end
end
if box.dots then
rnd:setColor(RGBA(255, 0, 0, 0))
rnd:fillRect(Rect(box.dots.x * box.size, box.dots.y * box.size, box.size, box.size))
end
rnd:setColor(c)
end
return box
end
function Snake(box)
local s = {}
s.x = 5
s.y = 0
s.face = "right"
s.dead = false
s.body = {}
table.insert(s.body, Point(1,0))
table.insert(s.body, Point(2,0))
table.insert(s.body, Point(3,0))
table.insert(s.body, Point(4,0))
table.insert(s.body, Point(5,0))
s.queue = {}
s.box = box
s.update = function()
if not s.dead then
if s.queue[1] then
local key = table.remove(s.queue, 1)
if key == Keys.W and s.face ~= "down" then
s.face = "up"
elseif key == Keys.S and s.face ~= "up" then
s.face = "down"
elseif key == Keys.A and s.face ~= "right" then
s.face = "left"
elseif key == Keys.D and s.face ~= "left" then
s.face = "right"
end
end
local case = {
up = function()
s.y = s.y - 1
if s.y < 0 then
s.dead = true
end
end,
down = function()
s.y = s.y + 1
if s.y >= s.box.h then
s.dead = true
end
end,
left = function()
s.x = s.x - 1
if s.x < 0 then
s.dead = true
end
end,
right = function()
s.x = s.x + 1
if s.x >= s.box.w then
s.dead = true
end
end
}
case[s.face]()
if not s.dead then
if box.dots then
if box.dots.x == s.x and box.dots.y == s.y then
box.dots = Point(math.random(box.w)-1, math.random(box.h)-1)
else
table.remove(s.body, 1)
end
end
-- check if collapse
for _, p in ipairs(s.body) do
if p.x == s.x and p.y == s.y then
s.dead = true
break
end
end
if not s.dead then
table.insert(s.body, Point(s.x, s.y))
end
end
end
end
s.draw = function()
if not s.dead then
local c = rnd:getColor()
rnd:setColor(RGBA(0, 0, 255, 0))
for _, p in ipairs(s.body) do
rnd:fillRect(Rect(p.x * s.box.size, p.y * s.box.size, s.box.size, s.box.size))
end
rnd:setColor(RGBA(255, 255, 0, 0))
rnd:fillRect(Rect(s.x * s.box.size, s.y * s.box.size, s.box.size, s.box.size))
rnd:setColor(c)
end
end
return s
end
local world = GameBox()
local player = Snake(world)
wnd:on('keydown', function(key)
if key == Keys.R then
world = GameBox()
player = Snake(world)
elseif key == Keys.ESCAPE then
FireExit()
else
table.insert(player.queue, key)
end
end)
SetInterval(function()
world:update()
player:update()
end, 150)
SetInterval(function()
rnd:clear()
world:draw()
player:draw()
rnd:update()
end, 1000//60)
wnd:show()