Volver
Al diseñar una solución de gamificación para un campus virtual en producción, el objetivo inicial era claro y medible: permitir que el alumno, al finalizar un cuestionario, conociera su posición relativa frente al resto, su promedio histórico y pudiera acumular puntos por constancia (como ingresar más de tres días consecutivos o superar determinados puntajes).
Durante esa etapa de definición técnica surgió la pregunta que amplió radicalmente el alcance del proyecto: “¿Es posible incorporar además un sistema de batallas donde un estudiante pueda retar directamente a otro?”.
Se asumió el reto. La premisa técnica fue estricta desde el inicio: el módulo de duelos debía operar de forma completamente independiente de la gamificación general de Moodle, contando con sus propias reglas de negocio, su propio sistema de puntuación y un ranking autónomo. Además, el servicio debía funcionar como una solución llave en mano: la plataforma no debía asumir la carga operativa de redactar ni configurar preguntas especiales; la dinámica debía entregarse completamente resuelta e integrada al flujo natural de estudio.
El mayor riesgo en estos desarrollos es la fricción. Forzar al estudiante a crearse otra cuenta, abrir pestañas adicionales o interactuar con servicios externos destruye el hábito de uso. La experiencia debía vivir dentro de Moodle mediante una interfaz en React moderna, rápida y encapsulada en un modal accesible desde la barra superior, la pantalla de inicio o al concluir una lección.
Montar dinámicas interactivas sobre un LMS con dos décadas de historia técnica exige límites arquitectónicos estrictos para no comprometer la estabilidad del servidor ni permitir inconsistencias en los datos.
db/services.php / REST APIEXTERNAL CONTROLLERS · Adaptadores
• Tipado estricto: PARAM_INT, PARAM_ALPHANUM
• Validación de permisos: require_capability
• Mapeo de excepciones a \moodle_exception
CORE DOMAIN · Dominio Puro PHP
• classes/local/service/ · Reglas de batallas
• Lógica 100% agnóstica al framework y a la BD
PERSISTENCE ADAPTER · Infraestructura
• challenge_repository.php
• Paginación nativa SQL mediante LIMIT / OFFSET

Para asegurar que el módulo fuera independiente y mantenible, construimos el plugin local_tipddy_duel bajo Arquitectura Hexagonal en PHP:
classes/local/service/): Toda la lógica (crear un reto, responder, calcular resultados y verificar expiración) se implementó en clases desacopladas de las funciones globales de Moodle y de la base de datos.classes/external/): Controladores que reciben las peticiones de los WebServices de Moodle, aplican tipado estricto (PARAM_INT, PARAM_ALPHANUM), validan permisos y traducen las excepciones del dominio a \moodle_exception estructuradas.wstoken). Un contexto en React (AuthContext) y el hook useValidToken gestionan la validez de la sesión en segundo plano sin almacenar contraseñas en el navegador.
Donde realmente se pone a prueba la arquitectura de un juego es en los imprevistos de red y comportamiento de los usuarios:
challenge_repository.php). Si un jugador pierde conexión en la pregunta 3 de 5, las dos anteriores quedan registradas. El duelo no se corrompe y puede reanudarse o cerrarse limpiamente sin perder datos.
useBattleStateMachine.js) delega cada validación al backend. Si la red falla, la UI muestra un estado de error con reintento, sin fabricar jamás resultados ficticios.
En las primeras pruebas, iniciar una batalla exigía encadenar múltiples llamadas REST a Moodle: verificar usuario, consultar el curso, traer preguntas y crear el intento. Con decenas de alumnos simultáneos, esto multiplicaba las consultas SQL y generaba lentitud perceptible.
Lo resolvimos creando un endpoint compuesto en local_tipddy_duel:
LIMIT y OFFSET), evitando saturar la memoria RAM del servidor.
| Criterio | App Externa SaaS (Kahoot, etc.) | Plugin Genérico de Moodle | Solución a Medida (tipddy_duel) |
|---|---|---|---|
| Experiencia de Usuario | Fragmentada; exige salir del campus y gestionar otro login. | Rígida; interfaces estáticas de PHP que no ofrecen duelos 1v1. | Nativa y fluida: Modal React integrado al campus sin fricción. |
| Gobierno y Datos | Datos dispersos en servidores externos sin control institucional. | Conserva los datos, pero con mecánicas limitadas. | Control total: Todo vive en la base de datos de Moodle. |
| Operación y Contenido | Requiere carga manual duplicada en plataformas externas. | Configuración técnica compleja para los administradores. | Llave en mano: Dinámicas provistas con contenidos resueltos. |
| Costo Económico | Suscripción mensual por usuario que escala indefinidamente. | Pago de licencia con soporte limitado a plantillas genéricas. | Activo propio: Cero costo recurrente por alumno matriculado. |

El desarrollo de tipddy_duel demostró que no hace falta descartar un LMS robusto como Moodle para ofrecer una experiencia contemporánea y atractiva. La clave estuvo en abordar el desafío técnico sin atajos: delimitando el dominio con Arquitectura Hexagonal, diseñando para los casos borde reales y desacoplando la interfaz con React para que el aprendizaje vuelva a ser una experiencia activa y compartida.

Editor/a | Matías Alfaro
Desarrollador Full-Stack en constante formación apasionado por el código, el soporte de hardware y la gestión de infraestructura web. Disfruto armando y desarmando.
¿Tu Moodle se ve igual a todos? Modernízalo con una interfaz única y funcional
Carga cognitiva en sitios web: cómo diseñar experiencias más intuitivas
Aulas Virtuales Moodle en Chile: Interfaz Personalizada para Educación y Capacitación
Agenda una reunión de 20 minutos para explorar soluciones a medida. ¡Hazlo ahora!