from machine import Pin, ADC, I2C
import ssd1306
import time
import random
from player import Player
from enemy import Enemy
from sound import Sound
# Configuración del OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(23))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Configuración del joystick y botones
joy_x = ADC(Pin(32))
joy_x.atten(ADC.ATTN_11DB)
joy_y = ADC(Pin(35))
joy_y.atten(ADC.ATTN_11DB)
boton = Pin(33, Pin.IN, Pin.PULL_UP) # Botón de disparo
boton2 = Pin(12, Pin.IN, Pin.PULL_UP) # Botón para salir
# Configuración del sonido
sound = Sound(18)
def draw_menu():
"""Dibuja el menú principal."""
oled.fill(0)
oled.text("> Jugar", 30, 10)
oled.show()
def main_menu():
"""Muestra el menú principal y espera la selección del jugador."""
draw_menu()
sound.play_intro() # Reproduce la música de inicio
while True:
if boton2.value() == 0: # Si se presiona el botón, iniciar el juego
time.sleep(0.2)
game_loop()
break
def game_loop():
"""Bucle principal del juego."""
player = Player(oled)
enemies = []
spawn_delay = 20
spawn_timer = 0
oled.fill(0)
oled.text("Jugando...", 30, 10)
oled.show()
time.sleep(1.5)
while True:
oled.fill(0)
player.render()
player.handle_bullets(enemies)
# Control del joystick
joy_x_value = joy_x.read()
joy_y_value = joy_y.read()
if joy_x_value > 2048:
player.move_left()
elif joy_x_value < 2048:
player.move_right()
if joy_y_value > 2048:
player.move_up()
elif joy_y_value < 2048:
player.move_down()
# Disparo del jugador
if boton.value() == 0:
player.shoot()
# Generación de enemigos
if spawn_timer >= spawn_delay:
new_enemy = Enemy(oled, random.randint(10, 117)) # Ajustado para que no salga de la pantalla
enemies.append(new_enemy)
spawn_timer = 0
else:
spawn_timer += 1
# Movimiento y disparo de enemigos
for enemy in enemies[:]:
enemy.move()
enemy.shoot()
enemy.handle_bullets()
enemy.render_enemy()
# Si el enemigo toca el suelo, se elimina
if enemy.Y > 64:
enemies.remove(enemy)
# 🚨 Si el jugador muere 🚨
if player.check_collision(enemies):
sound.stop_music() # Detener la música del juego
sound.play_death_melody() # Reproducir la melodía de muerte
oled.fill(0)
oled.text("Game Over", 30, 30)
oled.show()
time.sleep(2)
main_menu() # Regresar al menú principal
break
oled.show()
# Salir del juego con el botón 2
if boton2.value() == 0:
oled.fill(0)
oled.text("Saliendo...", 30, 10)
oled.show()
time.sleep(1.5)
sound.stop_music() # Detener la música
main_menu()
break
if __name__ == "__main__":
main_menu()