Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local controller = require("controller") -- Якщо це зовнішній модуль
- local snake = { { x = 8, y = 5 } } -- Початкова позиція змійки
- local food = { x = 10, y = 10 } -- Початкова позиція їжі
- local cell_size = 10 -- Розмір клітинки
- local game_over = false -- Змінна для відстеження стану гри
- local paused = false -- Змінна для відстеження стану паузи
- local menu_index = 1 -- Індекс обраного пункту меню
- local score = 0 -- Початковий рахунок
- local high_score = 0 -- Початковий рекорд
- local new_record_text = "НОВИЙ РЕКОРД!"
- function lilka.init()
- -- Ініціалізація змійки та їжі
- snake = { { x = 5, y = 5 } }
- food = { x = 10, y = 10 }
- direction = "right" -- Початковий напрямок руху
- move_timer = 0 -- Скидаємо таймер руху
- move_interval = 0.2 -- Початковий інтервал руху
- game_over = false -- Скидаємо стан гри
- paused = false -- Скидаємо стан паузи
- score = 0 -- Скидаємо рахунок
- end
- local direction = "right" -- Початковий напрямок руху
- local move_timer = 0 -- Таймер для руху змійки
- local move_interval = 0.2 -- Інтервал руху (в секундах)
- local function custom_max(a, b)
- if a > b then
- return a
- else
- return b
- end
- end
- -- Генеруємо нову їжу
- local function generate_food()
- local valid_position = false
- while not valid_position do
- -- Генеруємо випадкову позицію
- food.x = math.random(0, display.width // cell_size - 1)
- food.y = math.random(0, display.height // cell_size - 1)
- -- Перевіряємо, чи їжа не знаходиться всередині тіла змійки
- valid_position = true
- for _, segment in ipairs(snake) do
- if segment.x == food.x and segment.y == food.y then
- valid_position = false
- break
- end
- end
- end
- end
- function lilka.update(delta)
- local state = controller.get_state()
- if not state then
- return -- Вихід, якщо стан контролера не отримано
- end
- if game_over then
- if state.a and state.a.just_pressed then
- lilka.init() -- Починаємо нову гру
- game_over = false -- Скидаємо стан програшу
- elseif state.b and state.b.just_pressed then
- util.exit() -- Вихід із гри
- end
- return -- Якщо гра закінчена, не оновлюємо гру
- end
- if state.d and state.d.just_pressed then
- paused = not paused -- Перемикаємо стан паузи
- end
- if paused then
- -- Обробка меню паузи
- if state.up and state.up.just_pressed then
- menu_index = menu_index - 1
- if menu_index < 1 then
- menu_index = 4 -- Повертаємося до останнього пункту
- end
- elseif state.down and state.down.just_pressed then
- menu_index = menu_index + 1
- if menu_index > 4 then
- menu_index = 1 -- Повертаємося до першого пункту
- end
- elseif state.a and state.a.just_pressed then
- if menu_index == 1 then
- paused = false -- Продовжити гру
- elseif menu_index == 2 then
- lilka.init() -- Нова гра
- paused = false
- elseif menu_index == 3 then
- -- Відкрити таблицю рекордів
- lilka.show_high_scores()
- elseif menu_index == 4 then
- util.exit() -- Вихід із гри
- end
- end
- return -- Якщо гра на паузі, не оновлюємо гру
- end
- -- Обробляємо введення користувача:
- if state.up and state.up.just_pressed and direction ~= "down" then
- direction = "up"
- elseif state.down and state.down.just_pressed and direction ~= "up" then
- direction = "down"
- elseif state.left and state.left.just_pressed and direction ~= "right" then
- direction = "left"
- elseif state.right and state.right.just_pressed and direction ~= "left" then
- direction = "right"
- end
- -- Оновлюємо таймер
- move_timer = move_timer + delta
- if move_timer >= move_interval then
- move_timer = 0 -- Скидаємо таймер
- -- Рухаємо змійку
- local head = snake[1]
- local new_head = { x = head.x, y = head.y }
- if direction == "up" then
- new_head.y = new_head.y - 1
- elseif direction == "down" then
- new_head.y = new_head.y + 1
- elseif direction == "left" then
- new_head.x = new_head.x - 1
- elseif direction == "right" then
- new_head.x = new_head.x + 1
- end
- -- Перевірка виходу за межі екрану
- if new_head.x < 0 then
- new_head.x = display.width // cell_size - 1 -- Перехід на правий край
- elseif new_head.x >= display.width // cell_size then
- new_head.x = 0 -- Перехід на лівий край
- end
- if new_head.y < 0 then
- new_head.y = display.height // cell_size - 1 -- Перехід на нижній край
- elseif new_head.y >= display.height // cell_size then
- new_head.y = 0 -- Перехід на верхній край
- end
- -- Перевірка, чи змійка з'їла себе
- for i = 1, #snake do
- if snake[i].x == new_head.x and snake[i].y == new_head.y then
- game_over = true -- Завершуємо гру
- return
- end
- end
- -- Додаємо нову голову до змійки
- table.insert(snake, 1, new_head)
- -- Перевірка, чи з'їла змійка їжу
- if new_head.x == food.x and new_head.y == food.y then
- score = score + 1 -- Збільшуємо рахунок
- generate_food() -- Викликаємо функцію для генерації їжі
- else
- -- Видаляємо хвіст, якщо їжа не з'їдена
- table.remove(snake)
- end
- move_interval = custom_max(0.05, 0.2 - #snake * 0.005) -- Швидкість залежить від довжини змійки
- end
- end
- function lilka.draw()
- -- Малюємо чорний фон
- display.fill_screen(display.color565(0, 0, 0))
- if paused then
- -- Оновлене меню паузи
- local menu_items = { "ПРОДОВЖИТИ", "НОВА ГРА", "ТАБЛИЦЯ РЕКОРДІВ", "ВИХІД" }
- local menu_x = display.width // 2 -- Центруємо текст
- local menu_y = display.height // 2 - 60 -- Центруємо меню трохи вище
- local box_width = 200 -- Ширина прямокутника
- local box_height = 200 -- Висота прямокутника
- -- Малюємо фон для меню
- local box_x = (display.width - box_width) // 2
- local box_y = (display.height - box_height) // 2
- display.fill_rect(box_x, box_y, box_width, box_height, display.color565(25, 25, 112)) -- Темно-синій фон
- -- Малюємо рамку для меню
- display.draw_rect(box_x, box_y, box_width, box_height, display.color565(255, 215, 0)) -- Золотиста рамка
- -- Малюємо пункти меню
- for i, item in ipairs(menu_items) do
- local item_y = menu_y + (i - 1) * 40 -- Відстань між пунктами меню
- if i == menu_index then
- -- Малюємо залитий прямокутник за текстом
- display.fill_rect(box_x + 10, item_y - 12, box_width - 20, 30, display.color565(70, 130, 180)) -- Світло-синій фон
- end
- -- Малюємо текст пункту меню
- display.set_cursor(menu_x - (#item * 5), item_y) -- Центруємо текст
- display.set_text_color(display.color565(255, 255, 255)) -- Білий текст
- display.print(item)
- end
- -- Обробка вибору пункту меню
- if state.a.just_pressed then
- if menu_index == 1 then
- paused = false -- Продовжити гру
- elseif menu_index == 2 then
- lilka.init() -- Нова гра
- paused = false
- elseif menu_index == 3 then
- -- Відкрити таблицю рекордів
- lilka.show_high_scores()
- elseif menu_index == 4 then
- util.exit() -- Вихід із гри
- end
- end
- return -- Якщо гра на паузі, не оновлюємо гру
- end
- if game_over then
- -- Виводимо повідомлення про завершення гри
- local text = "ТИ ПРОГРАВ!"
- local score_text = "ТВІЙ РАХУНОК: " .. tostring(score)
- local repeat_text = "НОВА ГРА (A), ВИЙТИ (B)"
- -- Встановлюємо ширину рамки з полями
- local box_width = display.width - 40 -- Поля по 20 пікселів з кожного боку
- local box_height = 150 -- Висота прямокутника
- local box_x = (display.width - box_width) // 2
- local box_y = (display.height - box_height) // 2
- -- Малюємо фон для повідомлення
- display.fill_rect(box_x, box_y, box_width, box_height, display.color565(25, 25, 112)) -- Темно-синій фон
- -- Малюємо рамку для повідомлення
- display.draw_rect(box_x, box_y, box_width, box_height, display.color565(255, 215, 0)) -- Золотиста рамка
- -- Малюємо текст "ТИ ПРОГРАВ!"
- local text_x = display.width // 2 - (#text * 5) // 2 -- Центруємо текст
- local text_y = box_y + 10
- display.set_cursor(text_x, text_y)
- display.set_text_color(display.color565(255, 255, 255)) -- Білий текст
- display.print(text)
- -- Малюємо текст "ТВІЙ РАХУНОК"
- local score_x = display.width // 2 - (#score_text * 5) // 2 -- Центруємо текст
- local score_y = text_y + 30
- display.set_cursor(score_x, score_y)
- display.print(score_text)
- -- Малюємо текст "НОВА ГРА (A), ВИЙТИ (B)"
- local repeat_x = display.width // 2 - (#repeat_text * 5) // 2 -- Центруємо текст
- local repeat_y = box_y + box_height - 30
- display.set_cursor(repeat_x, repeat_y)
- display.print(repeat_text)
- return
- end
- -- Малюємо змійку
- for _, segment in ipairs(snake) do
- -- Додаємо проміжки між сегментами
- local segment_size = cell_size - 2 -- Зменшуємо розмір сегмента для створення проміжків
- local segment_x = segment.x * cell_size + 1 -- Додаємо відступ зліва
- local segment_y = segment.y * cell_size + 1 -- Додаємо відступ зверху
- display.fill_rect(segment_x, segment_y, segment_size, segment_size, display.color565(0, 255, 0)) -- Малюємо сегмент
- end
- -- Малюємо їжу у вигляді яблука
- local function draw_apple(x, y, size)
- -- Листочок (зелений) - по діагоналі та більший
- local leaf_width = size // 2
- local leaf_height = size // 3
- display.fill_rect(x + size // 2, y - leaf_height, leaf_width, leaf_height, display.color565(0, 128, 0)) -- Листочок по діагоналі
- -- Яблуко (червоне) - створюємо круглу форму
- local radius = size // 2
- for i = -radius, radius do
- for j = -radius, radius do
- if i * i + j * j <= radius * radius then -- Перевірка, чи точка належить колу
- display.fill_rect(x + radius + i, y + radius + j, 1, 1, display.color565(255, 0, 0)) -- Малюємо піксель яблука
- end
- end
- end
- end
- -- Використовуємо функцію для малювання їжі
- draw_apple(food.x * cell_size, food.y * cell_size, cell_size)
- end
- function lilka.show_high_scores()
- -- Малюємо чорний фон
- display.fill_screen(display.color565(0, 0, 0))
- -- Заголовок
- local title = "ТАБЛИЦЯ РЕКОРДІВ"
- local title_x = display.width // 2 - (#title * 5) // 2
- local title_y = 20
- display.set_cursor(title_x, title_y)
- display.set_text_color(display.color565(255, 255, 255)) -- Білий текст
- display.print(title)
- -- Виведення рекордів (приклад)
- local scores = { 100, 90, 80, 70, 60 } -- Замініть на реальні дані
- for i, score in ipairs(scores) do
- local score_text = tostring(i) .. ". " .. tostring(score)
- local score_x = display.width // 2 - (#score_text * 5) // 2
- local score_y = title_y + 30 + (i - 1) * 20
- display.set_cursor(score_x, score_y)
- display.print(score_text)
- end
- -- Інструкція для повернення
- local back_text = "НАТИСНІТЬ A, ЩОБ ПОВЕРНУТИСЯ"
- local back_x = display.width // 2 - (#back_text * 5) // 2
- local back_y = display.height - 30
- display.set_cursor(back_x, back_y)
- display.print(back_text)
- -- Очікуємо натискання кнопки A для повернення
- while true do
- local state = controller.get_state()
- if state.a.just_pressed then
- break -- Повертаємося до гри
- end
- end
- end
- if (score or 0) > (high_score or 0) then
- high_score = score -- Оновлюємо рекорд
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement