
Це фрагмент книги Python з нуля, яка допоможе вам навчитися програмуванню з нуля. Ви можете знайти його на Allegro, Empik та в інтернет-книгарнях.
У цьому розділі ми встановимо пакет PyGame і використаємо його для малювання елементів нашої гри.

Так виглядатиме наша гра.

Персонаж гри кадр за кадром.
pygame. Якщо Ти користуєшся pip, введи в командному рядку:python -m pip install -U pygame --user
pygame.
Керування встановленими пакетами в PyCharm. Щоб додати новий пакет, натисни плюс, і відкриється вікно пошуку пакетів.
game.py. Імпорт PyGame виглядає, як більшість пакетів, це просто команда import pygame. Потім ми повинні викликати функцію init(), яка ініціалізує всі модулі пакета. Небагато пакетів мають подібні вимоги, але PyGame має багато функцій, тож деякі з них потрібно ініціалізувати.# game.py import pygame pygame.init()
pygame.display.set_mode, якій ми передаємо тапл із розміром вікна. Вікно має висоту і ширину, тому тапл повинен мати два значення типу int. Якого розміру має бути це вікно? Припустімо, наше поле матиме розмір 20 на 20, а кожен фрагмент матиме розмір 25 [^301_1]. Тому вікно має мати висоту і ширину 20 * 25. Оскільки ми малюємо квадрати, то їхню висоту і ширину будемо визначати однаковими координатами WIDTH.CUBE_SIZE = 25 CUBES_NUM = 20 WIDTH = CUBE_SIZE * CUBES_NUM screen = pygame.display.set_mode((WIDTH, WIDTH))
Постійні (тобто незмінні) значення, такі якCUBE_SIZE,CUBES_NUMабоWIDTH, ми зазвичай записуємо великими літерами, згідно з конвенцією SCREAMING_SNAKE_CASE.

fill з посиланням на вікно. Як значення ми знову повинні передати тапл, у якому буде збережено колір за допомогою запису RGB.

255, білий колір створюється через (255, 255, 255).WHITE = (255, 255, 255) screen.fill(WHITE)
BLUE = (0, 0, 255) GREEN = (0, 255, 0) WHITE = (255, 255, 255)
pygame.display.update(), щоб пакет знав, що потрібно відобразити зміну.pygame.display.update()
while True: pass
quit(), яка негайно завершує програму. Ми повинні викликати її, коли користувач просить закрити гру, а отже, у відповідь на певну подію. Ми ще поговоримо про події пізніше, а поки що достатньо зазначити, що в тіло нашого нескінченного циклу ми повинні додати такий код:for event in pygame.event.get(): if event.type == pygame.QUIT: quit()
# game.py import pygame pygame.init() CUBE_SIZE = 25 CUBES_NUM = 20 WIDTH = CUBE_SIZE * CUBES_NUM screen = pygame.display.set_mode((WIDTH, WIDTH)) WHITE = (255, 255, 255) screen.fill(WHITE) pygame.display.update() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: quit()

pygame.draw.rect з аргументами:- посилання на вікно, тобто
screen; - колір (тапл RGB);
- тапли з координатами лівого верхнього кута та розміром квадрата.

Визначення координат точки.

Квадрати розміром 25 на 25 із координатами (25, 25) і (175, 75).
(0, 255, 0). Ми визначили його висоту і ширину як CUBE_SIZE. Що стосується розміщення, то фрагменти повинні перебувати на сітці розміром CUBES_NUM. Тому ми б віддали перевагу визначенню розташування фрагмента за координатами на цій сітці. Таке розташування можна визначати за двома параметрами x та y.def draw_snake_part(x, y): position = (x * CUBE_SIZE, y * CUBE_SIZE, CUBE_SIZE, CUBE_SIZE) pygame.draw.rect(screen, GREEN, position) pygame.display.update()

draw_snake_part(0, 0) draw_snake_part(13, 16) draw_snake_part(10, 10) draw_snake_part(12, 8) draw_snake_part(19, 19)

pygame.draw.circle, до якої додаємо по черзі:- посилання на вікно, тобто у нас
screen; - колір (тапл RGB);
- положення центру кола (тапл з координатами);
- розмір кола (радіус).
CUBE_SIZE. Оскільки ми визначаємо положення центру кола, його також слід змістити на половину CUBE_SIZE відносно положення, де починався би квадрат.
Cітка координат на полотні.
def draw_food(x, y): radius = float(CUBE_SIZE) / 2 position = (x * CUBE_SIZE + radius, y * CUBE_SIZE + radius) pygame.draw.circle(screen, BLUE, position, radius) pygame.display.update()
draw_food(0, 0) draw_food(13, 16) draw_food(10, 10) draw_food(12, 8) draw_food(19, 19)

Position із розділу Оператори. У нашому прикладі ми будемо використовувати варіант, де він зберігає координати точки, а також дозволяє порівнювати значення і заміняти об’єкт на рядок. Порівняння точок знадобиться для перевірки, чи не наступили ми на хвіст чи "їжу". Їх виписування стане нам в нагоді під час роботи над грою. Додай наступний клас до свого проєкту в окремому файлі під назвою position.py.# position.py class Position: def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): return isinstance(other, Position) and \ self.x == other.x and \ self.y == other.y def __str__(self): return f"({self.x}, {self.y})" __repr__ = __str__
from position import Position
snake = [ Position(2, 2), Position(3, 2), Position(4, 2), Position(5, 2), Position(5, 1), ]

def draw_snake(snake): for part in snake: draw_snake_part(part.x, part.y)
Position:food = Position(11, 14)
Position як аргументи:def draw_snake_part(pos): position = (pos.x * CUBE_SIZE, pos.y * CUBE_SIZE, CUBE_SIZE, CUBE_SIZE) pygame.draw.rect(screen, GREEN, position) pygame.display.update()
def draw_food(pos): radius = float(CUBE_SIZE) / 2 position = (pos.x * CUBE_SIZE + radius, pos.y * CUBE_SIZE + radius) pygame.draw.circle(screen, BLUE, position, radius) pygame.display.update() def draw_snake(snake): for part in snake: draw_snake_part(part)
fill, яка заповнює все поле певним кольором.screen.fill(WHITE)
pygame.display.update(), щоб показати зміну. Однак, коли стан нашої гри почне змінюватися, це може призвести до того, що деякі елементи будуть блимати [^301_2]. Це також не найефективніше рішення, оскільки ми перемальовуємо елементи набагато частіше, ніж потрібно. Було би набагато краще спочатку визначити всі зміни, а потім відобразити їх одночасно. Щоб зробити це, ми позбудемося update з окремих функцій, натомість введемо функцію draw, яка намалює всі цікаві для нас елементи.def draw_snake_part(pos): position = (pos.x * CUBE_SIZE, pos.y * CUBE_SIZE, CUBE_SIZE, CUBE_SIZE) pygame.draw.rect(screen, GREEN, position) def draw_snake(snake): for part in snake: draw_snake_part(part) def draw_food(pos): radius = float(CUBE_SIZE) / 2 position = (pos.x * CUBE_SIZE + radius, pos.y * CUBE_SIZE + radius) pygame.draw.circle(screen, BLUE, position, radius) def fill_bg(): screen.fill(WHITE) def draw(snake, food): fill_bg() draw_snake(snake) draw_food(food) pygame.display.update()
[^301_2]: Швидко з’являтися та зникати.
