Batalla Naval es un juego de información imperfecta entre dos jugadores. Cada jugador esconde su flota en un tablero oculto y por turnos dispara coordenadas intentando hundir los barcos del rival. Gana quien hunde toda la flota enemiga primero.
En esta versión juegas contra una IA con tres niveles de dificultad. Tú disparas al tablero enemigo haciendo clic; la IA dispara automáticamente después de cada turno tuyo.
| Barco | Tamaño | Cantidad |
|---|---|---|
| ✈️ Portaaviones | 5 celdas | ×1 |
| ⚔️ Acorazado | 4 celdas | ×1 |
| 🛡️ Crucero | 3 celdas | ×1 |
| 🔱 Submarino | 3 celdas | ×1 |
| ⚡ Destructor | 2 celdas | ×1 |
En el tablero 8×8 se usa la misma flota excepto el Portaaviones.
La partida termina cuando uno de los dos jugadores hunde todos los barcos del rival. El juego muestra la precisión final (% de impactos sobre disparos totales) y actualiza el marcador de victorias/derrotas.
Situación en mitad de partida: acabas de impactar en C4. El tablero muestra varios disparos previos. ¿A dónde disparar ahora?
| Acción | Cómo |
|---|---|
| Rotar barco | Tecla R / botón "Rotar" |
| Seleccionar barco | Clic en el botón del barco |
| Auto-colocar flota | Botón "⚡ Auto-colocar" |
| Ver sugerencia IA | Botón "🔍 Sugerir mejor disparo" |
| Nueva partida | Botón "↺ Nueva partida" |
| Cambiar dificultad | Selector "Dificultad IA" |
Todo buen jugador alterna entre tres estados mentales según la situación del tablero:
No hay barcos tocados activos. Disparas explorando el tablero. El objetivo es maximizar la información por disparo. Usa patrones que cubran el máximo espacio posible con el mínimo número de disparos.
Has impactado un barco. Cambia la prioridad: ahora debes hundir ese barco antes de seguir explorando. Dispara en las 4 direcciones del impacto hasta determinar la orientación y luego barrido lineal.
Nivel avanzado: calculas mentalmente (o con el asistente) cuántas posiciones válidas quedan para cada barco restante. Disparas siempre a la celda de mayor densidad de cobertura.
El barco más pequeño tiene 2 celdas. Esto implica que nunca podrá estar en celdas de "mismo color" en un tablero de ajedrez sin que al menos una de ellas sea de "otro color". Disparando solo en celdas de un color:
Tu colocación también importa porque la IA adversaria puede ser más o menos inteligente. Algunas guías:
Este es el algoritmo que usa la IA en nivel medio. Entenderlo te ayuda a anticipar sus movimientos y a usarlo tú mismo:
| Estado | Condición | Acción |
|---|---|---|
| Hunt | Cola de objetivos vacía | Disparo aleatorio en patrón de ajedrez |
| Target | Hay impactos sin hundir | Dispara a las 4 celdas adyacentes al hit |
| Target+ | Dos hits en línea | Determina eje; barrido lineal hacia ambos lados |
| Reset | Barco hundido | Limpia la cola; vuelve a Hunt |
La IA en nivel difícil usa un mapa de calor probabilístico. Tú puedes aplicarlo mentalmente así:
En la práctica, el centro del tablero suele tener mayor densidad al inicio. A medida que avanza la partida, las zonas con muchas celdas libres contiguas se vuelven más valiosas.
| Estrategia | Disparos promedio (10×10) | Complejidad |
|---|---|---|
| Aleatoria pura | ~96 disparos | Ninguna |
| Patrón de ajedrez | ~65–70 disparos | Baja |
| Hunt & Target | ~52–58 disparos | Media |
| Densidad probabilística | ~42–48 disparos | Alta |
| Óptimo teórico | ~35–40 disparos | Muy alta |
El primer paso es cuantificar la complejidad del juego. ¿Cuántas formas hay de colocar una flota completa?
Un barco de tamaño $k$ colocado horizontalmente en un tablero $N \times N$ ocupa $N$ filas y $N - k + 1$ columnas posibles, dando:
$$P_H(k, N) = N \cdot (N - k + 1)$$Lo mismo para orientación vertical:
$$P_V(k, N) = (N - k + 1) \cdot N$$Total de posiciones para un barco de tamaño $k$:
$$P(k, N) = 2N(N-k+1)$$Para el portaaviones ($k=5$) en un tablero 10×10:
El número total de configuraciones de flota completa (sin solapamientos) es enorme — del orden de $10^{12}$ configuraciones válidas para la flota estándar. Esto hace imposible la búsqueda exhaustiva y justifica usar heurísticas probabilísticas.
Dado el estado actual del tablero (hits y misses conocidos), queremos calcular la probabilidad de que cada celda desconocida contenga un barco.
Sea $\mathcal{C}$ el conjunto de configuraciones de flota consistentes con las observaciones actuales. La probabilidad de que la celda $(r,c)$ contenga un barco es:
$$P(r,c) = \frac{|\{\text{configs en } \mathcal{C} \text{ donde } (r,c) \text{ tiene barco}\}|}{|\mathcal{C}|}$$Calcular esto exactamente es intractable. La aproximación usada es el conteo de cobertura:
$$\hat{P}(r,c) = \sum_{s \in \text{barcos\_restantes}} \sum_{\text{pos válidas de } s \text{ que cubren } (r,c)} 1$$Este estimador es proporcional a la probabilidad real si asumimos distribución uniforme sobre posiciones válidas. En la práctica es una excelente aproximación que permite calcular el mapa de calor de forma eficiente.
Cada disparo nos proporciona información. ¿Cuánta? La teoría de la información de Shannon da una respuesta precisa.
Si disparamos a una celda con probabilidad de impacto $p$, el resultado es una variable aleatoria binaria con entropía:
$$H(p) = -p \log_2 p - (1-p) \log_2(1-p) \quad \text{(bits)}$$Esta función se maximiza en $p = 0.5$, donde $H(0.5) = 1$ bit.
Sin embargo, en Batalla Naval el objetivo no es solo obtener información sino hundir barcos rápido. Hay un trade-off entre:
La estrategia óptima resuelve este equilibrio usando programación dinámica sobre el espacio de creencias.
El patrón de ajedrez tiene una justificación matemática elegante basada en coloraciones de grafos.
Sea $k_{min}$ el tamaño del barco más pequeño restante. En una 2-coloración del tablero (tipo ajedrez), todo barco de tamaño $k_{min}$ ocupa al menos $\lceil k_{min}/2 \rceil$ celdas de cada color.
Para $k_{min} = 2$: cualquier barco de tamaño 2 ocupa exactamente 1 celda de cada color. Por tanto, disparar solo en las celdas de un color garantiza detectarlo.
$$\text{Celdas necesarias} = \left\lceil \frac{N^2}{k_{min}} \right\rceil$$En un 10×10 con $k_{min} = 2$: necesitamos como máximo $\lceil 100/2 \rceil = 50$ disparos para garantizar al menos un impacto en cualquier barco restante. Cuando el barco mínimo pasa a ser de tamaño 3 (hundiste el destructor), el patrón óptimo cambia:
Una pregunta natural: ¿cuántos disparos necesita en promedio una estrategia dada? Podemos modelar el juego con procesos estocásticos.
Con una estrategia de muestreo uniforme sin reposición, el número esperado de disparos $E[T]$ para encontrar la primera celda del barco sigue una distribución hipergeométrica negativa:
$$E[T] = \frac{N^2 + 1}{k + 1}$$Para un portaaviones ($k=5$) en 10×10: $E[T] = 101/6 \approx 16.8$ disparos esperados hasta primer impacto.
Para la flota completa, el cálculo se complica porque los barcos interactúan. La fórmula exacta requiere integrar sobre todas las configuraciones posibles, pero simulaciones Monte Carlo dan valores empíricos precisos.
donde $T_i$ es el número de disparos para hundir el $i$-ésimo barco dado que los anteriores ya están hundidos. Esta dependencia condicional hace el problema no trivial.
La estrategia exactamente óptima se formula como un Proceso de Decisión de Markov (MDP):
Estado: $s = (\text{observaciones actuales})$ — hits, misses, y por tanto creencias sobre posiciones.
Acción: $a = (r, c)$ — celda a la que disparar.
Transición: $s' = s \cup \{(r,c, \text{resultado})\}$ — actualización bayesiana.
Recompensa: $-1$ por disparo (queremos minimizar disparos totales).
La política óptima $\pi^*$ satisface la ecuación de Bellman:
$$V^*(s) = \max_{a} \left[ r(s,a) + \sum_{s'} P(s'|s,a) V^*(s') \right]$$El espacio de estados es exponencialmente grande (~$2^{100}$ en un 10×10), por lo que resolver el MDP exactamente es computacionalmente inviable. Las mejores soluciones prácticas usan:
Resumiendo cómo cada concepto matemático se traduce en ventaja real en el juego:
| Concepto matemático | Aplicación en el juego | Ganancia (disparos) |
|---|---|---|
| Paridad / coloración de grafos | Patrón de ajedrez en Hunt | −30 vs aleatoria |
| Distribución hipergeométrica | Ajustar patrón según $k_{min}$ | −5 a −10 adicionales |
| Estimación de densidad | Mapa de calor probabilístico | −10 a −15 adicionales |
| Actualización bayesiana | Excluir posiciones inválidas tras cada hit | −3 a −5 adicionales |
| Teoría de la información | En Hunt, priorizar celdas con $p \approx 0.5$ | Marginal pero real |