from machine import Pin, SoftSPI, I2C
from max7219 import Matrix8x8
from time import sleep
import ssd1306

i2c = I2C(0, scl=Pin(22), sda=Pin(23))
marcador = ssd1306.SSD1306_I2C(128, 64, i2c)

sck = Pin(4, Pin.OUT)
mosi = Pin(2, Pin.OUT)
miso = Pin(19, Pin.OUT)
cs = Pin(0, Pin.OUT)

spi = SoftSPI(baudrate=1000000, polarity=0, phase=0, sck=sck, mosi=mosi, miso=miso)
matriz = Matrix8x8(spi, cs, 4)
matriz.brightness(2)

pos_pacman = 0
fig_comidas = 0
puntos = 0
fig_estado = [True, True, True]
fig_pos = [11, 18, 25]

def pacman(pos):
    matriz.pixel(pos + 2, 2, 1)
    matriz.pixel(pos + 4, 2, 1)
    matriz.pixel(pos + 3, 2, 1)
    matriz.pixel(pos + 1, 3, 1)
    matriz.pixel(pos + 2, 3, 1)
    matriz.pixel(pos + 3, 3, 1)
    matriz.pixel(pos + 5, 3, 1)
    matriz.pixel(pos + 1, 4, 1)
    matriz.pixel(pos + 2, 4, 1)
    matriz.pixel(pos + 3, 4, 1)
    matriz.pixel(pos + 1, 5, 1)
    matriz.pixel(pos + 2, 5, 1)
    matriz.pixel(pos + 3, 5, 1)
    matriz.pixel(pos + 4, 5, 1)
    matriz.pixel(pos + 5, 5, 1)
    matriz.pixel(pos + 2, 6, 1)
    matriz.pixel(pos + 3, 6, 1)
    matriz.pixel(pos + 4, 6, 1)
    matriz.pixel(pos + 4, 3, 1)

def figuras():
    if fig_estado[0]:
        matriz.pixel(12, 2, 1)
        matriz.pixel(11, 3, 1)
        matriz.pixel(13, 3, 1)
        matriz.pixel(10, 4, 1)
        matriz.pixel(11, 4, 1)
        matriz.pixel(10, 5, 1) 
        matriz.pixel(11, 5, 1)
        matriz.pixel(13, 4, 1)
        matriz.pixel(13, 5, 1) 
        matriz.pixel(14, 4, 1)
        matriz.pixel(14, 5, 1)
    if fig_estado[1]:
        matriz.pixel(18, 2, 1)
        matriz.pixel(17, 3, 1)
        matriz.pixel(18, 3, 1)
        matriz.pixel(19, 3, 1)
        matriz.pixel(18, 4, 1)
        matriz.pixel(17, 4, 1)
        matriz.pixel(19, 4, 1)
        matriz.pixel(18, 5, 1)
    if fig_estado[2]:
        matriz.pixel(25, 2, 1)
        matriz.pixel(24, 3, 1)
        matriz.pixel(25, 3, 1)
        matriz.pixel(26, 3, 1)
        matriz.pixel(24, 4, 1)
        matriz.pixel(25, 4, 1)
        matriz.pixel(26, 4, 1)
        matriz.pixel(24, 5, 1)
        matriz.pixel(25, 5, 1)
        matriz.pixel(26, 5, 1)

def marcador_update():
    marcador.fill(0)
    marcador.text("PAC-MAN", 35, 5)
    marcador.text("Figuras:", 5, 20)
    marcador.text(str(fig_comidas), 80, 20)
    marcador.text("Puntos:", 5, 40)
    marcador.text(str(puntos), 80, 40)
    marcador.show()

def win_msg():
    matriz.fill(0)

    matriz.pixel(10, 1, 1)
    matriz.pixel(11, 1, 1)
    matriz.pixel(12, 1, 1)
    matriz.pixel(10, 2, 1)
    matriz.pixel(10, 3, 1)
    matriz.pixel(11, 3, 1)
    matriz.pixel(12, 3, 1)
    matriz.pixel(10, 4, 1)
    matriz.pixel(10, 5, 1)

    matriz.pixel(14, 1, 1)
    matriz.pixel(14, 2, 1)
    matriz.pixel(14, 3, 1)
    matriz.pixel(14, 4, 1)
    matriz.pixel(14, 5, 1)

    matriz.pixel(16, 1, 1)
    matriz.pixel(16, 2, 1)
    matriz.pixel(16, 3, 1)
    matriz.pixel(16, 4, 1)
    matriz.pixel(16, 5, 1)
    matriz.pixel(17, 2, 1)
    matriz.pixel(17, 3, 1)
    matriz.pixel(18, 4, 1)
    matriz.pixel(18, 5, 1)
    matriz.pixel(18, 2, 1)
    matriz.pixel(18, 3, 1)
    matriz.pixel(18, 1, 1)

    matriz.show()


marcador_update()

while True:
    matriz.fill(0)

    pacman(pos_pacman)
    figuras()

    for i, posicion in enumerate(fig_pos):
        if fig_estado[i] and pos_pacman + 3 >= posicion:
            fig_estado[i] = False
            fig_comidas += 1
            puntos +=5
            marcador_update()

    pos_pacman += 1
    if pos_pacman > 28:
        pos_pacman = 0

    if fig_comidas == 3:
        win_msg()
        marcador.fill(0)
        marcador.text("FIN!", 30, 20)
        marcador.text("GRUPO 12", 30, 30)
        marcador.show()
        break

    matriz.show()
    sleep(0.3)