ui.menu

menu_principal.py

Muestra el menú principal interactivo del juego y gestiona la navegación del usuario.

 1"""
 2menu_principal.py
 3
 4Muestra el menú principal interactivo del juego y gestiona la navegación del usuario.
 5"""
 6
 7import sys
 8import time
 9import msvcrt
10
11from colorama import init, Fore, Style
12init(autoreset=True)
13
14import core.config as estado
15from core.game_engine import iniciar_juego
16from ui.screens import mostrar_instrucciones
17from utils.utils import limpiar_pantalla
18
19
20def menu_principal():
21    """
22    Muestra el menú principal interactivo y gestiona la navegación del usuario.
23
24    Despliega un menú con tres opciones: "INICIAR NOCHE", "INSTRUCCIONES" y "SALIR".
25    Permite navegar entre ellas con las flechas arriba/abajo y seleccionar con Enter.
26
27    Comportamiento al seleccionar una opción:
28        - "INICIAR NOCHE": Llama a `iniciar_juego()` y sale del menú.
29        - "INSTRUCCIONES": Llama a `mostrar_instrucciones()`.
30        - "SALIR": Muestra mensaje de despedida, limpia la pantalla y termina la ejecución.
31
32    Notas:
33        - Usa `msvcrt.getch()` para capturar la entrada del teclado en Windows.
34        - Limpia la pantalla antes de mostrar el menú cada vez.
35        - Resalta la opción seleccionada con colores y estilos.
36        - Se ejecuta en un bucle hasta que el usuario inicia el juego o sale.
37
38    Variables locales:
39        ancho_pantalla (int): Ancho para centrar el texto del menú.
40        opciones (list): Lista de opciones del menú.
41        seleccion (int): Índice de la opción actualmente seleccionada.
42    """
43    estado.motivo_game_over = None
44
45    ancho_pantalla = 60
46    opciones = ["INICIAR NOCHE", "INSTRUCCIONES", "SALIR"]
47    seleccion = 0
48
49    while True:
50        limpiar_pantalla()
51
52        # Título
53        print(Style.BRIGHT + Fore.WHITE + """
54                    
55              ███████╗ ███╗   ██╗  █████╗  ███████╗
56              ██╔════╝ ████╗  ██║ ██╔══██╗ ██╔════╝
57              █████╗   ██╔██╗ ██║ ███████║ █████╗  
58              ██╔══╝   ██║╚██╗██║ ██╔══██║ ██╔══╝  
59              ██║      ██║ ╚████║ ██║  ██║ ██║     
60              ╚═╝      ╚═╝  ╚═══╝ ╚═╝  ╚═╝ ╚═╝                               
61                           SIGNAL LOST      
62        """)
63
64        # Opciones
65        for i, opcion in enumerate(opciones):
66            flecha = ">> " if i == seleccion else "   "
67            color = Fore.GREEN if i == 0 else Fore.YELLOW if i == 1 else Fore.RED
68            linea = flecha + opcion
69            print("\n" + color + Style.BRIGHT + linea.center(ancho_pantalla))
70
71        # Leer tecla
72        tecla = msvcrt.getch()
73
74        if tecla == b'\xe0':  # Tecla especial (flechas)
75            flecha = msvcrt.getch()
76            if flecha == b'H':  # Flecha arriba
77                seleccion = (seleccion - 1) % len(opciones)
78            elif flecha == b'P':  # Flecha abajo
79                seleccion = (seleccion + 1) % len(opciones)
80
81        elif tecla == b'\r':  # Enter
82            if seleccion == 0:
83                iniciar_juego()
84                break
85            elif seleccion == 1:
86                mostrar_instrucciones()
87            elif seleccion == 2:
88                print(Fore.GREEN + Style.BRIGHT +
89                      "\n¡Hasta la próxima, vigilante nocturno!")
90                time.sleep(1.5)
91                limpiar_pantalla()
92                sys.exit()