import machine
import ssd1306
import time
import random
# 1. Ініціалізація екрана та кнопок керування
i2c = machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Кнопки підключені за схемою PULL_UP (при натисканні видають 0)
btn_up = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP)
btn_down = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
# 2. Ігрові змінні
score = 0
game_active = True
# Параметри ракетки гравця (ліворуч)
paddle_x = 4
paddle_y = 24
paddle_w = 4
paddle_h = 16
paddle_speed = 3
# Параметри м'яча
ball_x = 64
ball_y = 32
ball_size = 4
ball_dx = 2 # Швидкість по осі X (напрямок)
ball_dy = 1 # Швидкість по осі Y (напрямок)
# Скидання віртуального екрана Wokwi
oled.fill(0)
oled.show()
time.sleep_ms(200)
while True:
if game_active:
# 3. Обробка натискання кнопок (Рух ракетки)
if btn_up.value() == 0 and paddle_y > 0:
paddle_y -= paddle_speed
if btn_down.value() == 0 and paddle_y < (64 - paddle_h):
paddle_y += paddle_speed
# 4. Рух м'яча
ball_x += ball_dx
ball_y += ball_dy
# Зіткнення м'яча зі стелею та підлогою (відскок)
if ball_y <= 0 or ball_y >= (64 - ball_size):
ball_dy = -ball_dy
# Зіткнення м'яча з правою стіною (відскок)
if ball_x >= (128 - ball_size):
ball_dx = -ball_dx
# Зіткнення м'яча з ракеткою гравця
if (ball_x <= (paddle_x + paddle_w) and
(ball_y + ball_size) >= paddle_y and
ball_y <= (paddle_y + paddle_h)):
ball_dx = -ball_dx # Відбиваємо м'яч назад
score += 1 # Додаємо бал
# Невелике прискорення гри для ускладнення
if abs(ball_dx) < 6:
ball_dx = ball_dx * 1.1 if ball_dx > 0 else ball_dx * 1.1
# Програш: м'яч вилетів за ліву межу екрана
if ball_x < 0:
game_active = False
# 5. Оновлення та малювання графіки (Кадр гри)
oled.fill(0) # Очищаємо старий кадр
# Малюємо рахунок по центру верхньої частини
oled.text("Score: " + str(score), 45, 0)
# Малюємо ракетку (прямокутник) та м'яч (квадрат)
oled.fill_rect(int(paddle_x), int(paddle_y), paddle_w, paddle_h, 1)
oled.fill_rect(int(ball_x), int(ball_y), ball_size, ball_size, 1)
oled.show() # Відображаємо новий кадр
time.sleep_ms(16) # Обмежуємо швидкість гри (~60 кадрів/сек)
else:
# Екран завершення гри (Game Over)
oled.fill(0)
oled.text(" GAME OVER ", 4, 15)
oled.text("Final Score: " + str(score), 10, 35)
oled.text("Press UP to Rest", 4, 52)
oled.show()
# Чекаємо натискання верхньої кнопки для перезапуску
while btn_up.value() == 1:
time.sleep_ms(50)
# Скидаємо гру в початковий стан
score = 0
ball_x = 64
ball_y = 32
ball_dx = 2
ball_dy = 1
paddle_y = 24
game_active = True