Matiz: tablero a ratio de pantalla + progresión hasta 13×13
El tablero deja de forzarse cuadrado y llena el área disponible con el ratio de la pantalla, así las baldosas heredan la forma del display en todos los niveles. La progresión de formas escala ahora hasta 13×13, repartida proporcionalmente por los 48 niveles base. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
2 files · +21 −14
diff --git a/matiz/src/main/java/com/rizoma/matiz/game/Level.kt b/matiz/src/main/java/com/rizoma/matiz/game/Level.kt
index a4793c2..cd52b57 100644
--- a/matiz/src/main/java/com/rizoma/matiz/game/Level.kt
+++ b/matiz/src/main/java/com/rizoma/matiz/game/Level.kt
@@ -45,10 +45,13 @@ class Puzzle(
/** Generación determinista de niveles a partir del número de nivel (= seed). */
object Levels {
- // Forma de la rejilla por nivel (cols × rows), creciendo poco a poco.
+ // Forma de la rejilla (cols × rows), de la más fácil a la maestra. La
+ // progresión termina en 13×13: el tablero llena la pantalla, así que las
+ // baldosas no son cuadradas sino que heredan el ratio del display.
private val SHAPES = listOf(
- 3 to 3, 3 to 4, 4 to 4, 4 to 5, 4 to 6,
- 5 to 6, 5 to 7, 5 to 8, 6 to 7, 6 to 8,
+ 3 to 3, 3 to 4, 4 to 4, 4 to 5, 5 to 5,
+ 5 to 6, 6 to 6, 6 to 7, 7 to 8, 8 to 9,
+ 9 to 10, 10 to 11, 11 to 12, 12 to 13, 13 to 13,
)
private const val BASE = 0x5249_5A4F_4D41_0001L // "RIZOMA"
@@ -73,8 +76,17 @@ object Levels {
/** Seed estable para un nivel: mismo id → mismo puzzle en todas partes. */
fun seedFor(level: Int): Long = BASE xor (level.toLong() * -0x61c8864680b583ebL)
- private fun shapeFor(level: Int): Pair<Int, Int> =
- SHAPES[(level - 1).coerceIn(0, SHAPES.lastIndex)]
+ // Mayor nivel base: el tope de la última dificultad. La forma escala
+ // proporcionalmente de 1 (3×3) a este nivel (13×13), repartiendo las
+ // [SHAPES] por todo el rango en vez de agotarlas en los primeros niveles.
+ private val MAX_BASE_LEVEL = TIER_RANGES.last().last
+
+ private fun shapeFor(level: Int): Pair<Int, Int> {
+ val span = (MAX_BASE_LEVEL - 1).coerceAtLeast(1)
+ val frac = (level - 1).coerceIn(0, span).toDouble() / span
+ val idx = Math.round(frac * SHAPES.lastIndex).toInt().coerceIn(0, SHAPES.lastIndex)
+ return SHAPES[idx]
+ }
/** Proporción de celdas fijas (además de las esquinas); decrece con el nivel. */
private fun ratioFor(level: Int): Double = when {
diff --git a/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt b/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt
index 5621dd8..c876ae8 100644
--- a/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt
+++ b/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt
@@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
@@ -53,8 +52,6 @@ fun MatizApp(vm: MatizViewModel = viewModel()) {
private fun JuegoScreen(vm: MatizViewModel) {
BackHandler(enabled = true) { vm.volverAlMapa() }
- val ratio = vm.puzzle.cols.toFloat() / vm.puzzle.rows
-
Box(
Modifier
.fillMaxSize()
@@ -67,12 +64,10 @@ private fun JuegoScreen(vm: MatizViewModel) {
Modifier.fillMaxWidth().weight(1f),
contentAlignment = Alignment.Center,
) {
- Board(
- vm,
- Modifier
- .fillMaxSize()
- .aspectRatio(ratio, matchHeightConstraintsFirst = ratio < 1f),
- )
+ // El tablero llena el área disponible (con el ratio de la
+ // pantalla) en vez de encajarse en un cuadrado: así las baldosas
+ // mantienen la forma de la pantalla y un 13×13 cabe entero.
+ Board(vm, Modifier.fillMaxSize())
}
Controls(vm)
}