Visión General
El juego implementa un sistema de IA híbrido que combina lógica basada en reglas con aprendizaje por refuerzo (Q-Learning) para crear comportamientos de enemigos inteligentes que se adaptan a los patrones del jugador.
Algoritmo Q-Learning
¿Qué es Q-Learning?
Q-Learning es un algoritmo de aprendizaje por refuerzo libre de modelo que aprende la calidad de las acciones, indicando a un agente qué acción tomar bajo qué circunstancias.
Detalles de Implementación
Espacio de Estados
El agente de IA observa un espacio de estados de 6 dimensiones:
state = [ enemy_x / window_width, # Posición X normalizada del enemigo (0-1) enemy_y / window_height, # Posición Y normalizada del enemigo (0-1) player_x / window_width, # Posición X normalizada del jugador (0-1) player_y / window_height, # Posición Y normalizada del jugador (0-1) (direction + 1) / 2, # Dirección normalizada (-1,1) → (0,1) 1 if on_ground else 0 # Contacto con el suelo (booleano) ]
Espacio de Acciones
El agente puede elegir entre 4 acciones posibles:
actions = { 0: "Mover Izquierda", # Mover enemigo a la izquierda 1: "Mover Derecha", # Mover enemigo a la derecha 2: "Saltar", # Saltar a plataforma superior 3: "Caer/Esperar" # Caer a plataforma inferior o esperar }
Función de Recompensa
El sistema de recompensas incentiva a la IA a acercarse al jugador:
def calculate_reward(self, player_rect): if player_rect is None: return -0.1 # Recompensa basada en distancia distance = sqrt((enemy_x - player_x)² + (enemy_y - player_y)²) max_distance = sqrt(window_width² + window_height²) proximity_reward = (max_distance - distance) / max_distance # Bonus por estar en la misma plataforma same_platform_bonus = 0.3 if abs(enemy_y - player_y) < 30 else 0 # Penalización por estar atascado stuck_penalty = -0.2 if stuck_timer > 60 else 0 return proximity_reward + same_platform_bonus + stuck_penalty
Arquitectura de IA Híbrida
Sistema de Decisión Primario (Basado en Reglas)
La IA utiliza lógica basada en reglas como sistema principal de toma de decisiones:
def decide_primary_action(self, dx, dy, current_platform, player_platform): # Forzar caída si está en el borde de la plataforma if at_platform_edge(): return DROP_ACTION # Saltar si el jugador está arriba if dy < -40 and abs(dx) < 100: return JUMP_ACTION # Moverse horizontalmente hacia el jugador if abs(dx) > 10: return RIGHT_ACTION if dx > 0 else LEFT_ACTION return RIGHT_ACTION # Comportamiento por defecto
Sistema de Validación Q-Learning
Q-Learning actúa como una capa de validación y mejora:
def should_override_action(self, primary_action, q_action, dx, dy): # Solo anular en situaciones específicas if primary_action == q_action: return False # Permitir anulación cuando está muy cerca del jugador if abs(dx) < 50 and abs(dy) < 50: return True return False
Tipos de Comportamiento de Enemigos
Enemigos Barril
Características:
- Velocidad: 1.8 píxeles/frame (70% del original)
- Comportamiento: Rodamiento y navegación de plataformas
- IA: Híbrida basada en reglas + Q-Learning
Estados de Comportamiento:
- Rodamiento: Movimiento horizontal normal
- Detección de Bordes: Identifica límites de plataforma
- Navegación de Plataformas: Salta entre plataformas
- Persecución del Jugador: Persigue activamente al jugador
Enemigos Monstruo
Características:
- Velocidad: 1.1 píxeles/frame (70% del original)
- Comportamiento: Sistema de tres estados
- IA: Basada en máquina de estados
Estados de Comportamiento:
1. Estado de Caída # Cae del cielo por 5-8 segundos duration = random.randint(300, 480) # frames velocity_x = 0 # Sin movimiento horizontal 2. Estado de Espera # Se queda quieto por 1-2 segundos duration = random.randint(60, 120) # frames velocity_x = 0 # Indicador visual: círculo amarillo 3. Estado de Caza # Persigue activamente al jugador if abs(dx) > 10: direction = 1 if dx > 0 else -1 velocity_x = speed * direction # Saltar si el jugador está arriba if dy < -40 and abs(dx) < 60: velocity_y = -10
Características Avanzadas de IA
Sistema de Pausa Adaptativo
Los enemigos implementan un sistema de pausa dinámico:
# Pausa inicial: 1 segundo cada 5 segundos pause_duration = 60 # frames (1 segundo) pause_cycle = 300 # frames (5 segundos) pause_reduction = 5 # frames a reducir cada vez # Cada pausa se vuelve más corta new_duration = max(10, pause_duration - pause_reduction)
Inteligencia de Navegación de Plataformas
La IA puede navegar inteligentemente entre plataformas:
def should_actively_drop(self, current_platform, player_platform): # Caer si el jugador está en plataforma inferior if player_platform.top > current_platform.top: return True # Caer si está en el borde de la plataforma if at_platform_edge(): return True return False
Optimización de Rendimiento
Normalización del Espacio de Estados
Todos los valores de estado se normalizan al rango [0,1] para un mejor aprendizaje:
normalized_x = x_position / window_width normalized_y = y_position / window_height
Exploración Epsilon-Greedy
Equilibra exploración vs explotación:
if random.random() < epsilon: action = random.choice(available_actions) # Explorar else: action = argmax(Q_values) # Explotar
Parámetros de Ajuste
Tasa de Aprendizaje (α = 0.1)
- Valores más altos: Aprendizaje más rápido, menos estable
- Valores más bajos: Aprendizaje más lento, más estable
- Actual: Equilibrado para gameplay en tiempo real
Factor de Descuento (γ = 0.95)
- Valores más altos: Más enfocado en el futuro
- Valores más bajos: Más enfocado en recompensas inmediatas
- Actual: Énfasis en estrategia a largo plazo
Tasa de Exploración (ε = 0.2)
- Valores más altos: Más exploración aleatoria
- Valores más bajos: Más explotación del comportamiento aprendido
- Actual: 20% de exploración mantiene la adaptabilidad
Conclusión
Este sistema de IA crea enemigos desafiantes y adaptativos que proporcionan una experiencia de juego atractiva mientras mantienen la sensación clásica de Donkey Kong. La combinación de lógica basada en reglas con Q-Learning resulta en comportamientos que son tanto predecibles como sorprendentes.