PlayPendium

Salvo · 생각의 양식

Salvo의 내부

칸을 클릭하는 단순한 행위 아래에는 숨겨진 함대, 확률 가중 추론, 그리고 은폐와 발견이라는 고전적인 결투를 모델링하는 결정론적 엔진이 놓여 있습니다. 3

영어로 집필하고 편집했습니다. 이 한국어 판은 기계 번역으로 만들어졌으며, 정확성이 중요한 경우에는 영어 원문이 기준이 됩니다. 영어 원문 읽기 →

두 개의 보드

게임의 중심에는 한 쌍의 Board 객체가 있습니다. 하나는 당신의 숨겨진 배치를, 다른 하나는 상대의 숨겨진 배치를 나타냅니다. 각 보드는 눈금이 그어진 격자 위에 배치된 함대를 담고 있지만, 그 위치는 상대편에게 감춰져 있습니다. 당신은 적의 격자에 발사하고 AI는 당신의 격자에 발사하며, 각 발사는 함선을 맞히거나 빈 바다에 떨어집니다. 이 이중 보드 구조는 숨겨진 함대 결투의 근본적인 정보 비대칭성을 확립하는데, 각 편은 자신의 보드를 완전히 알지만 상대의 배치는 자신의 발사 패턴으로부터 추론할 수 있을 뿐입니다. 3

이 구성의 대칭성이 게임에 그 성격을 부여합니다. 어느 쪽도 상대의 함선을 직접 보지 못합니다. 대신 양쪽 모두 명중과 빗나감이라는 드문드문한 피드백으로부터 숨겨진 격자의 심적 모델을 구성해야 합니다. 모든 발사는 데이터가 되고, 모든 명중은 가능성을 좁히며, 모든 빗나감은 고려 대상에서 영역을 제거합니다. 엔진의 게임 조정자는 이 두 보드를 관리하여 발사가 기록되고, 명중이 올바르게 귀속되며, 한쪽의 함대 전체가 격침되었을 때에만 게임이 끝나도록 보장합니다. 3

결정론적 모델은 눈먼 추측을 정보에 근거한 탐색으로 바꿉니다.

무작위 배치, 결정론적 규칙

플레이가 시작되기 전에 엔진은 randomFleet를 호출하여 AI의 함선을 무작위로 배치합니다. 이 무작위성은 제멋대로가 아닙니다. 시드가 적용되어 있어서, 주어진 시드 값은 항상 같은 배치를 만들어 냅니다. 이 시드 기반 결정론은 게임을 재현 가능하고 테스트 가능하게 만드는 설계상의 선택입니다. 같은 시드로 게임을 실행하면 같은 함선 배치, 같은 AI 결정의 순서, 같은 결과를 얻게 됩니다. 이 속성은 디버깅에, 그리고 AI가 서로 다른 조건에서 어떻게 행동하는지 이해하는 데 가치가 있습니다. 3

함대가 배치되고 나면 플레이를 지배하는 규칙은 고정되어 있고 결정론적입니다. AI는 주사위를 굴리지 않으며, 엔진은 게임 도중에 무작위성을 끌어들이지 않습니다. AI가 내리는 모든 결정은 AI가 유지하는 확률 모델에서 따라 나오며, 당신이 쏘는 모든 발사는 기록되고 분석됩니다. 유일한 변동의 원천은 초기 함대 배치를 결정하는 시드입니다. 이는 게임이 결국 하나의 퍼즐임을 뜻합니다. 규칙의 제약과 발사에서 얻는 피드백이 주어졌을 때, AI가 당신의 배치를 알아내기 전에 당신이 숨겨진 배치를 추론해 낼 수 있을까요? 3

발사하기

당신이 발사하면 엔진은 그것을 표적 보드에 기록하고 명중인지 빗나감인지 확인합니다. 이는 fire 함수를 통해 이루어지며, 이 함수는 보드의 상태를 갱신하고 결과를 판정합니다. 명중은 그 칸을 함선이 차지한 것으로 표시하고, 빗나감은 빈 바다로 표시합니다. 그런 다음 엔진은 그 칸을 포함하는 함선의 모든 칸을 검사하여 그 함선이 완전히 격침되었는지 확인합니다. 함선의 모든 칸이 명중되었다면 그 함선은 격침되며, 이 정보는 양쪽에 전달됩니다. 3

승리 조건은 단순하지만 그 결과는 중대합니다. 상대의 함선이 모두 격침되면 그쪽이 승리합니다. 이는 allSunk 함수를 통해 확인되는데, 이 함수는 상대 보드의 모든 함선이 완전히 명중되었는지 검사합니다. 이 조건이 충족되면 게임은 즉시 끝납니다. 승리 조건의 이러한 전부 아니면 전무의 성격은 모든 발사가 중요하다는 것, 그리고 함선을 빨리 격침해야 한다는 압박이 자신의 배치를 드러내지 않아야 한다는 필요와 균형을 이룬다는 것을 뜻합니다. 3

AI는 확률로 사냥하고 표적 조준으로 마무리합니다.

확률 엔진

이 게임의 상대는 단순한 무작위 사수가 아닙니다. 숨겨진 각 칸에 함선이 있을 가능성이 얼마나 되는지를 저울질하는 확률 표적 AI입니다. AI는 적 격자의 확률 모델을 유지하며, 발사가 이루어지고 피드백이 들어올 때마다 이를 갱신합니다. 남은 함선의 배치 제약 때문에 함선이 있을 수 없는 칸은 가능성이 낮은 것으로 표시되고, 남은 배치를 수용하기 위해 반드시 함선이 있어야 하는 칸은 가능성이 높은 것으로 표시됩니다. 그런 다음 AI는 확률이 가장 높은 칸에 발사하여, 맹목적인 추측을 정보에 근거한 탐색으로 바꿉니다. 3

이 확률 모델은 사건을 0과 1 사이의 수로 기술하는 가능도의 수학에 뿌리를 두고 있습니다 2. 확률 0은 사건이 일어날 수 없음을, 확률 1은 반드시 일어남을 뜻합니다. AI는 이러한 수치적 기술을 사용해 발사를 이끌며, 함선을 찾을 확률이 가장 높은 칸을 선호합니다. 이 접근법이 AI를 순수한 무작위 사수와 구별 짓고, AI 특유의 사냥 행동을 부여합니다.

사냥과 표적

AI의 행동은 사냥과 표적이라는 두 단계로 설명할 수 있습니다. 사냥 단계에서 AI는 아직 발견되지 않은 함선이 있을 가능성이 가장 높은 칸에 발사하여 함선을 찾습니다. 이는 적 함선과의 첫 접촉을 찾는 것을 목표로 하는 폭넓은 탐색입니다. 명중이 기록되면 AI는 표적 단계로 전환하여, 그 함선을 마저 격침하기 위해 명중한 칸의 이웃 칸에 집중합니다. 이 두 단계 접근법은 인간 플레이어가 게임에 접근하는 방식을 그대로 반영합니다. 먼저 함선을 찾고, 그다음 격침합니다. 3

사냥과 표적 사이의 전환은 마지막 발사가 명중이었는지 빗나감이었는지에 따라 결정됩니다. 마지막 발사가 빗나갔다면 AI는 사냥 모드로 돌아가 확률이 가장 높은 칸을 찾습니다. 마지막 발사가 명중했다면 AI는 표적 모드에 들어가 명중한 칸의 이웃 칸에 발사합니다. 이 단순한 규칙은 확률 모델과 결합되어 탐색과 활용의 균형을 잡는 일관된 전략을 만들어 냅니다. AI는 함선을 찾기 위해 격자를 탐색하고, 그 함선을 효율적으로 격침하기 위해 명중에 대한 지식을 활용합니다. 3

세 가지 난이도 강도가 AI의 행동을 조율합니다.

세 가지 강도

AI에는 행동을 조율하는 세 가지 난이도 강도가 있습니다. 이 강도는 AI가 확률을 저울질하고 결정을 내리는 방식에 영향을 줍니다. 낮은 강도에서는 AI가 더 많은 실수를 하거나 표적 지정에 덜 공격적일 수 있습니다. 높은 강도에서는 AI가 확률 계산에서 더 일관되고 표적 지정에서 더 냉혹합니다. 이러한 강도의 다양성 덕분에 플레이어는 가벼운 플레이부터 진지한 대결까지 자신에게 맞는 도전 수준을 찾을 수 있습니다.

이 강도의 정확한 구현은 엔진의 AI 구성 요소인 SalvoAI 클래스에 있습니다. 난이도 수준은 AI가 확률 모델을 해석하는 방식과 탐색과 활용의 균형을 잡는 방식을 바꿉니다. 이 설계 덕분에 AI는 게임의 근본적인 메커니즘을 바꾸지 않고도 가벼운 플레이어에게는 접근하기 쉽고 숙련된 플레이어에게는 도전적일 수 있습니다. 3

소나 핑

고전적인 규칙 위에 하나의 변주가 얹혀 있습니다. 바로 소나 핑입니다. 이 능력은 그 턴의 사격을 대가로 적 격자의 3×3 판독을 드러내게 해 줍니다. 소나 핑은 3×3 구역의 각 칸에 함선이 있는지 빈 바다인지를 드러냅니다. 이 정보는 함선의 위치를 좁히는 데 더없이 귀중할 수 있지만, 그 턴의 사격을 잃는다는 대가가 따릅니다. 3

소나 핑을 사용할지의 결정은 전략적인 것입니다. 언제 정보가 그 대가만큼의 가치가 있을까요? 함선을 찾는 데 애를 먹고 있다면 소나 핑이 필요한 돌파구를 마련해 줄 수 있습니다. 함선을 거의 격침할 참이라면 사격을 잃는 대가가 너무 클 수 있습니다. 소나 핑은 게임에 자원 관리라는 층을 더하여, 플레이어가 정보의 가치와 행동의 가치를 저울질하도록 만듭니다. 3

재배치는 게임당 한 번뿐인 방어 수단입니다.

게임당 1회 재배치

고전적인 규칙에 대한 또 하나의 변주는 게임당 1회의 재배치입니다. 각 편은 게임 중 한 번 자신의 함선 하나를 이동할 수 있습니다. 이 방어적 회피는 턴을 소모하지 않으므로, 재배치를 하고도 자기 턴에 여전히 발사할 수 있습니다. 재배치 능력은 위협받는 함선을 위험에서 빼내거나, 더 방어하기 좋은 위치로 옮길 수 있게 해 줍니다. 3

재배치 능력은 단 한 번뿐인 선택지이며, 그래서 소중합니다. 언제 써야 할까요? 함선이 격침되기 직전이라면 재배치가 그 함선을 구할 수 있습니다. 현재 위치에 자신이 있다면 재배치는 낭비일지도 모릅니다. 재배치 결정은 게임의 현재 상태와 상대의 예상되는 행동을 신중히 고려해야 하는 전략적 결정입니다. 3

턴당 한 발

이 모든 메커니즘의 바탕에는 턴당 한 발이라는 고전적인 규칙이 있습니다. 각 편은 턴마다 정확히 한 발을 발사하며, 번갈아 가며 주고받습니다. 이 규칙은 게임의 리듬을 확립하고 양쪽 모두에게 동등한 행동 기회를 보장합니다. 턴당 한 발 규칙이야말로 이 게임을 속도의 경주가 아니라 지혜의 결투로 만드는 것입니다. 3

이 고전적인 규칙이 게임을 배틀십의 전통에 뿌리내리게 합니다. 배틀십은 두 명의 플레이어가 눈금이 그어진 격자 위에서 벌이는 전략형 추측 게임으로, 각 플레이어의 함대는 상대에게 감춰져 있습니다 1. 턴당 한 발 규칙이야말로 이 게임을 반사 신경의 시험이 아니라 추론과 확률의 시험으로 만드는 것입니다. 단순한 규칙이지만, 게임에 그 성격과 도전을 부여하는 규칙입니다.

순수한 결정론이 게임을 시험 가능하게 만듭니다.

시드 기반 결정론

엔진은 순수하고 시드 기반으로 결정론적이며, 자체의 시드 난수 생성기로 구동됩니다. 이는 게임의 모든 측면이 시작 시 제공된 시드 값에 의해 결정된다는 뜻입니다. 같은 시드가 주어지면 게임은 초기 함대 배치부터 마지막 발사까지 항상 같은 사건의 순서를 만들어 냅니다. 이 속성은 같은 시나리오를 재현하고 검토할 수 있으므로 게임을 테스트 가능하게 만듭니다. 3

시드 기반 결정론은 게임을 이해하는 데에도 함의를 갖습니다. 특정 시나리오에서 AI가 어떻게 행동하는지 이해하고 싶다면, 특정 시드로 게임을 실행하고 결과를 관찰하면 됩니다. 특정 전략을 시험하고 싶다면, 같은 시드로 게임을 여러 번 실행하여 그 전략이 어떻게 수행되는지 볼 수 있습니다. 이 재현성은 플레이어와 개발자 모두에게 가치 있는 기능입니다.

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