from machine import Pin, I2C
import ssd1306
import time
import random
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
b13 = Pin(13, Pin.IN, Pin.PULL_UP) # покормить
b14 = Pin(14, Pin.IN, Pin.PULL_UP) # играть
b25 = Pin(25, Pin.IN, Pin.PULL_UP) # спать
b26 = Pin(26, Pin.IN, Pin.PULL_UP) # сброс
hunger = 50 # 0 = сыт, 100 = голодный
mood = 50 # 0 = грустный, 100 = счастливый
energy = 50 # 0 = уставший, 100 = бодрый
alive = True
# Мордочка
FACE_HAPPY = [
" #### #### ",
" ## ## ## ##",
"## ## ##",
"## # # ##",
" ## #### ## ",
" ## ## ",
" ###### "
]
FACE_SAD = [
" #### #### ",
" ## ## ## ##",
"## ## ##",
"## # # ##",
" ## #### ## ",
" ## ## ",
" ###### "
]
FACE_SLEEP = [
" ",
" #### #### ",
" ## ## ## ##",
"## ## ##",
" ## ---- ## ",
" ## ## ",
" ###### "
]
def draw_face(face, x=28, y=8):
for row, line in enumerate(face):
for col, ch in enumerate(line):
if ch == '#':
oled.pixel(x + col, y + row, 1)
def draw_bars():
# Полоски состояния
def bar(x, y, val, label):
oled.text(label, x, y)
oled.rect(x + 18, y, 30, 7, 1)
fill = int(val * 28 / 100)
if fill > 0:
oled.fill_rect(x + 19, y + 1, fill, 5, 1)
bar(0, 40, 100 - hunger, "E:")
bar(0, 50, mood, "M:")
bar(64, 50, energy, "S:")
last_press = [1, 1, 1, 1]
while True:
if not alive:
oled.fill(0)
oled.text("GAME OVER", 28, 20)
oled.text("Press D26", 28, 36)
oled.show()
if b26.value() == 0:
hunger, mood, energy, alive = 50, 50, 50, True
time.sleep(0.3)
time.sleep(0.05)
continue
# Обработка кнопок
btns = [b13.value(), b14.value(), b25.value(), b26.value()]
if btns[0] == 0 and last_press[0] == 1:
hunger = max(0, hunger - 15)
mood = min(100, mood + 5)
if btns[1] == 0 and last_press[1] == 1:
mood = min(100, mood + 15)
energy = max(0, energy - 10)
hunger = min(100, hunger + 5)
if btns[2] == 0 and last_press[2] == 1:
energy = min(100, energy + 20)
if btns[3] == 0 and last_press[3] == 1:
hunger, mood, energy = 50, 50, 50
last_press = btns
# Время идёт
hunger = min(100, hunger + 0.3)
mood = max(0, mood - 0.15)
energy = max(0, energy - 0.1)
# Смерть
if hunger >= 100 or mood <= 0 or energy <= 0:
alive = False
# Выбор мордочки
if btns[2] == 0 or energy < 20:
face = FACE_SLEEP
elif mood > 60 and hunger < 60:
face = FACE_HAPPY
else:
face = FACE_SAD
oled.fill(0)
draw_face(face)
draw_bars()
oled.show()
time.sleep(0.1)