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


import machine
import ssd1306
import time

# 1. Инициализация дисплея OLED (SDA=21, SCL=22)
i2c = machine.I2C(0, sda=machine.Pin(21), scl=machine.Pin(22))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# 2. Настройка кнопок с подтяжкой к питанию (нажато = 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)

# 3. Стартовые параметры питомца
food = 100
sleep = 100
love = 100
is_alive = True

# Тайминги для анимации лица котика
cat_state = "happy"
state_timer = 0
last_tick = time.time()

def draw_cat(x, y, state):
    """Рисует кота справа, используя только базовые line, rect и fill_rect"""
    if not is_alive:
        # Мертвый котик (крестики вместо глаз)
        oled.line(x+4, y+10, x+8, y+14, 1)
        oled.line(x+8, y+10, x+4, y+14, 1)
        oled.line(x+14, y+10, x+18, y+14, 1)
        oled.line(x+18, y+10, x+14, y+14, 1)
        # Грустный рот
        oled.line(x+9, y+20, x+13, y+18, 1)
        return

    # --- УШКИ (сделаны через линии) ---
    # Левое ухо
    oled.line(x+2, y+5, x+2, y, 1)
    oled.line(x+2, y, x+6, y+5, 1)
    # Правое ухо
    oled.line(x+20, y+5, x+20, y, 1)
    oled.line(x+20, y, x+16, y+5, 1)
    
    # --- ТЕЛО И ГОЛОВА ---
    # Голова
    oled.fill_rect(x+2, y+5, 19, 15, 1)
    # Тело
    oled.fill_rect(x+4, y+20, 15, 18, 1)
    # Лапки
    oled.fill_rect(x+4, y+38, 4, 3, 1)
    oled.fill_rect(x+15, y+38, 4, 3, 1)
    # Хвост
    oled.line(x+19, y+34, x+25, y+28, 1)
    oled.line(x+25, y+28, x+25, y+21, 1)

    # --- МОРДОЧКА (рисуем черным поверх белой головы) ---
    if state == "sleep":
        # Спящие глаза-полосочки
        oled.line(x+5, y+10, x+8, y+10, 0)
        oled.line(x+14, y+10, x+17, y+10, 0)
    else:
        # Обычные открытые глаза
        oled.fill_rect(x+5, y+9, 3, 3, 0)
        oled.fill_rect(x+14, y+9, 3, 3, 0)
        # Живые зрачки
        oled.pixel(x+6, y+10, 1)
        oled.pixel(x+15, y+10, 1)

    # Носик и ротик
    oled.pixel(x+10, y+13, 0)
    oled.line(x+9, y+15, x+12, y+15, 0)
    
    # Усики (белые линии, выходящие наружу)
    oled.line(x-2, y+12, x+2, y+13, 1)
    oled.line(x-2, y+16, x+2, y+15, 1)
    oled.line(x+21, y+13, x+25, y+12, 1)
    oled.line(x+21, y+15, x+25, y+16, 1)

def refresh_screen():
    """Стирает старый кадр и строит новый интерфейс"""
    oled.fill(0)
    
    if is_alive:
        # Текстовые метки
        oled.text("F:", 2, 5, 1)   # Еда (Food)
        oled.text("S:", 2, 25, 1)  # Сон (Sleep)
        oled.text("L:", 2, 45, 1)  # Любовь/Погладить (Love)
        
        # Рамки для шкал (длина 42 пикселя)
        oled.rect(20, 5, 42, 9, 1)
        oled.rect(20, 25, 42, 9, 1)
        oled.rect(20, 45, 42, 9, 1)
        
        # Заполнение прогресс-баров
        oled.fill_rect(21, 6, int(food * 40 / 100), 7, 1)
        oled.fill_rect(21, 26, int(sleep * 40 / 100), 7, 1)
        oled.fill_rect(21, 46, int(love * 40 / 100), 7, 1)
    else:
        oled.text("GAME OVER", 5, 20, 1)
        oled.text("Press Rst(G13)", 5, 38, 1)

    # Отрисовываем кота в правой части (координаты X=85, Y=15)
    draw_cat(85, 15, cat_state)
    oled.show()

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
            
    # Возвращаем кота в обычное состояние "happy" через некоторое время после сна
    if cat_state != "happy" and is_alive:
        state_timer += 1
        if state_timer > 15:  # Удерживает эмоцию примерно 1.5 секунды
            cat_state = "happy"
            state_timer = 0

    # Проверка нажатия кнопки Сброса (G13)
    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 + 15)
            cat_state = "happy"
            state_timer = 0
            time.sleep(0.2)

    # Обновление экрана
    refresh_screen()
    time.sleep(0.1)