Загрузка данных
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)