Загрузка данных
import machine
import ssd1306
import time
# Инициализация OLED дисплея (SDA=21, SCL=22)
i2c = machine.I2C(0, sda=machine.Pin(21), scl=machine.Pin(22))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Инициализация кнопок (с внутренней подтяжкой к питанию)
# Обычно на таких платах кнопки замыкаются на GND, т.е. нажато = 0
btn_reset = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
btn_food = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
btn_sleep = machine.Pin(25, machine.Pin.IN, machine.Pin.PULL_UP)
btn_love = machine.Pin(26, machine.Pin.IN, machine.Pin.PULL_UP)
# Параметры питомца (от 0 до 100)
food = 100
sleep = 100
love = 100
is_alive = True
def draw_cat(x_offset=80, y_offset=20, state="happy"):
"""Отрисовка кота с помощью графических примитивов"""
if not is_alive:
# Мертвый котик (крестики вместо глаз)
oled.line(x_offset+5, y_offset+10, x_offset+9, y_offset+14, 1)
oled.line(x_offset+9, y_offset+10, x_offset+5, y_offset+14, 1)
oled.line(x_offset+15, y_offset+10, x_offset+19, y_offset+14, 1)
oled.line(x_offset+19, y_offset+10, x_offset+15, y_offset+14, 1)
# Рот грустный
oled.line(x_offset+10, y_offset+20, x_offset+14, y_offset+18, 1)
return
# Уши
oled.triangle(x_offset+2, y_offset+5, x_offset+8, y_offset+5, x_offset+2, y_offset-3, 1)
oled.triangle(x_offset+16, y_offset+5, x_offset+22, y_offset+5, x_offset+22, y_offset-3, 1)
# Голова и тело
oled.fill_rect(x_offset+2, y_offset+5, 21, 16, 1)
oled.fill_rect(x_offset+5, y_offset+21, 15, 18, 1)
# Лапки
oled.fill_rect(x_offset+5, y_offset+39, 4, 4, 1)
oled.fill_rect(x_offset+16, y_offset+39, 4, 4, 1)
# Хвост
oled.line(x_offset+20, y_offset+35, x_offset+28, y_offset+27, 1)
oled.line(x_offset+28, y_offset+27, x_offset+28, y_offset+20, 1)
# Вырезаем глаза и мордочку (рисуем черным поверх белого)
if state == "sleep":
# Спящие закрытые глаза (полосочки)
oled.line(x_offset+5, y_offset+11, x_offset+9, y_offset+11, 0)
oled.line(x_offset+15, y_offset+11, x_offset+19, y_offset+11, 0)
else:
# Обычные открытые глаза
oled.fill_rect(x_offset+5, y_offset+9, 4, 4, 0)
oled.fill_rect(x_offset+15, y_offset+9, 4, 4, 0)
# Зрачки
oled.pixel(x_offset+6, y_offset+10, 1)
oled.pixel(x_offset+16, y_offset+10, 1)
# Носик и ротик
oled.pixel(x_offset+12, y_offset+13, 0)
oled.line(x_offset+10, y_offset+15, x_offset+14, y_offset+15, 0)
# Усики (выходят за пределы головы на черный фон)
oled.line(x_offset-2, y_offset+13, x_offset+2, y_offset+14, 1)
oled.line(x_offset-2, y_offset+16, x_offset+2, y_offset+15, 1)
oled.line(x_offset+22, y_offset+14, x_offset+26, y_offset+13, 1)
oled.line(x_offset+22, y_offset+15, x_offset+26, y_offset+16, 1)
def draw_interface(current_state):
"""Отрисовка интерфейса: 3 полоски слева, кот справа"""
oled.fill(0)
if is_alive:
# Подписи шкал
oled.text("F:", 2, 5, 1)
oled.text("S:", 2, 25, 1)
oled.text("L:", 2, 45, 1)
# Отрисовка рамок для полосок (длина 40 пикселей, высота 8)
oled.rect(20, 5, 42, 8, 1)
oled.rect(20, 25, 42, 8, 1)
oled.rect(20, 45, 42, 8, 1)
# Заполнение полосок пропорционально значениям
oled.fill_rect(21, 6, int(food * 40 / 100), 6, 1)
oled.fill_rect(21, 26, int(sleep * 40 / 100), 6, 1)
oled.fill_rect(21, 46, int(love * 40 / 100), 6, 1)
else:
oled.text("GAME OVER", 10, 20, 1)
oled.text("Press Rst", 10, 35, 1)
# Рисуем кота справа
draw_cat(x_offset=85, y_offset=15, state=current_state)
oled.show()
# Переменные для отслеживания времени и анимации
last_tick = time.time()
cat_state = "happy"
state_timer = 0
print("Тамагочи запущен!")
while True:
now = time.time()
# Каждую секунду показатели немного падают
if is_alive and (now - last_tick >= 1):
food = max(0, food - 2)
sleep = max(0, sleep - 1)
love = max(0, love - 2)
last_tick = now
# Проверка условий гибели
if food <= 0 or sleep <= 0 or love <= 0:
is_alive = False
# Смена анимации лица обратно на обычную по таймеру
if cat_state != "happy" and is_alive:
state_timer += 1
if state_timer > 15: # Около 1.5 секунд на действие
cat_state = "happy"
state_timer = 0
# Опрос кнопок (0 означает, что кнопка физически зажата)
if btn_reset.value() == 0:
food = 100
sleep = 100
love = 100
is_alive = True
cat_state = "happy"
time.sleep(0.2) # Защита от дребезга контактов
if is_alive:
if btn_food.value() == 0:
food = min(100, food + 15)
cat_state = "happy"
state_timer = 0
time.sleep(0.2)
if btn_sleep.value() == 0:
sleep = min(100, sleep + 20)
cat_state = "sleep"
state_timer = 0
time.sleep(0.2)
if btn_love.value() == 0:
love = min(100, love + 10)
cat_state = "happy"
# Можно сделать анимацию подмигивания при поглаживании
state_timer = 0
time.sleep(0.2)
# Обновление графики на экране
draw_interface(cat_state)
time.sleep(0.1)