from machine import Pin, ADC, SPI
from utime import sleep_ms, ticks_ms
import max7219
import tm1637
import random
"""
O joystick tem 3 inputs de dados:
analógicos: VERT e HORZ;
digital: SEL;
VERT: Vertical, 65535 é cima, 32759 é meio e 0 é baixo.
HORZ: Horizontal, 65535 é esquerda, 32759 é meio e 0 é direita
SEL: Select, 0 é selecionado e 1 é não-selecionado
"""
horz = ADC(26)
vert = ADC(27)
spi = SPI(0, baudrate=10000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
cs = Pin(17, Pin.OUT)
matrix = max7219.Matrix8x8(spi, cs, 1)
matrix.pixel(4, 4, 1)
matrix.show()
display = tm1637.TM1637(clk=machine.Pin(21), dio=machine.Pin(22))
display.number(1)
pontos = 1
x = 4
y = 4
ultima_cord = [4, 4]
cords_cauda = [[4, 4]]
ultimo_horz, ultimo_vert = 0, 0
def analisar_adc(valor, ultimo_valor):
if valor == 32759:
return 0
if valor > 32759:
return 1
return -1
def nova_coordenada(valor, cord):
nova_cord = cord + valor
if nova_cord >= 0 and nova_cord <= 7:
return nova_cord
return cord
def verificar_colisao(cord, cords_cauda, ultima_cord):
if cord in cords_cauda:
return ultima_cord
return cord
def coordenada_maça(cords_cauda, pontos):
random.seed(ticks_ms())
x = random.randint(0, 7)
y = random.randint(0, 7)
while [x, y] in cords_cauda:
x = random.randint(0, 7)
y = random.randint(0, 7)
return [x, y]
def sem_saida(x, y, cords_cauda):
if x + 1 <= 7 and [x+1, y] not in cords_cauda:
return False
if x - 1 >= 0 and [x-1, y] not in cords_cauda:
return False
if y + 1 <= 7 and [x, y+1] not in cords_cauda:
return False
if y - 1 >= 0 and [x, y-1] not in cords_cauda:
return False
return True
def reiniciar():
global cord, ultima_cord, cords_cauda, maça, pontos, x, y
sleep_ms(2000)
print("\n🔁 Reiniciando... 🔄\n")
for i in range(4):
matrix.fill(1)
display.number(pontos)
matrix.show()
sleep_ms(500)
matrix.fill(0)
display.show(" ")
matrix.show()
sleep_ms(500)
matrix.pixel(4, 4, 1)
matrix.pixel(4, 1, 1)
matrix.show()
pontos = 0
display.number(pontos)
maça = [1, 4]
cord = [4, 4]
x, y = cord
ultima_cord = [4, 4]
cords_cauda = [[4, 4]]
maça = [1, 4]
while True:
sleep_ms(80)
horz_value = analisar_adc(horz.read_u16(), ultimo_horz)
vert_value = analisar_adc(vert.read_u16(), ultimo_vert)
ultimo_horz, ultimo_vert = horz_value, vert_value
x = nova_coordenada(horz_value, x)
y = nova_coordenada(vert_value, y)
cord = verificar_colisao([x, y], cords_cauda, ultima_cord)
x, y = cord
if cord != ultima_cord:
cords_cauda.append(cord)
if len(cords_cauda) > pontos + 1:
cords_cauda.pop(0)
if cord == maça:
maça = coordenada_maça(cords_cauda, pontos)
pontos += 1
display.number(pontos)
matrix.fill(0)
matrix.pixel(maça[1], maça[0], 1)
for c in cords_cauda:
matrix.pixel(c[1], c[0], 1)
matrix.show()
ultima_cord = cord
if pontos == 63:
print("\033[1;33m🎊 Parabéns!! Você ganhou! 63 pontos 🎉\033[m")
reiniciar()
if sem_saida(x, y, cords_cauda):
print(f"\033[1;31m⛔ Sem saída! Você perdeu com {pontos} pontos 🛑\033[m")
reiniciar()