core.game_engine
game_engine.py
Define la lógica principal del juego, gestionando el ciclo de juego, hilos de animatrónicos, control de energía, avance de hora y pantalla interactiva.
1""" 2game_engine.py 3 4Define la lógica principal del juego, gestionando el ciclo de juego, 5hilos de animatrónicos, control de energía, avance de hora y pantalla 6interactiva. 7""" 8 9from colorama import init 10 11# Inicialización de Colorama 12init(autoreset=True) 13 14from threading import Thread 15 16import core.config as estado 17from core.timers import avanzar_hora 18from core.energy import verificar_energia 19from core.animatronics import animatronics 20from ui.screens import ( 21 mapa_interactivo, 22 pantalla_game_over, 23 seleccionar_dificultad, 24 intro, 25) 26from utils.utils import limpiar_pantalla 27 28 29def juego(): 30 """ 31 Inicia la lógica principal del juego y lanza los hilos necesarios. 32 33 Crea y arranca hilos daemon para: 34 - Mover cada animatrónico según su comportamiento. 35 - Verificar continuamente el nivel de energía. 36 - Avanzar la hora del juego en intervalos definidos. 37 - Reproducir la introducción narrativa. 38 39 Luego entra en un bucle que limpia la pantalla y muestra el mapa 40 interactivo mientras el juego sigue en curso, hasta que se activa 41 `stop_event`, indicando que la partida terminó. 42 43 Variables globales: 44 Ninguna. 45 46 Notas: 47 - Los hilos daemon permiten que se terminen automáticamente al 48 cerrar el programa. 49 - El bucle principal se detiene de forma controlada cuando se 50 activa `stop_event`, liberando los hilos en espera. 51 - `stop_event` centraliza la gestión del ciclo de vida de todos 52 los hilos y bucles del juego. 53 """ 54 Thread(target=verificar_energia, daemon=True).start() 55 Thread(target=avanzar_hora, daemon=True).start() 56 Thread(target=intro, daemon=True).start() 57 58 while not estado.stop_event.is_set(): 59 limpiar_pantalla() 60 mapa_interactivo() 61 if estado.stop_event.is_set(): 62 break 63 64 if estado.motivo_game_over: 65 pantalla_game_over(estado.motivo_game_over) 66 67 68def iniciar_juego(): 69 """ 70 Configura e inicia una nueva partida del juego. 71 72 Solicita al jugador seleccionar la dificultad y luego inicializa 73 las variables de estado del juego (`juego_activo`, `hora_actual`, 74 `energia_actual`, `energia_agotada`) y reinicia la posición, 75 velocidad de movimiento y estado de aceleración de cada animatrónico. 76 77 También limpia y reinicia `stop_event` para permitir que los hilos 78 de la nueva partida se ejecuten correctamente sin interferencias 79 de una partida anterior. 80 81 Finalmente, muestra la introducción del juego y llama a `juego()` 82 para comenzar la partida principal. 83 84 Variables globales: 85 juego_activo (bool): Indica si el juego está en curso. 86 hora_actual (int): Hora inicial del juego. 87 energia_actual (int): Nivel inicial de energía del jugador. 88 energia_agotada (bool): Bandera que indica si la energía se ha 89 agotado. 90 91 Notas: 92 - `stop_event.clear()` reinicia el control multihilo para evitar 93 conflictos con hilos anteriores. 94 - `seleccionar_dificultad()` define los parámetros para la partida 95 actual. 96 - La animación de inicio consiste en puntos impresos con pausas. 97 - `juego()` lanza los hilos principales y gestiona el ciclo de juego. 98 """ 99 seleccionar_dificultad() 100 estado.stop_event.clear() 101 102 estado.juego_activo = True 103 estado.hora_actual = 0 104 estado.energia_actual = 100 105 estado.energia_agotada = False 106 107 for nombre, anim in animatronics.items(): 108 anim.posicion = anim.spawn 109 anim.acelerado = False 110 111 if estado.config["dificultad"] == "NORMAL": 112 anim.ia_level = max(1, anim.ia_level - 4) 113 elif estado.config["dificultad"] == "DIFICIL": 114 anim.ia_level = anim.ia_level 115 elif estado.config["dificultad"] == "PESADILLA": 116 anim.ia_level = max(20, anim.ia_level + 5) 117 118 limpiar_pantalla() 119 juego()
30def juego(): 31 """ 32 Inicia la lógica principal del juego y lanza los hilos necesarios. 33 34 Crea y arranca hilos daemon para: 35 - Mover cada animatrónico según su comportamiento. 36 - Verificar continuamente el nivel de energía. 37 - Avanzar la hora del juego en intervalos definidos. 38 - Reproducir la introducción narrativa. 39 40 Luego entra en un bucle que limpia la pantalla y muestra el mapa 41 interactivo mientras el juego sigue en curso, hasta que se activa 42 `stop_event`, indicando que la partida terminó. 43 44 Variables globales: 45 Ninguna. 46 47 Notas: 48 - Los hilos daemon permiten que se terminen automáticamente al 49 cerrar el programa. 50 - El bucle principal se detiene de forma controlada cuando se 51 activa `stop_event`, liberando los hilos en espera. 52 - `stop_event` centraliza la gestión del ciclo de vida de todos 53 los hilos y bucles del juego. 54 """ 55 Thread(target=verificar_energia, daemon=True).start() 56 Thread(target=avanzar_hora, daemon=True).start() 57 Thread(target=intro, daemon=True).start() 58 59 while not estado.stop_event.is_set(): 60 limpiar_pantalla() 61 mapa_interactivo() 62 if estado.stop_event.is_set(): 63 break 64 65 if estado.motivo_game_over: 66 pantalla_game_over(estado.motivo_game_over)
Inicia la lógica principal del juego y lanza los hilos necesarios.
Crea y arranca hilos daemon para: - Mover cada animatrónico según su comportamiento. - Verificar continuamente el nivel de energía. - Avanzar la hora del juego en intervalos definidos. - Reproducir la introducción narrativa.
Luego entra en un bucle que limpia la pantalla y muestra el mapa
interactivo mientras el juego sigue en curso, hasta que se activa
stop_event
, indicando que la partida terminó.
Variables globales: Ninguna.
Notas:
- Los hilos daemon permiten que se terminen automáticamente al
cerrar el programa.
- El bucle principal se detiene de forma controlada cuando se
activa stop_event
, liberando los hilos en espera.
- stop_event
centraliza la gestión del ciclo de vida de todos
los hilos y bucles del juego.
69def iniciar_juego(): 70 """ 71 Configura e inicia una nueva partida del juego. 72 73 Solicita al jugador seleccionar la dificultad y luego inicializa 74 las variables de estado del juego (`juego_activo`, `hora_actual`, 75 `energia_actual`, `energia_agotada`) y reinicia la posición, 76 velocidad de movimiento y estado de aceleración de cada animatrónico. 77 78 También limpia y reinicia `stop_event` para permitir que los hilos 79 de la nueva partida se ejecuten correctamente sin interferencias 80 de una partida anterior. 81 82 Finalmente, muestra la introducción del juego y llama a `juego()` 83 para comenzar la partida principal. 84 85 Variables globales: 86 juego_activo (bool): Indica si el juego está en curso. 87 hora_actual (int): Hora inicial del juego. 88 energia_actual (int): Nivel inicial de energía del jugador. 89 energia_agotada (bool): Bandera que indica si la energía se ha 90 agotado. 91 92 Notas: 93 - `stop_event.clear()` reinicia el control multihilo para evitar 94 conflictos con hilos anteriores. 95 - `seleccionar_dificultad()` define los parámetros para la partida 96 actual. 97 - La animación de inicio consiste en puntos impresos con pausas. 98 - `juego()` lanza los hilos principales y gestiona el ciclo de juego. 99 """ 100 seleccionar_dificultad() 101 estado.stop_event.clear() 102 103 estado.juego_activo = True 104 estado.hora_actual = 0 105 estado.energia_actual = 100 106 estado.energia_agotada = False 107 108 for nombre, anim in animatronics.items(): 109 anim.posicion = anim.spawn 110 anim.acelerado = False 111 112 if estado.config["dificultad"] == "NORMAL": 113 anim.ia_level = max(1, anim.ia_level - 4) 114 elif estado.config["dificultad"] == "DIFICIL": 115 anim.ia_level = anim.ia_level 116 elif estado.config["dificultad"] == "PESADILLA": 117 anim.ia_level = max(20, anim.ia_level + 5) 118 119 limpiar_pantalla() 120 juego()
Configura e inicia una nueva partida del juego.
Solicita al jugador seleccionar la dificultad y luego inicializa
las variables de estado del juego (juego_activo
, hora_actual
,
energia_actual
, energia_agotada
) y reinicia la posición,
velocidad de movimiento y estado de aceleración de cada animatrónico.
También limpia y reinicia stop_event
para permitir que los hilos
de la nueva partida se ejecuten correctamente sin interferencias
de una partida anterior.
Finalmente, muestra la introducción del juego y llama a juego()
para comenzar la partida principal.
Variables globales: juego_activo (bool): Indica si el juego está en curso. hora_actual (int): Hora inicial del juego. energia_actual (int): Nivel inicial de energía del jugador. energia_agotada (bool): Bandera que indica si la energía se ha agotado.
Notas:
- stop_event.clear()
reinicia el control multihilo para evitar
conflictos con hilos anteriores.
- seleccionar_dificultad()
define los parámetros para la partida
actual.
- La animación de inicio consiste en puntos impresos con pausas.
- juego()
lanza los hilos principales y gestiona el ciclo de juego.