Загрузка данных


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)