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()
def 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.

def iniciar_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.