Murder Plot
Un juego de deducción para Android hecho 100 % en Jetpack Compose, sin motor de juegos. Lo diseñé y lo programé por mi cuenta, del generador de casos a los sonidos, y ya está publicado en Google Play.
- Rol
- Todo: diseño, código, arte, sonido y publicación
- Tecnología
- Kotlin y Jetpack Compose, sin motor de juegos
- Estado
- En Google Play desde el 30 de octubre de 2026
- Idiomas
- Español e inglés
Qué es
Murder Plot es un sudoku de asesinatos: ubicas a cada sospechoso en el plano siguiendo las pistas, nadie comparte fila ni columna, y la regla del caso delata al culpable. No usa motor de juegos: el tablero, las escenas, las animaciones y el sonido salen de las mismas herramientas que uso en cualquier app Android.
Más de 35.000 líneas de Kotlin entre la app y su módulo de puzzles, y 141 pruebas automatizadas.
Cómo se juega

El caso
La víctima, los sospechosos y la regla que va a delatar al culpable.

El plano
Tocas para ubicar a cada sospechoso y las pistas se marcan solas cuando se cumplen.

La revelación
Monedas y hasta tres estrellas: resolverlo, sin ayuda y dentro del tiempo par.
Sin motor de juegos
Lo que normalmente resuelve un motor, aquí lo resuelven Compose y Kotlin.
Dibujo
Las escenas de los expedientes son Canvas puro: unas 8.000 líneas de dibujo inmediato. La parte fija se graba una sola vez, la oscuridad se recorta con modos de fusión y no hay sprites ni shaders, así que funciona desde Android 8.
Física
Las cortinas y las toallas son telas de Verlet, las lámparas se mecen como péndulos y las llamas de las velas se mueven con ruido. Con el dedo puedes empujar las cortinas o dejar ondas en el agua.
Tiempo y animación
Un reloj de cuadros con withFrameNanos mueve las escenas. El tiempo se lee solo al dibujar, así que nada se recompone en cada cuadro. El resto son las animaciones de Compose: transiciones, resortes y estados animados.
Estado del juego
Un ViewModel guarda el estado inmutable de la partida en un StateFlow. Cada jugada produce un estado nuevo, se puede deshacer hasta 50 pasos y la partida se guarda sola.
Sonido
27 efectos sintetizados con un script propio en Python, sin muestras de terceros. Suenan con SoundPool y cambian un poco de tono para no repetirse.
Guardado
DataStore en el teléfono y Juegos guardados de Play Juegos en la nube. Una copia con menos casos resueltos nunca reemplaza a otra más avanzada.
Cinco escenarios dibujados con código
Cada expediente es un camino ilustrado que se revela a medida que resuelves sus casos.
Casos con una sola solución
Los casos salen de un módulo en Kotlin puro, sin Android. Genera los 130 casos de los expedientes y sus temporadas, y los 365 diarios, y también corre en el teléfono para crear casos libres sin fin.
Por cada caso se generan seis candidatos y se elige el que mejor se ajusta a la dificultad buscada.
- HabitacionesCrecen al azar hasta llenar el plano.
- SospechososUno por fila y por columna, y la regla del caso apunta a uno solo.
- PistasHechos verdaderos elegidos al azar mientras ayuden a deducir, para que se combinen entre sí.
- LimpiezaSe quitan las pistas que sobran.
- VerificaciónUn solver exige una única solución, y que se llegue a ella solo deduciendo.
Decisiones
Anuncios que respetan la partida
Un anuncio nunca interrumpe un caso. Los recompensados los pide el jugador, para salvar la racha, ganar una lupa extra o duplicar monedas. El único que aparece solo sale al volver de una revelación, como mucho uno cada dos casos, nunca en los primeros días y nunca con el pase.
Se aprende jugando
La primera partida es un caso de 4×4 escrito a mano que se juega en el tablero real, paso a paso, en vez de una pantalla de instrucciones. Se puede repetir desde Ajustes.
Nunca pistas ilimitadas
Un botón que resuelve el caso vacía el juego. La lupa señala a quien está mal ubicado o te dice a quién puedes deducir ahora y con qué pista, y tiene un límite por caso.
Se paga por un mundo nuevo
El pase quita los anuncios y desbloquea el Teatro Imperial, un caso semanal de 7×7 y más casos difíciles. No da ventaja: en la tabla semanal no suma puntos extra.
El mismo caso para todos
El día del juego cambia a medianoche UTC-7, como las tablas diarias de Play Juegos, para que todos jueguen el mismo caso del día a la vez. Hay 365 casos diarios: fáciles el lunes y de 7×7 el domingo.
El español es la llave
Cada texto se escribe en español y esa frase es la llave de su traducción. Las pistas se guardan como hechos y no como frases, y se reescriben en inglés al cargar. Una prueba falla si falta o sobra una traducción.
Play Juegos es opcional
El juego no pide un perfil al abrirlo y sin sesión todo funciona igual. Si te conectas, el progreso se respalda en la nube y una copia nunca reemplaza a otra con más casos resueltos.
Con qué está hecha
- Juego
- Kotlin, Jetpack Compose, Canvas, Navigation Compose, ViewModel y StateFlow
- Datos
- DataStore, kotlinx.serialization, WorkManager para el recordatorio diario y Firebase Analytics con consentimiento
- Google Play
- AdMob con UMP, Play Billing para el pase y las gemas, y Play Juegos: logros, tabla semanal y juegos guardados
- Herramientas
- Un módulo de puzzles en Kotlin puro, 83 pruebas, sonidos sintetizados en Python y capturas de tienda automatizadas con adb
Contacto
Para conversar sobre un proyecto, una oportunidad o algo que viste aquí.




