PlayPendium

Salvo · Reflexiones

Dentro de Salvo

Bajo el simple acto de hacer clic en casillas se esconde un motor determinista que modela flotas ocultas, razonamiento ponderado por probabilidad y el clásico duelo entre ocultación y descubrimiento. 3

Redactado y editado en inglés. Esta versión en español se ha generado mediante traducción automática; cuando la precisión importe, la versión de referencia es el original en inglés. Leer el original en inglés →

Los dos tableros

En el corazón del juego hay un par de objetos Board, uno que representa tu posición oculta y otro que representa la posición oculta del oponente. Cada tablero alberga una flota de barcos colocados sobre una cuadrícula, pero las ubicaciones permanecen ocultas para el otro bando. Tú disparas a la cuadrícula enemiga mientras la IA dispara a la tuya, y cada disparo o bien impacta en un barco o bien cae al agua. Esta arquitectura de doble tablero establece la asimetría de información fundamental del duelo de flotas ocultas: cada bando conoce por completo su propio tablero, pero solo puede inferir la configuración del otro a partir del patrón de sus disparos. 3

La simetría de este planteamiento es lo que da al juego su carácter. Ningún bando ve directamente los barcos del otro. En su lugar, ambos deben construir un modelo mental de la cuadrícula oculta a partir de la escasa información que dan los impactos y los fallos. Cada disparo se convierte en datos, cada impacto reduce las posibilidades y cada fallo descarta territorio. El coordinador de partida del motor gestiona estos dos tableros, asegurando que los disparos se registren, que los impactos se atribuyan correctamente y que la partida solo termine cuando toda la flota de un bando haya sido hundida. 3

Un modelo determinista convierte el tanteo a ciegas en una búsqueda informada.

Disposición aleatoria, reglas deterministas

Antes de que comience la partida, el motor llama a randomFleet para colocar los barcos de la IA de manera aleatoria. Esta aleatoriedad no es arbitraria: parte de una semilla, lo que significa que un valor de semilla dado producirá siempre la misma disposición. Este determinismo por semilla es una decisión de diseño que hace que el juego sea reproducible y comprobable. Si ejecutas el juego con la misma semilla, obtendrás las mismas colocaciones de barcos, la misma secuencia de decisiones de la IA y el mismo resultado. Esta propiedad es valiosa para depurar y para entender cómo se comporta la IA en distintas condiciones. 3

Una vez colocada la flota, las reglas que gobiernan la partida son fijas y deterministas. La IA no lanza dados y el motor no introduce aleatoriedad a mitad de la partida. Cada decisión que toma la IA se deriva del modelo de probabilidad que mantiene, y cada disparo que efectúas se registra y se analiza. La única fuente de variación es la semilla que determina la colocación inicial de la flota. Esto significa que el juego es, en última instancia, un rompecabezas: dadas las restricciones de las reglas y la información que dan los disparos, ¿puedes deducir la configuración oculta antes de que la IA deduzca la tuya? 3

Efectuar el disparo

Cuando disparas, el motor registra el disparo en el tablero objetivo y comprueba si ha impactado o ha fallado. Esto se hace a través de la función fire, que actualiza el estado del tablero y determina el resultado. Un impacto marca la casilla como ocupada por un barco, mientras que un fallo la marca como agua. A continuación, el motor comprueba si el barco que contiene esa casilla ha sido hundido por completo examinando todas sus casillas. Si todas las casillas de un barco han recibido impacto, el barco queda hundido y esta información se comunica a ambos bandos. 3

La condición de victoria es sencilla pero de mucho peso. Un bando gana cuando todos los barcos del oponente están hundidos. Esto se comprueba a través de la función allSunk, que examina si cada barco del tablero del oponente ha recibido impacto en todas sus casillas. La partida termina de inmediato cuando se cumple esta condición. Este carácter de todo o nada de la condición de victoria significa que cada disparo importa y que la presión por hundir barcos rápidamente se equilibra con la necesidad de no revelar tu propia configuración. 3

La IA caza por probabilidad y remata en la fase de objetivo.

El motor de probabilidad

El oponente en este juego no es un simple tirador aleatorio. Es una IA que elige sus objetivos por probabilidad y pondera lo probable que es que cada casilla oculta contenga un barco. La IA mantiene un modelo de probabilidad de la cuadrícula enemiga y lo actualiza a medida que se efectúan disparos y se recibe su resultado. Las casillas que no pueden contener barcos debido a las restricciones de colocación de los barcos restantes se marcan como improbables, mientras que las casillas que deben contener barcos para dar cabida a las colocaciones restantes se marcan como probables. La IA dispara entonces a la casilla con la probabilidad más alta, convirtiendo el tanteo a ciegas en una búsqueda informada. 3

Este modelo de probabilidad se basa en las matemáticas de la verosimilitud, donde los sucesos se describen mediante números entre cero y uno 2. Una probabilidad de cero significa que un suceso no puede ocurrir, mientras que una probabilidad de uno significa que debe ocurrir. La IA utiliza estas descripciones numéricas para guiar sus disparos, favoreciendo las casillas donde la probabilidad de encontrar un barco es más alta. Este enfoque es lo que distingue a la IA de un tirador puramente aleatorio y le da su característico comportamiento de caza.

Caza y objetivo

El comportamiento de la IA se puede describir en dos fases: caza y objetivo. En la fase de caza, la IA busca barcos disparando a las casillas donde es más probable que se encuentren los barcos aún no descubiertos. Es una búsqueda amplia cuyo fin es lograr el primer contacto con los barcos enemigos. Una vez que se registra un impacto, la IA pasa a la fase de objetivo, donde se centra en las casillas vecinas del impacto para terminar de hundir ese barco. Este enfoque en dos fases refleja la forma en que los jugadores humanos abordan el juego: primero encontrar los barcos y luego hundirlos. 3

La transición entre caza y objetivo está determinada por si el último disparo fue un impacto o un fallo. Si el último disparo falló, la IA vuelve al modo de caza y busca las casillas con la probabilidad más alta. Si el último disparo impactó, la IA entra en modo de objetivo y dispara a las casillas vecinas del impacto. Esta regla simple, combinada con el modelo de probabilidad, crea una estrategia coherente que equilibra exploración y explotación. La IA explora la cuadrícula para encontrar barcos y explota lo que sabe de un impacto para hundir ese barco de manera eficiente. 3

Tres niveles de dificultad ajustan el comportamiento de la IA.

Tres niveles de dificultad

La IA tiene tres niveles de dificultad que ajustan su comportamiento. Estos niveles afectan a cómo la IA pondera las probabilidades y toma decisiones. En los niveles más bajos, la IA puede cometer más errores o ser menos agresiva al elegir objetivos. En los niveles más altos, la IA es más consistente en sus cálculos de probabilidad y más implacable al elegir objetivos. Esta variedad de niveles permite a los jugadores encontrar un grado de desafío que se adapte a ellos, desde el juego relajado hasta la competición seria.

La implementación exacta de estos niveles se encuentra en el componente de IA del motor, la clase SalvoAI. Los niveles de dificultad modifican cómo la IA interpreta el modelo de probabilidad y cómo equilibra la exploración frente a la explotación. Este diseño permite que la IA sea accesible para los jugadores ocasionales y desafiante para los experimentados, sin cambiar las mecánicas fundamentales del juego. 3

El barrido de sonar

Sobre las reglas clásicas se asienta un giro: el barrido de sonar. Esta habilidad permite a un bando revelar una lectura de 3×3 de la cuadrícula enemiga a cambio del disparo de ese turno. El sonar revela si cada casilla del área de 3×3 contiene un barco o es agua. Esta información puede ser inestimable para acotar la ubicación de los barcos, pero tiene el precio de perder tu disparo de ese turno. 3

La decisión de usar el sonar es estratégica. ¿Cuándo merece la información ese coste? Si te cuesta encontrar barcos, el sonar puede darte el avance que necesitas. Si estás cerca de hundir un barco, el coste de perder tu disparo podría ser demasiado alto. El sonar añade al juego una capa de gestión de recursos, obligando a los jugadores a sopesar el valor de la información frente al valor de la acción. 3

La reubicación es una opción defensiva de un solo uso.

Una reubicación por partida

Otro giro sobre las reglas clásicas es la reubicación única por partida. Cada bando puede mover uno de sus propios barcos una vez durante la partida. Esta esquiva defensiva no cuesta un turno, lo que significa que puedes reubicar un barco y aun así disparar en tu turno. La habilidad de reubicación te permite sacar un barco del peligro cuando está bajo amenaza, o trasladarlo a una posición más defendible. 3

La habilidad de reubicación es una opción de un solo uso, lo que la hace muy valiosa. ¿Cuándo deberías usarla? Si un barco está a punto de ser hundido, reubicarlo puede salvarlo. Si confías en tu posición actual, reubicar podría ser un desperdicio. La decisión de reubicar es estratégica y requiere una consideración cuidadosa del estado actual de la partida y de las acciones probables de tu oponente. 3

Un disparo por turno

Bajo todas estas mecánicas subyace la regla clásica de un disparo por turno. Cada bando efectúa exactamente un disparo por turno, alternándose uno y otro. Esta regla establece el ritmo de la partida y asegura que ambos bandos tengan las mismas oportunidades de actuar. La regla de un disparo por turno es lo que hace del juego un duelo de ingenio en lugar de una carrera de velocidad. 3

Esta regla clásica es lo que arraiga el juego en la tradición de «hundir la flota», un juego de adivinación de tipo estratégico para dos jugadores que se juega sobre cuadrículas, donde la flota de cada jugador permanece oculta para el oponente 1. La regla de un disparo por turno es lo que hace del juego una prueba de deducción y probabilidad en lugar de una prueba de reflejos. Es una regla simple, pero es la que da al juego su carácter y su desafío.

El determinismo puro hace que el juego sea comprobable.

Determinismo por semilla

El motor es puro y determinista por semilla, impulsado por su propio generador de números aleatorios con semilla. Esto significa que cada aspecto de la partida está determinado por el valor de semilla proporcionado al inicio. Dada la misma semilla, el juego producirá siempre la misma secuencia de eventos, desde la colocación inicial de la flota hasta el disparo final. Esta propiedad hace que el juego sea comprobable, ya que el mismo escenario puede reproducirse y examinarse. 3

El determinismo por semilla también tiene implicaciones para entender el juego. Si quieres entender cómo se comporta la IA en un escenario concreto, puedes ejecutar el juego con una semilla específica y observar el resultado. Si quieres probar una estrategia concreta, puedes ejecutar el juego varias veces con la misma semilla y ver cómo funciona. Esta reproducibilidad es una característica valiosa tanto para los jugadores como para los desarrolladores.

Sources & notes

  1. "Battleship (game)," Wikipedia, a strategy-type guessing game for two players, played on ruled grids on which each player's fleet of warships is marked and concealed from the opponent; players alternate calling shots at the other's grid to hit and sink ships, aiming to sink the entire fleet; the game evolved from a pencil-and-paper game dating to around the World War I era; the first commercial version was called Salvo, published by the Starex company in 1931, and in 1967 Milton Bradley published a version using plastic pegboards and miniature ships; and in the "salvo" variant a specified number of squares are targeted at one time, all attacked simultaneously. en.wikipedia.org/wiki/Battleship_(game).
  2. "Probability," Wikipedia, a branch of mathematics concerning numerical descriptions of how likely events are to occur; the probability of an event is a number between 0 and 1, where 0 indicates impossibility and 1 indicates certainty, and the larger the probability the more likely the event (for example, a fair coin flip has probability 0.5 for each outcome). en.wikipedia.org/wiki/Probability.
  3. This game's engine: a Battleship game where each side has a Board with a hidden fleet, the human fires at the enemy fleet and the AI at the human's, one shot per turn (classic rules), fire records a hit or miss, and a side wins when the opponent's ships are all sunk (allSunk); the opponent is a probability-targeting SalvoAI with three difficulty strengths that "hunts" for ships by favouring the cells where an undiscovered ship is most likely to sit and then "targets" the neighbours of a hit to finish it; two twists sit on the classic rules, a sonar ping reveals a 3×3 ship/empty readout but costs that turn's shot, and each side may reposition one of its own ships once per game (a dodge that does not cost the turn); and the engine is pure and seeded-deterministic.
  4. Further reading on Probability, Interpretations of Probability (Stanford Encyclopedia of Philosophy/Winter 2012 Edition). plato.stanford.edu.
  5. Further reading on Probability, Probability -- from Wolfram MathWorld. mathworld.wolfram.com.
  6. Further reading on Probability, Logical foundations and measurement of subjective probability. doi.org.
Was this worth reading?
← Back to Salvo
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Inspirations · © 2026