Advertisement
nene1234

Snake Lilka

Jul 1st, 2025 (edited)
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.75 KB | Gaming | 0 0
  1. local controller = require("controller") -- Якщо це зовнішній модуль
  2.  
  3. local snake = { { x = 8, y = 5 } } -- Початкова позиція змійки
  4. local food = { x = 10, y = 10 } -- Початкова позиція їжі
  5. local cell_size = 10 -- Розмір клітинки
  6. local game_over = false -- Змінна для відстеження стану гри
  7. local paused = false -- Змінна для відстеження стану паузи
  8. local menu_index = 1 -- Індекс обраного пункту меню
  9. local score = 0 -- Початковий рахунок
  10. local high_score = 0 -- Початковий рекорд
  11. local new_record_text = "НОВИЙ РЕКОРД!"
  12.  
  13. function lilka.init()
  14.     -- Ініціалізація змійки та їжі
  15.     snake = { { x = 5, y = 5 } }
  16.     food = { x = 10, y = 10 }
  17.     direction = "right" -- Початковий напрямок руху
  18.     move_timer = 0 -- Скидаємо таймер руху
  19.     move_interval = 0.2 -- Початковий інтервал руху
  20.     game_over = false -- Скидаємо стан гри
  21.     paused = false -- Скидаємо стан паузи
  22.     score = 0 -- Скидаємо рахунок
  23. end
  24.  
  25. local direction = "right" -- Початковий напрямок руху
  26. local move_timer = 0 -- Таймер для руху змійки
  27. local move_interval = 0.2 -- Інтервал руху (в секундах)
  28.  
  29. local function custom_max(a, b)
  30.     if a > b then
  31.         return a
  32.     else
  33.         return b
  34.     end
  35. end
  36.  
  37. -- Генеруємо нову їжу
  38. local function generate_food()
  39.     local valid_position = false
  40.     while not valid_position do
  41.         -- Генеруємо випадкову позицію
  42.         food.x = math.random(0, display.width // cell_size - 1)
  43.         food.y = math.random(0, display.height // cell_size - 1)
  44.  
  45.         -- Перевіряємо, чи їжа не знаходиться всередині тіла змійки
  46.         valid_position = true
  47.         for _, segment in ipairs(snake) do
  48.             if segment.x == food.x and segment.y == food.y then
  49.                 valid_position = false
  50.                 break
  51.             end
  52.         end
  53.     end
  54. end
  55.  
  56. function lilka.update(delta)
  57.     local state = controller.get_state()
  58.     if not state then
  59.         return -- Вихід, якщо стан контролера не отримано
  60.     end
  61.  
  62.     if game_over then
  63.         if state.a and state.a.just_pressed then
  64.             lilka.init() -- Починаємо нову гру
  65.             game_over = false -- Скидаємо стан програшу
  66.         elseif state.b and state.b.just_pressed then
  67.             util.exit() -- Вихід із гри
  68.         end
  69.         return -- Якщо гра закінчена, не оновлюємо гру
  70.     end
  71.  
  72.     if state.d and state.d.just_pressed then
  73.         paused = not paused -- Перемикаємо стан паузи
  74.     end
  75.  
  76.     if paused then
  77.         -- Обробка меню паузи
  78.         if state.up and state.up.just_pressed then
  79.             menu_index = menu_index - 1
  80.             if menu_index < 1 then
  81.                 menu_index = 4 -- Повертаємося до останнього пункту
  82.             end
  83.         elseif state.down and state.down.just_pressed then
  84.             menu_index = menu_index + 1
  85.             if menu_index > 4 then
  86.                 menu_index = 1 -- Повертаємося до першого пункту
  87.             end
  88.         elseif state.a and state.a.just_pressed then
  89.             if menu_index == 1 then
  90.                 paused = false -- Продовжити гру
  91.             elseif menu_index == 2 then
  92.                 lilka.init() -- Нова гра
  93.                 paused = false
  94.             elseif menu_index == 3 then
  95.                 -- Відкрити таблицю рекордів
  96.                 lilka.show_high_scores()
  97.             elseif menu_index == 4 then
  98.                 util.exit() -- Вихід із гри
  99.             end
  100.         end
  101.         return -- Якщо гра на паузі, не оновлюємо гру
  102.     end
  103.  
  104.     -- Обробляємо введення користувача:
  105.     if state.up and state.up.just_pressed and direction ~= "down" then
  106.         direction = "up"
  107.     elseif state.down and state.down.just_pressed and direction ~= "up" then
  108.         direction = "down"
  109.     elseif state.left and state.left.just_pressed and direction ~= "right" then
  110.         direction = "left"
  111.     elseif state.right and state.right.just_pressed and direction ~= "left" then
  112.         direction = "right"
  113.     end
  114.  
  115.     -- Оновлюємо таймер
  116.     move_timer = move_timer + delta
  117.     if move_timer >= move_interval then
  118.         move_timer = 0 -- Скидаємо таймер
  119.  
  120.         -- Рухаємо змійку
  121.         local head = snake[1]
  122.         local new_head = { x = head.x, y = head.y }
  123.  
  124.         if direction == "up" then
  125.             new_head.y = new_head.y - 1
  126.         elseif direction == "down" then
  127.             new_head.y = new_head.y + 1
  128.         elseif direction == "left" then
  129.             new_head.x = new_head.x - 1
  130.         elseif direction == "right" then
  131.             new_head.x = new_head.x + 1
  132.         end
  133.  
  134.         -- Перевірка виходу за межі екрану
  135.         if new_head.x < 0 then
  136.             new_head.x = display.width // cell_size - 1 -- Перехід на правий край
  137.         elseif new_head.x >= display.width // cell_size then
  138.             new_head.x = 0 -- Перехід на лівий край
  139.         end
  140.  
  141.         if new_head.y < 0 then
  142.             new_head.y = display.height // cell_size - 1 -- Перехід на нижній край
  143.         elseif new_head.y >= display.height // cell_size then
  144.             new_head.y = 0 -- Перехід на верхній край
  145.         end
  146.  
  147.         -- Перевірка, чи змійка з'їла себе
  148.         for i = 1, #snake do
  149.             if snake[i].x == new_head.x and snake[i].y == new_head.y then
  150.                 game_over = true -- Завершуємо гру
  151.                 return
  152.             end
  153.         end
  154.  
  155.         -- Додаємо нову голову до змійки
  156.         table.insert(snake, 1, new_head)
  157.  
  158.         -- Перевірка, чи з'їла змійка їжу
  159.         if new_head.x == food.x and new_head.y == food.y then
  160.             score = score + 1 -- Збільшуємо рахунок
  161.             generate_food() -- Викликаємо функцію для генерації їжі
  162.         else
  163.             -- Видаляємо хвіст, якщо їжа не з'їдена
  164.             table.remove(snake)
  165.         end
  166.  
  167.         move_interval = custom_max(0.05, 0.2 - #snake * 0.005) -- Швидкість залежить від довжини змійки
  168.     end
  169. end
  170.  
  171. function lilka.draw()
  172.     -- Малюємо чорний фон
  173.     display.fill_screen(display.color565(0, 0, 0))
  174.  
  175.     if paused then
  176.         -- Оновлене меню паузи
  177.         local menu_items = { "ПРОДОВЖИТИ", "НОВА ГРА", "ТАБЛИЦЯ РЕКОРДІВ", "ВИХІД" }
  178.         local menu_x = display.width // 2 -- Центруємо текст
  179.         local menu_y = display.height // 2 - 60 -- Центруємо меню трохи вище
  180.         local box_width = 200 -- Ширина прямокутника
  181.         local box_height = 200 -- Висота прямокутника
  182.  
  183.         -- Малюємо фон для меню
  184.         local box_x = (display.width - box_width) // 2
  185.         local box_y = (display.height - box_height) // 2
  186.         display.fill_rect(box_x, box_y, box_width, box_height, display.color565(25, 25, 112)) -- Темно-синій фон
  187.  
  188.         -- Малюємо рамку для меню
  189.         display.draw_rect(box_x, box_y, box_width, box_height, display.color565(255, 215, 0)) -- Золотиста рамка
  190.  
  191.         -- Малюємо пункти меню
  192.         for i, item in ipairs(menu_items) do
  193.             local item_y = menu_y + (i - 1) * 40 -- Відстань між пунктами меню
  194.             if i == menu_index then
  195.                 -- Малюємо залитий прямокутник за текстом
  196.                 display.fill_rect(box_x + 10, item_y - 12, box_width - 20, 30, display.color565(70, 130, 180)) -- Світло-синій фон
  197.             end
  198.             -- Малюємо текст пункту меню
  199.             display.set_cursor(menu_x - (#item * 5), item_y) -- Центруємо текст
  200.             display.set_text_color(display.color565(255, 255, 255)) -- Білий текст
  201.             display.print(item)
  202.         end
  203.  
  204.         -- Обробка вибору пункту меню
  205.         if state.a.just_pressed then
  206.             if menu_index == 1 then
  207.                 paused = false -- Продовжити гру
  208.             elseif menu_index == 2 then
  209.                 lilka.init() -- Нова гра
  210.                 paused = false
  211.             elseif menu_index == 3 then
  212.                 -- Відкрити таблицю рекордів
  213.                 lilka.show_high_scores()
  214.             elseif menu_index == 4 then
  215.                 util.exit() -- Вихід із гри
  216.             end
  217.         end
  218.         return -- Якщо гра на паузі, не оновлюємо гру
  219.     end
  220.  
  221.     if game_over then
  222.         -- Виводимо повідомлення про завершення гри
  223.         local text = "ТИ ПРОГРАВ!"
  224.         local score_text = "ТВІЙ РАХУНОК: " .. tostring(score)
  225.         local repeat_text = "НОВА ГРА (A), ВИЙТИ (B)"
  226.  
  227.         -- Встановлюємо ширину рамки з полями
  228.         local box_width = display.width - 40 -- Поля по 20 пікселів з кожного боку
  229.         local box_height = 150 -- Висота прямокутника
  230.         local box_x = (display.width - box_width) // 2
  231.         local box_y = (display.height - box_height) // 2
  232.  
  233.         -- Малюємо фон для повідомлення
  234.         display.fill_rect(box_x, box_y, box_width, box_height, display.color565(25, 25, 112)) -- Темно-синій фон
  235.  
  236.         -- Малюємо рамку для повідомлення
  237.         display.draw_rect(box_x, box_y, box_width, box_height, display.color565(255, 215, 0)) -- Золотиста рамка
  238.  
  239.         -- Малюємо текст "ТИ ПРОГРАВ!"
  240.         local text_x = display.width // 2 - (#text * 5) // 2 -- Центруємо текст
  241.         local text_y = box_y + 10
  242.         display.set_cursor(text_x, text_y)
  243.         display.set_text_color(display.color565(255, 255, 255)) -- Білий текст
  244.         display.print(text)
  245.  
  246.         -- Малюємо текст "ТВІЙ РАХУНОК"
  247.         local score_x = display.width // 2 - (#score_text * 5) // 2 -- Центруємо текст
  248.         local score_y = text_y + 30
  249.         display.set_cursor(score_x, score_y)
  250.         display.print(score_text)
  251.  
  252.         -- Малюємо текст "НОВА ГРА (A), ВИЙТИ (B)"
  253.         local repeat_x = display.width // 2 - (#repeat_text * 5) // 2 -- Центруємо текст
  254.         local repeat_y = box_y + box_height - 30
  255.         display.set_cursor(repeat_x, repeat_y)
  256.         display.print(repeat_text)
  257.  
  258.         return
  259.     end
  260.  
  261.     -- Малюємо змійку
  262.     for _, segment in ipairs(snake) do
  263.         -- Додаємо проміжки між сегментами
  264.         local segment_size = cell_size - 2 -- Зменшуємо розмір сегмента для створення проміжків
  265.         local segment_x = segment.x * cell_size + 1 -- Додаємо відступ зліва
  266.         local segment_y = segment.y * cell_size + 1 -- Додаємо відступ зверху
  267.         display.fill_rect(segment_x, segment_y, segment_size, segment_size, display.color565(0, 255, 0)) -- Малюємо сегмент
  268.     end
  269.  
  270.     -- Малюємо їжу у вигляді яблука
  271.     local function draw_apple(x, y, size)
  272.         -- Листочок (зелений) - по діагоналі та більший
  273.         local leaf_width = size // 2
  274.         local leaf_height = size // 3
  275.         display.fill_rect(x + size // 2, y - leaf_height, leaf_width, leaf_height, display.color565(0, 128, 0)) -- Листочок по діагоналі
  276.  
  277.         -- Яблуко (червоне) - створюємо круглу форму
  278.         local radius = size // 2
  279.         for i = -radius, radius do
  280.             for j = -radius, radius do
  281.                 if i * i + j * j <= radius * radius then -- Перевірка, чи точка належить колу
  282.                     display.fill_rect(x + radius + i, y + radius + j, 1, 1, display.color565(255, 0, 0)) -- Малюємо піксель яблука
  283.                 end
  284.             end
  285.         end
  286.     end
  287.  
  288.     -- Використовуємо функцію для малювання їжі
  289.     draw_apple(food.x * cell_size, food.y * cell_size, cell_size)
  290. end
  291.  
  292. function lilka.show_high_scores()
  293.     -- Малюємо чорний фон
  294.     display.fill_screen(display.color565(0, 0, 0))
  295.  
  296.     -- Заголовок
  297.     local title = "ТАБЛИЦЯ РЕКОРДІВ"
  298.     local title_x = display.width // 2 - (#title * 5) // 2
  299.     local title_y = 20
  300.     display.set_cursor(title_x, title_y)
  301.     display.set_text_color(display.color565(255, 255, 255)) -- Білий текст
  302.     display.print(title)
  303.  
  304.     -- Виведення рекордів (приклад)
  305.     local scores = { 100, 90, 80, 70, 60 } -- Замініть на реальні дані
  306.     for i, score in ipairs(scores) do
  307.         local score_text = tostring(i) .. ". " .. tostring(score)
  308.         local score_x = display.width // 2 - (#score_text * 5) // 2
  309.         local score_y = title_y + 30 + (i - 1) * 20
  310.         display.set_cursor(score_x, score_y)
  311.         display.print(score_text)
  312.     end
  313.  
  314.     -- Інструкція для повернення
  315.     local back_text = "НАТИСНІТЬ A, ЩОБ ПОВЕРНУТИСЯ"
  316.     local back_x = display.width // 2 - (#back_text * 5) // 2
  317.     local back_y = display.height - 30
  318.     display.set_cursor(back_x, back_y)
  319.     display.print(back_text)
  320.  
  321.     -- Очікуємо натискання кнопки A для повернення
  322.     while true do
  323.         local state = controller.get_state()
  324.         if state.a.just_pressed then
  325.             break -- Повертаємося до гри
  326.         end
  327.     end
  328. end
  329.  
  330. if (score or 0) > (high_score or 0) then
  331.     high_score = score -- Оновлюємо рекорд
  332. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement