Для того, щоб зрозуміти чи підходить вам програмування, можна спробувати написати щось самостійно. У цій статті ми пропонуємо написати дуже просту програму – гру «Змійка», використовуючи Python. Плануємо показати, що програмувати – це цікаво та весело, тож почнемо.

 

 

      Звісно, що для того, щоб написати гру потрібно розуміти основні принципи та мати хоч деякий досвід у програмуванні, але ми постараємося викласти матеріал просто та по можливості уникнути усілякої складної термінології.

Встановимо «PYGAME»

      Для того, щоб було просто написати гру, будемо використовувати спеціальний модуль pygame, в якому вже вирішено багато низькорівневих задач, такі як імпорт графіки, її "відрисовка", робота зі звуком тощо. Для цього потрібно у вашому IDE встановити pygame, у PyCharm, наприклад, це робиться наступним чином:
File ->Settings ->Project:<ім'я проєкту> ->Python Interpreter ->тиснемо'+' -> шукаємо та встановлюємо «pygame». Тепер ми можемо його використовувати.

 

 

Починаємо створення гри

      Спочатку викличемо команду pygame.init() для ініціалізації самого модуля та об'явимо деякі змінні, що будуть відповідати за параметри ігрових об'єктів.

pygame.init()

white = (255, 255, 255)  # деякі кольори у rgb-форматі
black = (0, 0, 0)
red = (255, 0, 0)
magenta = (220, 20, 60)
green = (0, 255, 0)
display_params = (500, 500)  # розмір екрана
display = pygame.display.set_mode(display_params)
pygame.display.set_caption('Simple Snake') # назва вікна з грою
clock = pygame.time.Clock()   # потрібно буде для встановлювання фреймрейту гри
block_size = 10  # розмір одного сегменту змійки
font = pygame.font.SysFont("Arial", 35)  # шрифт для тексту
snake_speed = 10  # швидкість змійки

1. Будь-яка гра складається з окремих кадрів, які оновлюються з певною частотою. Кількість таких кадрів за секунду називається фреймрейтом. Зазвичай фрейм рейт в іграх варіюється від 25 до 60 кадрів за секунду, але в нашій грі для простоти ми будемо використовувати швидкість змійки як фреймрейт, тобто буде 10 кадрів у секунду.

2. Кожен кадр будемо виконувати декілька нескладних операцій:

- перевіряти взаємодію користувача з пристроєм вводу (клавіатурою)

- перевіряти колізії (тобто чи зіштовхнулася з чимось змійка, якщо так, то з чим)

- розраховувати позиції усіх динамічних об'єктів у кадрі

- "відрисовувати" всі об'єкти на екрані.

      І так 10 разів на секунду.

3. Вся основна логіка гри реалізована у функції update(), далі наводиться код цієї функції.

- Спочатку проініціалізуємо деякі змінні

snake_direction = (0, -block_size)  # напрямок змійки
snake = [[display_params[0] // 2, display_params[1] // 2]]  # її позиція на полі
food_pos = calc_food_position()  # розраховуємо позицію їжі на полі

      Функцію calc_food_position() та інші допоміжні функції можна знайти тут (за браком місця ми не можемо навести увесь сорс-код у статті):
https://github.com/lezhocheck/small-projects/blob/main/Simple%20snake%20game/simple_snake.py

- Далі запускаємо основний цикл гри, перевіряємо ввод гравця із пристрою вводу, за допомогою «pygame» це зробити досить просто:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFTandsnake_direction != (block_size, 0):
                snake_direction = (-block_size, 0)
            elif event.key == pygame.K_RIGHTandsnake_direction != (-block_size, 0):
                snake_direction = (block_size, 0)
            elif event.key == pygame.K_UPandsnake_direction != (0, block_size):
                snake_direction = (0, -block_size)
            elif event.key == pygame.K_DOWNandsnake_direction != (0, -block_size):
                snake_direction = (0, block_size) 

 

- Зараз перевіримо колізії. Для цього просто викличемо функцію, що перевіряє, чи зіштовхнулася змійка з собою або чи вийшла вона за границі екрану. Якщо так, то просто виходимо з функції, таким чином завершуючи гру.

- Далі розраховуємо нову позицію змійки та «відрисовуємо» кадр.

- Наступний крок, викликом команди clock.tick (snake_speed) встановлюємо потрібні фреймрейту 10 кадрів для гри.

if check_collisions(snake):  # перевіряємо колізії
    return len(snake) – 1

for i in range(len(snake) - 1, 0, -1):  # знаходимо нову позицію сегментів змійки
    snake[i][0] = snake[i - 1][0]
    snake[i][1] = snake[i - 1][1]

snake[0][0] += snake_direction[0]  # розраховуємо нову позицію голови змійки
snake[0][1] += snake_direction[1]

draw_frame(snake, food_pos) # малюємо кадр
if tuple(snake[0]) == food_pos: # перевіряємо, якщо змійка з'їла їжу
    food_pos = calc_food_position() # тоді малюємо нову їжу


snake.append([snake[-1][0] - snake_direction[0],  # та збільшуємо розмір змійки
                     snake[-1][1] - snake_direction[1]])
clock.tick(snake_speed)  # встановлюємо потрібний фреймрейт

 

4. Створимо функції для відображення початкового екрану та екрану, який відображається, якщо гравець програв (їх реалізацію можна знайти на гітхабі, посилання на який знаходиться вище).

 

5. Не забуваємо викликати всі функції

start()  # для відображення початкового екрану
score = update()  # виклик основної функції
finish(score)  # для зображення екрану програшу

 

Гра готова! Можна тестувати. Ось декілька скриншотів з гри.

 

 

Сподіваємося, що ця стаття надихне вас на створення чогось цікавого та спробу себе у дуже цікавій галузі програмування!

Успіхів!

Олег Топорков

 

Популярні статті

Читати далі