Створення простої гри “Змійка” за допомогою Python
Якщо ви шанувальник класичної гри “Змійка”, ця стаття може вас зацікавити. Ми розглянемо, як розробити власну просту версію цієї гри, яка підійде навіть для початківців у Python.
Існує декілька підходів до створення цієї гри. Один з них полягає у використанні бібліотеки PyGame, спеціалізованої для розробки ігор. Інший метод передбачає використання вбудованої бібліотеки `turtle`.
У цій статті ми зосередимося на використанні бібліотеки `turtle`, оскільки вона проста у використанні, особливо для тих, хто тільки починає вивчати програмування на Python. `turtle` надає нам віртуальне полотно, на якому ми можемо малювати фігури та зображення.
Крім модуля `turtle`, нам знадобляться ще два модулі:
- Модуль `time`: він дозволить нам відстежувати час, необхідний для затримки дій у грі.
- Модуль `random`: він використовується для генерації випадкових чисел, необхідних для розміщення їжі на екрані.
Для роботи також знадобиться текстовий редактор (наприклад, VSCode, який я використовуватиму у прикладі), і встановлений Python 3. Якщо Python ще не встановлено, можете скористатися онлайн-компілятором, наприклад, techukraine.net.
Приготуйтеся, буде весело!
Як працює гра “Змійка”
Мета гри проста: гравець керує змійкою, збираючи їжу, яка з’являється на ігровому екрані. За кожну зібрану порцію їжі гравець отримує бали. Керування змійкою здійснюється за допомогою клавіш напрямку (вгору, вниз, вліво, вправо).
Якщо змійка зіштовхнеться з краєм ігрового поля або сама з собою, гра закінчується. Для реалізації гри ми пройдемо наступні етапи:
- Імпортуємо необхідні модулі: `turtle`, `time` та `random`.
- Створимо ігрове поле за допомогою модуля `turtle`.
- Налаштуємо управління змійкою за допомогою клавіш напрямку.
- Реалізуємо логіку ігрового процесу.
Для початку, створіть файл `snakegame.py`, в якому ми будемо писати код.
Імпорт модулів
Перший крок – імпорт модулів `turtle`, `time` та `random`. Також ми ініціалізуємо значення за замовчуванням для рахунку гравця, його максимального рахунку і часу затримки між рухами змійки.
Додайте наступний код у файл `snakegame.py`:
import turtle import random import time player_score = 0 highest_score = 0 delay_time = 0.1
Створення ігрового екрану
За допомогою модуля `turtle` ми створюємо віртуальне полотно, яке слугуватиме екраном для нашої гри. На ньому будуть відображатися змійка, їжа, а також рахунок гравця.
Додайте наступний код:
# Створюємо ігрове вікно wind = turtle.Screen() wind.title("Змійка 🐍") wind.bgcolor("red") # Розмір екрану wind.setup(width=600, height=600) # Створюємо змійку snake = turtle.Turtle() snake.shape("square") snake.color("black") snake.penup() snake.goto(0, 0) snake.direction = "Stop" # Створюємо їжу snake_food = turtle.Turtle() shapes = random.choice(['triangle','circle']) snake_food.shape(shapes) snake_food.color("blue") snake_food.speed(0) snake_food.penup() snake_food.goto(0, 100) pen = turtle.Turtle() pen.speed(0) pen.shape('square') pen.color('white') pen.penup() pen.hideturtle() pen.goto(0, 250) pen.write("Рахунок: 0 Рекорд: 0", align="center", font=("Arial", 24, "normal")) turtle.mainloop()
Код створює екран, задає його заголовок і колір фону. Потім встановлюється розмір ігрового вікна, і створюється змійка, яка спочатку виглядає як чорний квадрат. Метод `penup()` піднімає “ручку”, щоб при переміщенні змійка не малювала лінію. Метод `goto(x, y)` переміщує змійку у задану позицію на екрані. Також створюється їжа для змійки, і об’єкт `pen`, який використовується для відображення рахунку на екрані.
Метод `hideturtle()` робить об’єкт `pen` невидимим. Метод `turtle.mainloop()` необхідний для того, щоб вікно програми залишалось відкритим, поки користувач не закриє його. Запустіть програму, і ви повинні побачити екран з змійкою та їжею.
Налаштування клавіш управління
Тепер необхідно налаштувати клавіші, які будуть використовуватися для управління змійкою. Ми будемо використовувати клавіші ‘L’ (ліворуч), ‘R’ (праворуч), ‘U’ (вгору), ‘D’ (вниз) для відповідних напрямків руху. Це робиться через функцію для управління рухом змійки.
Додайте наступний код:
# Задаємо напрямки руху def moveleft(): if snake.direction != "right": snake.direction = "left" def moveright(): if snake.direction != "left": snake.direction = "right" def moveup(): if snake.direction != "down": snake.direction = "up" def movedown(): if snake.direction != "up": snake.direction = "down" def move(): if snake.direction == "up": coord_y = snake.ycor() snake.sety(coord_y+20) if snake.direction == "down": coord_y = snake.ycor() snake.sety(coord_y-20) if snake.direction == "right": coord_x = snake.xcor() snake.setx(coord_x+20) if snake.direction == "left": coord_x = snake.xcor() snake.setx(coord_x-20) wind.listen() wind.onkeypress(moveleft, 'L') wind.onkeypress(moveright, 'R') wind.onkeypress(moveup, 'U') wind.onkeypress(movedown, 'D')
Функція `move()` забезпечує переміщення змійки в залежності від заданого напрямку. Функція `listen()` прослуховує події натискання клавіш і викликає відповідні методи для переміщення змійки.
Реалізація ігрового процесу
Настав час зробити нашу гру інтерактивною. Ось що потрібно реалізувати:
- Збільшувати довжину змійки, коли вона з’їдає їжу.
- Збільшувати рахунок гравця та відстежувати рекорд.
- Перевіряти зіткнення змійки зі стіною або з собою.
- Перезапускати гру у випадку зіткнення.
Додайте наступний код:
segments = [] # Реалізуємо ігровий процес while True: wind.update() if snake.xcor() > 290 or snake.xcor() < -290 or snake.ycor() > 290 or snake.ycor() < -290: time.sleep(1) snake.goto(0, 0) snake.direction = "Stop" snake.shape("square") snake.color("green") for segment in segments: segment.goto(1000, 1000) segments.clear() player_score = 0 delay_time = 0.1 pen.clear() pen.write("Рахунок: {} Рекорд: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal")) if snake.distance(snake_food) < 20: coord_x = random.randint(-270, 270) coord_y = random.randint(-270, 270) snake_food.goto(coord_x, coord_y) # Додаємо сегмент added_segment = turtle.Turtle() added_segment.speed(0) added_segment.shape("square") added_segment.color("white") added_segment.penup() segments.append(added_segment) delay_time -= 0.001 player_score += 5 if player_score > highest_score: highest_score = player_score pen.clear() pen.write("Рахунок: {} Рекорд: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal")) # Перевіряємо зіткнення for i in range(len(segments)-1, 0, -1): coord_x = segments[i-1].xcor() coord_y = segments[i-1].ycor() segments[i].goto(coord_x, coord_y) if len(segments) > 0: coord_x = snake.xcor() coord_y = snake.ycor() segments[0].goto(coord_x, coord_y) move() for segment in segments: if segment.distance(snake) < 20: time.sleep(1) snake.goto(0, 0) snake.direction = "stop" snake.color('white') snake.shape('square') for segment in segments: segment.goto(1000, 1000) segment.clear() player_score = 0 delay_time = 0.1 pen.clear() pen.write("Рахунок: {} Рекорд: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal")) time.sleep(delay_time) turtle.mainloop()
Цей код реалізує основну логіку гри. Коли змійка стикається зі стіною або із собою, гра перезапускається. Коли змійка з’їдає їжу, її довжина збільшується, а рахунок гравця зростає. Колір нового сегменту змінюється на білий для візуального розрізнення.
Запустіть файл і подивіться, як виглядає ваша гра!
Висновок 🐍
Як бачите, створити просту гру “Змійка” за допомогою бібліотеки `turtle` не так вже й складно. Звісно, ви можете реалізувати ту ж гру використовуючи PyGame. Для отримання додаткової інформації, ви можете звернутися до підручника PyGame.
Ви також можете спробувати інші цікаві проєкти, наприклад гру “Вгадай число” або парсинг даних JSON у Python.
Насолоджуйтесь програмуванням!