Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Snake Game for SimpleOS
- -- CC: Tweaked compatible
- local w, h = term.getSize()
- h = h - 1 -- Leave room for score
- -- Game state
- local snake = {}
- local direction = "right"
- local food = {}
- local score = 0
- local gameOver = false
- local speed = 0.15
- -- Initialize game
- local function init()
- snake = {
- {x = math.floor(w/2), y = math.floor(h/2)},
- {x = math.floor(w/2) - 1, y = math.floor(h/2)},
- {x = math.floor(w/2) - 2, y = math.floor(h/2)}
- }
- direction = "right"
- score = 0
- gameOver = false
- spawnFood()
- end
- -- Spawn food at random location
- function spawnFood()
- local valid = false
- while not valid do
- food = {x = math.random(1, w), y = math.random(1, h)}
- valid = true
- for _, segment in ipairs(snake) do
- if segment.x == food.x and segment.y == food.y then
- valid = false
- break
- end
- end
- end
- end
- -- Draw game
- local function draw()
- term.setBackgroundColor(colors.black)
- term.clear()
- -- Draw border
- term.setBackgroundColor(colors.gray)
- for x = 1, w do
- term.setCursorPos(x, h + 1)
- term.write(" ")
- end
- -- Draw score
- term.setCursorPos(1, h + 1)
- term.setTextColor(colors.white)
- term.write("Score: " .. score .. " [Q]uit")
- -- Draw food
- term.setBackgroundColor(colors.black)
- term.setCursorPos(food.x, food.y)
- term.setTextColor(colors.red)
- term.write("@")
- -- Draw snake
- for i, segment in ipairs(snake) do
- term.setCursorPos(segment.x, segment.y)
- if i == 1 then
- term.setTextColor(colors.lime)
- term.write("O")
- else
- term.setTextColor(colors.green)
- term.write("o")
- end
- end
- end
- -- Move snake
- local function move()
- local head = {x = snake[1].x, y = snake[1].y}
- if direction == "up" then head.y = head.y - 1
- elseif direction == "down" then head.y = head.y + 1
- elseif direction == "left" then head.x = head.x - 1
- elseif direction == "right" then head.x = head.x + 1
- end
- -- Wrap around
- if head.x < 1 then head.x = w
- elseif head.x > w then head.x = 1
- elseif head.y < 1 then head.y = h
- elseif head.y > h then head.y = 1
- end
- -- Check self collision
- for _, segment in ipairs(snake) do
- if segment.x == head.x and segment.y == head.y then
- gameOver = true
- return
- end
- end
- -- Add new head
- table.insert(snake, 1, head)
- -- Check food
- if head.x == food.x and head.y == food.y then
- score = score + 10
- spawnFood()
- if speed > 0.05 then
- speed = speed - 0.005
- end
- else
- table.remove(snake)
- end
- end
- -- Game over screen
- local function showGameOver()
- term.setBackgroundColor(colors.black)
- term.setTextColor(colors.red)
- term.setCursorPos(math.floor(w/2) - 4, math.floor(h/2))
- term.write("GAME OVER")
- term.setTextColor(colors.white)
- term.setCursorPos(math.floor(w/2) - 6, math.floor(h/2) + 1)
- term.write("Score: " .. score)
- term.setCursorPos(math.floor(w/2) - 10, math.floor(h/2) + 3)
- term.write("Press ENTER to restart")
- term.setCursorPos(math.floor(w/2) - 7, math.floor(h/2) + 4)
- term.write("Press Q to quit")
- end
- -- Main game loop
- local function run()
- init()
- while true do
- draw()
- if gameOver then
- showGameOver()
- while true do
- local event, key = os.pullEvent("key")
- if key == keys.enter then
- init()
- break
- elseif key == keys.q then
- return
- end
- end
- end
- local timer = os.startTimer(speed)
- while true do
- local event, p1 = os.pullEvent()
- if event == "key" then
- if p1 == keys.up and direction ~= "down" then
- direction = "up"
- elseif p1 == keys.down and direction ~= "up" then
- direction = "down"
- elseif p1 == keys.left and direction ~= "right" then
- direction = "left"
- elseif p1 == keys.right and direction ~= "left" then
- direction = "right"
- elseif p1 == keys.q then
- return
- end
- elseif event == "timer" and p1 == timer then
- break
- end
- end
- move()
- end
- end
- run()
Advertisement
Add Comment
Please, Sign In to add comment