GAME DESIGN DOCUMENT

Mine Duel — 게임 사양서

MINE DUEL — 게임 시스템 사양서 (공개 Web v0.3.1)

00. 문서 정보

항목 내용
문서 성격 공개 Web 구현을 분석해 재구성한 게임 시스템 사양서
게임 버전 v0.3.1-web
문서 개정 / 작성일 0.4 / 2026-10-21
플랫폼 / 모드 모바일·PC Web / CPU 대전 · 온라인 1:1

공개 소스 / CPU 대전 / 온라인 대전

본 문서는 개발 후 공개 구현을 분석해 재구성했다. CPU 대전과 온라인 전용 규칙을 구분하여 설명한다.

01. 게임 개요 및 기획 의도

항목 사양
콘셉트 "룰은 가볍게, 플레잉은 깊게" — 숨겨진 상대의 지뢰를 추리하며 자신도 지뢰를 매설해 안전지대를 좁혀가는 턴제 심리 대전
장르 턴제 지뢰찾기 / 정보 추리·보드 제어 대전
플레이 방식 CPU 대전: 인간 선공 / 온라인: 사람 2명, 최초 선공 무작위
승리 목표 상대가 내 지뢰를 탐색해 패배하도록 생존. CPU 교착은 무승부, 온라인 속행 불가는 마커 점수 비교
원작 지뢰찾기와의 차별점 ① 매 턴 지뢰가 추가되며 이미 열린 안전지대의 숫자도 실시간으로 변한다. ② 마커(깃발)는 해당 칸의 탐색과 신규 지뢰 매설을 동시에 봉쇄한다.
공개 버전 범위 CPU 대전·온라인 1:1, CPU 난이도 3종, 4개 언어 지원

기획 배경 및 핵심 재미

  • 기획 배경: 체스나 장기처럼 양측이 완전히 동일한 조건에서 겨루는 간단한 대칭형 대전 게임을 구상하던 중, 이미 대중에게 기본 규칙이 널리 알려진 '지뢰찾기'에 주목했다. 체스·장기보다 진입장벽이 낮아 누구나 직관적으로 이해할 수 있으면서도, 이를 2인 대전 형식으로 재해석하면 턴이 진행될수록 안전지대가 줄어드는 압박감과 수싸움을 연출할 수 있다고 판단해 "룰은 가볍게, 플레잉은 깊게"를 목표로 기획했다.
  • 핵심 재미 (비공개 정보와 공개 정보의 심리전): 이 게임의 핵심 재미는 '새로 설치된 지뢰(비공개 정보)'와 '안전지대에 나타나는 숫자의 변화(공개 정보)'를 교차해 읽는 심리전에 있다. 카드 게임에서 상대의 수를 예측하는 재미와 맞닿아 있지만, 복잡한 카드 텍스트나 규칙 숙지를 요구하지 않고 양측이 할 수 있는 행동이 완전히 동일한 상태에서 상대와 나의 전략적 선택 차이를 예측해내는 재미에 집중했다.
  • 두 가지 핵심 장치와 신중함의 유도:
    1. 지뢰 추가로 인한 실시간 숫자 변화: 정해진 지뢰를 찾아내며 후반으로 갈수록 안전해지고 안심하게 되는 원작 지뢰찾기와 달리, 플레이어들이 직접 판을 만들어가며 후반으로 갈수록 오히려 안전지대가 좁혀지는 역방향의 긴장감을 형성한다.
    2. 마커(깃발)를 통한 안전지대 구분과 페널티: 마커는 위험 구역을 표시해 안전지대를 구분하게 해주는 동시에 해당 칸의 탐색과 신규 매설을 봉쇄한다. 만약 판단을 틀려 안전한 칸에 마커를 놓으면 스스로 자신의 안전지대를 좁혀 상대방에게 큰 이점을 내어주는 페널티가 되므로, 자연스럽게 매 수마다 신중한 판단을 유도한다.
  • 싱글(CPU) 모드 구성과 향후 방향: 다른 대전 게임의 싱글 모드와 마찬가지로 본 버전의 CPU 모드는 기본 규칙과 수싸움에 익숙해지기 위한 연습용·솔로 모드로 준비했다. 혼자 퍼즐을 푸는 이용 방식도 유지하며, 현재 v0.3.1은 CPU와 별도 온라인 PvP를 함께 제공한다.

모드별 적용 범위

구분 CPU 대전 온라인 1:1 대전
상대 / 선공 CPU / 인간 선공 사람 / 최초 서버 무작위, 재대전은 교대
제한시간 없음. 메뉴 중 CPU 일시 정지 일반 턴 전체 20초, 오프닝 각 행동 20초. 모달·단절 중에도 진행
교착 종료 기존 공통 행동 불가 무승부 서버가 실제 안전 탐색 칸 0개를 확인하면 마커 점수로 승패
실행 / 복귀 브라우저 실행, 새로고침 시 새 게임 서버 상태 유지, 같은 기기·브라우저의 저장 토큰으로 복귀

이 문서에서 CPU 대전과 온라인 전용을 구분한다. 8×8 보드·숫자 계산·설치/탐색의 셀 조건은 공통이며, CPU용 무승부·난이도·일시 정지 규칙을 온라인에 적용하지 않는다.

02. 게임 전체 흐름

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

진행 단계

  1. 세션 초기화: 페이지에 진입하면 새로운 대전 세션을 초기화한다. (이전 진행 중이던 보드 상태는 이어받지 않는다.)
  2. 언어 선택 (최초 접속 시): 저장된 언어 설정이 없으면 언어 선택 모달(Select Language)을 먼저 표시한다. 언어 선택이 완료되기 전에는 보드 조작을 잠근다.
  3. 규칙 안내 및 난이도 설정: 저장된 언어가 있으면 언어 선택을 생략하고 곧바로 해당 언어로 규칙 안내 및 난이도 선택 팝업을 표시한다. 기본 난이도는 '보통'이며, '게임 시작'을 누르면 팝업이 닫히고 대전이 시작된다.
  4. 오프닝 페이즈 (초기 탐색 및 초기 지뢰 설치):
    • 플레이어 안전 셀 1칸 탐색 → CPU 다른 안전 셀 1칸 탐색 → 플레이어 초기 지뢰 1개 설치 → CPU 초기 지뢰 1개 설치 순서로 진행한다.
    • 오프닝 페이즈에서는 별도의 턴 종료 버튼을 누르지 않고 즉시 다음 순서로 넘어가며, 턴 수도 증가하지 않는다.
  5. 일반 턴 루프 (탐색 → 지뢰 설치 → 마커 관리 → 턴 종료):
    • 플레이어의 1턴째부터 매 차례 안전 셀 1칸 탐색 → 지뢰 1개 설치 → (선택적) 마커 관리 → 턴 종료 순서를 반복한다.
    • 마커(깃발) 설치 및 제거는 일반 턴 내 탐색 전·지뢰 설치 중·턴 종료 전 언제든 수행할 수 있다.
  6. 결과 확정: 지뢰 접촉 또는 교착(무승부) 등 종료 조건이 성립하는 즉시 승패를 확정하고 결과 팝업을 표시한다.
  7. 재시작: 재시작 확인을 확정하면 현재 언어 설정만 유지한 채 보드와 난이도를 초기화하고, 3단계(규칙 안내 및 난이도 선택)부터 다시 시작한다.

페이즈 및 행동 순서 설계 의도

  • 오프닝 페이즈에서 '안전 탐색 → 초기 지뢰 설치' 순서를 채택한 이유: 원작 지뢰찾기처럼 첫 번째 칸을 밟자마자 운 나쁘게 폭사하는 불합리한 경험을 방지하는 것이 가장 큰 목적이다. 또한 양측이 아직 지뢰가 없는 보드에서 먼저 첫 칸을 열어 기준점을 확보한 뒤 초기 지뢰를 매설하도록 함으로써, 1턴째부터 어디에 지뢰를 심고 어디를 열지 고민하는 심리전의 선택지를 넓혔다.
  • 일반 턴의 행동 순서를 고정하고 마커 조작만 열어둔 이유: 오프닝 페이즈에서 경험한 탐색 → 지뢰 설치의 흐름을 일반 턴에서도 그대로 반복하게 하여 규칙의 일관성을 높였다. 행동 순서를 자유롭게 바꾸게 하면 전략적 가짓수는 늘어나지만 플레이어가 룰을 복잡하다고 느낄 우려가 있어 필수 행동의 순서는 단순하게 고정했다. 반면 마커(깃발)는 생략해도 무방한 임의 행동이며, 플레이어가 '이 칸에 지뢰가 있다'는 확신이나 직감이 들었을 때 단계에 구애받지 않고 즉시 표시할 수 있는 편이 직관적이므로 일반 턴 내 언제든 조작할 수 있게 설계했다.
02장 Mermaid 도식 1

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

02장 Mermaid 도식 1

온라인 전용: 방 참가부터 재대전까지

  1. CPU 화면의 메뉴 → 온라인 대전으로 이동하거나 온라인 화면을 직접 연다. 온라인은 별도 페이지이며 자동 시작 규칙 팝업·난이도 선택이 없다.
  2. 방 생성자가 방을 만들고 방 코드 또는 초대 URL을 전달한다. 상대는 코드를 입력하거나 초대 URL에서 참가 버튼을 누른다. 초대만 열어서는 좌석이 배정되지 않는다.
  3. 두 명이 접속하고 각각 Ready(준비)를 눌러야 시작한다. 방 생성자가 선공인 것은 아니며 최초 선공은 서버가 무작위로 결정한다.
  4. 선공 안전 탐색 → 후공 다른 안전 탐색 → 선공 초기 지뢰 → 후공 초기 지뢰. 각 행동은 20초이며 만료 시 서버가 유효한 칸으로 자동 처리한다. 초기 중첩도 허용한다.
  5. 선공부터 일반 턴을 반복한다. 탐색·설치·마커 관리·턴 종료까지 총 20초를 공유한다. 완료한 행동은 유지하고 만료 시 남은 필수 행동을 생략한다.
  6. KO 또는 온라인 종료 조건이 성립하면 결과를 고정하고 전체 지뢰·마커 판정을 공개한다. 기권·접속 종료·무효 결과도 구분한다.
  7. 양쪽이 재대전에 동의하고 모두 접속 중이면 선후공을 교대하여 새 보드로 시작한다. 상대 동의 없이 새 대전을 시작하지 않는다.

다음은 온라인 흐름의 개념도다. 오프닝 자동 행동 후에는 남은 다음 초기 행동으로 진행하며, 단절 규칙은 오프닝에도 적용한다. CPU 흐름의 저장·무승부·재시작과 구분한다.

02장 Mermaid 도식 2

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

02장 Mermaid 도식 2

03. 게임 상태 정의

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

상태 항목 초기값 및 구성 갱신 조건
현재 차례 플레이어 (선공) 오프닝 단계의 각 행동 완료 시 또는 일반 턴 종료 시 상대 차례로 전환
진행 단계 초기 안전 탐색 초기 안전 탐색 → 초기 지뢰 설치 → 일반 탐색 → 지뢰 설치 → 턴 종료 대기 → 게임 종료
턴 수 1 일반 턴 종료마다 +1 (오프닝 단계에서는 증가하지 않음)
지뢰 설치 수 양측 누적 0 / 초기 0 / 현재 턴 0 초기 지뢰·누적 지뢰·현재 턴 내 지뢰 설치 시 각각 갱신
턴 내 마커 설치 횟수 0 (턴당 최대 1회) 신규 마커 설치 시 +1, 턴 종료 시 0으로 초기화 (마커를 제거해도 당해 턴 설치 횟수는 반환되지 않음)
최근 탐색 위치 / 폭발 위치 없음 플레이어의 직전 안전 탐색 위치 및 지뢰 폭발 발생 칸 기록
대전 결과 / 종료 사유 미정 승리·패배·무승부 확정 시 결과 및 종료 사유 기록
보드 8×8 (총 64칸) 04장 셀 사양 참조

탐색 가능 여부는 별도의 고정 상태로 저장하지 않고, 매 판정 시점의 보드 상태를 기준으로 '즉시 탐색 가능한 후보 칸'(미공개 + 마커 없음 + 자신의 지뢰 없음)과 '자신의 마커를 제거해 확보할 수 있는 후보 칸'(미공개 + 자신의 마커 있음 + 자신의 지뢰 없음)을 실시간으로 산출한다. 이때 상대방의 지뢰 매설 여부는 비공개 정보이므로 후보 산출 조건에 포함하지 않는다.

종료 사유는 전체 마커 봉쇄, 공통 탐색 후보 소진, 필수 지뢰 설치 불가의 3가지 무승부 조건과 플레이어/CPU 지뢰 접촉에 의한 승패 조건으로 구분된다.

인터페이스(UI) 상태는 현재 조작 모드(탐색 / 지뢰 설치 / 마커 설치 / 마커 제거), 선택 난이도(기본값 보통), 대전 시작 여부, 팝업 종류, 표시 언어, 상단 상태 안내 문구, CPU 행동 타이머를 관리한다. 재시작 시에는 언어 설정만 유지하고 보드·조작 모드·난이도를 모두 초기 상태로 되돌린다.

온라인 전용: 서버 상태

상태 초기값 / 값 변경 조건
방 상태 대기 → 진행 → 종료 / 만료 양측 준비, 승패, 보관기간 만료
좌석과 준비 0·1의 최대 2석, 준비·재대전 동의 false 참가·Ready·재대전 동의. 새 대전에서 동의 초기화
선공·현재 차례 시작 시 최초 무작위 / 재대전 교대 오프닝 각 행동 또는 일반 턴 교대
단계·턴 수 초기 안전 탐색, 턴 1 오프닝 중 턴 수 유지. 일반 턴 교대 시 +1
서버 마감 시각 시작 시 서버 시각 +20초 오프닝 다음 행동 / 일반 턴 교대 때만 재설정
턴 내 마커 횟수 0, 최대 1 설치 시 +1. 제거로 반환되지 않고 차례가 바뀌면 0
연결·복귀 기한 좌석별 연결 여부 / 단절 감지 +2분 접속·단절·생존 확인. 복귀해도 턴 마감은 연장하지 않음
대전 결과 없음 → KO / 속행 불가 / 기권 / 단절 패배 / 양측 단절 무효 확정 후 재판정하지 않음. 점수는 속행 불가 결과에만 포함
공개 동기화 상태 대전·턴 식별자와 상태 개정 번호 서버가 수락한 상태로 갱신. 이전 대전·턴 요청이 새 대전을 바꾸지 못함

CPU의 최근 탐색 위치·난이도·행동 예약은 온라인 상태에 사용하지 않는다. 온라인 보드 원본은 서버가 보관하고 클라이언트는 자기 시야만 받는다.

결과 기록 상태

대전 시작 시각과 종료 시 확정한 일반 턴 수·경과 시간을 관리한다. 결과 기록은 종료 시 한 번 확정하고, 보드 열람 여부는 UI 상태로만 관리한다. 보드 보기·결과 보기·언어 변경으로 기록이 바뀌지 않는다. CPU 재시작과 온라인 새 대전에서는 새 기록을 생성한다.

04. 보드 및 셀 사양

공통 기본 사양 — 기존 CPU 기준 표·설명을 보존한다. 온라인의 차이는 이 장 끝의 온라인 전용 절을 따른다.

04.1 보드 규격 및 셀 내부 상태

보드는 가로 8열 × 세로 8행(총 64칸)으로 구성된다. 왼쪽 위 모서리를 (0, 0)으로 하여 오른쪽과 아래쪽으로 좌표가 증가하며, 화면 및 접근성 안내에서는 1행~8행, 1열~8열로 표기한다. 한 칸의 인접 범위는 상하좌우 및 대각선을 포함한 최대 8칸(모서리 3칸, 변 가장자리 5칸, 중앙 8칸)이다.

셀 속성 초기값 및 상태 구분 사양 설명
공개 여부 미공개 안전 탐색 성공 시 공개 상태로 전환. 숫자 0이어도 주변 칸이 자동으로 연쇄 공개되지 않음
탐색 주체 없음 (플레이어 / CPU) 해당 안전 칸을 연 주체를 기록 (배경색 구분 및 공개된 칸 재탐색 금지에 사용)
지뢰 소유 상태 지뢰 없음 (없음 / 플레이어 / CPU / 양측 중첩) 해당 칸에 누구의 지뢰가 매설되어 있는지 기록. 마커 표시 여부와 독립적으로 유지됨
마커(깃발) 상태 없음 (플레이어 / CPU) 칸당 최대 1개의 마커만 표시 가능. 실제 지뢰 유무와 무관하게 설치 가능
인접 지뢰 칸 수 0~8 (초기값 0) 주변 최대 8칸 중 지뢰가 1개 이상 존재하는 칸의 개수

보드 및 셀 규칙의 기획 의도

  • 8×8 (64칸) 규격을 채택한 이유: 한 판의 플레이 타임을 늘어지지 않게 유지하고 중반 이후 안전지대가 좁혀지는 밀도감을 살리기 위해 비교적 컴팩트한 맵 크기를 선택했다. 과거 클래식 지뢰찾기의 초급 규격이 8×8이어서 플레이어에게 친숙하다는 점도 고려했다. (향후 옵션으로 조금 더 넓은 보드를 검토할 여지는 있으나, 지나치게 넓은 맵은 템포를 해치고 지루함을 유발할 수 있어 지양한다.)
  • 숫자 0의 주변 자동 연쇄 공개를 배제한 이유: 매 턴 지뢰를 1개씩 추가하며 판을 만들어가는 대전 특성상, 초반에 연쇄 공개로 한꺼번에 많은 칸이 열려버리면 지뢰를 매설할 비공개 공간과 수싸움의 긴장감이 급격히 줄어들기 때문에 항상 선택한 1칸만 열리도록 설계했다.
  • 양측 지뢰가 겹친 칸도 인접 숫자 계산 시 1로 세는 이유: 지뢰가 설치될 때마다 전체 칸의 인접 숫자를 다시 계산하며, 화면에는 이미 열린 안전 칸의 숫자만 표시된다. 만약 한 칸에 플레이어와 CPU의 지뢰가 동시에 매설(중첩)되었을 때 숫자가 중복 가산되면 상대방이 어디에 지뢰를 놓았는지 역산하기가 지나치게 쉬워져 심리전이 단순해진다. 따라서 원작 지뢰찾기의 직관적인 표시 규칙 그대로 '인접 8칸 중 지뢰가 존재하는 칸의 개수'만 세어 1로 반영한다.

04.2 시야(관측 정보) 분리 및 화면 표시 사양

정보 항목 게임 규칙 내부 플레이어 화면 및 CPU 관측 시야
지뢰 매설 정보 양측의 전체 지뢰 위치 보유 자신이 설치한 지뢰 위치만 확인 가능 (상대 지뢰 위치는 비공개)
인접 지뢰 칸 수 미공개 칸을 포함한 전체 칸 계산 공개된 칸의 숫자만 확인 가능 (미공개 칸의 숫자는 비공개)
공개 여부 및 탐색 주체 보유 양측에 동일하게 공개
마커 위치 및 소유자 보유 양측에 동일하게 공개
대전 결과·폭발 위치·누적 설치 수 보유 양측에 동일하게 공개

공정한 추리 대전을 위한 시야 분리: CPU AI에게도 전체 지뢰 위치가 담긴 내부 보드 데이터를 직접 넘기지 않고, 인간 플레이어가 화면에서 볼 수 있는 것과 동일한 '관측 시야 정보(공개된 칸의 숫자, 마커 상태, 자신이 설치한 지뢰 위치)'만 전달하여 치트 없는 공정한 추리 대전을 수행하도록 설계했다.

표시 대상 화면 표시 사양
플레이어 안전 탐색 칸 파란색 계열 배경(#BBD7FF), 숫자(#18263C)
CPU 안전 탐색 칸 붉은 분홍 계열 배경(#FFBDBD), 숫자(#18263C)
미공개 칸 어두운 회색 계열 배경(#1B293C)
자신이 설치한 지뢰 지뢰 아이콘 표시 (상대 지뢰와 중첩된 칸도 동일한 아이콘으로 표시)
마커(깃발) 플레이어는 파란 깃발, CPU는 주황 깃발 표시 (자신의 지뢰 아이콘과 동시 표시 가능)
폭발 위치 붉은색 배경(#B43041) 및 ! 표시 (숫자·지뢰·깃발보다 최우선 표시)

추후 지뢰가 추가되어 이미 열린 칸의 숫자가 바뀌더라도, 해당 칸을 처음 열었던 탐색 주체의 배경색(파랑/분홍)은 그대로 유지된다.

04장 Mermaid 도식 3

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

04장 Mermaid 도식 3

위 도식은 화면 표시 기준의 셀 상태 전이를 나타낸다. 마커가 놓인 칸은 마커가 유지되는 동안 직접 탐색하거나 새로운 지뢰를 매설할 수 없다.

온라인 전용: 관측 정보와 종료 후 표시

항목 진행 중 종료 후
지뢰 자신의 지뢰만 표시. 중첩 여부는 직접 알림 없음 양쪽 소유권과 중첩 공개: 내 지뢰 ✹ / 상대 ◇ / 중첩 ◆
숫자 공개 칸만 0~8. 미공개 숫자는 전송하지 않음 공개 칸 숫자 표시 유지. 숨은 칸의 숫자를 전부 공개하는 기능은 아님
마커 위치·설치자 공유. 본인 파랑 계열, 상대 빨강 계열 각 마커에 정답 ✓ / 오답 × 추가
공개 칸 색 각 시청자 기준 내 탐색 #BBD7FF / 상대 탐색 #FFBDBD 탐색자 색 유지, 접촉 위치는 붉은 배경
점수 실제 상대 지뢰 정답 여부·점수 비공개 속행 불가인 경우에만 양측 점수와 정답·오답 수 표시

온라인의 '내/상대'는 고정 선공·후공이 아니라 접속한 사람 기준이다. 서버는 전체 지뢰를 관리하되 종료 전 상대 소유 비트나 설치 위치를 응답에 넣지 않는다. 화면에서 숨기는 것만으로 보호하지 않는다.

05. 턴 진행 사양

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

행동 구분 실행 가능 조건 처리 결과 (성공 / 거절)
공통 입력 검증 자신의 차례, 대전 진행 중, 보드 내 유효한 칸(64칸 내) 조건 불충족 시 입력을 거절하며 보드 상태 및 횟수를 유지
탐색 초기 또는 일반 탐색 단계, 미공개 + 마커 없음 + 자신의 지뢰 없음 상대 지뢰가 없으면 해당 1칸을 공개하고 지뢰 설치 단계로 전환. 상대 지뢰가 있으면 즉시 폭발·패배 처리
지뢰 설치 초기 또는 일반 지뢰 설치 단계, 06장 조건 충족 해당 칸에 자신의 지뢰를 추가하고 인접 숫자를 갱신. 일반 턴에서는 1개 설치 후 턴 종료 대기 단계로 전환
마커(깃발) 설치/제거 일반 턴의 모든 단계 (탐색 전 / 지뢰 설치 중 / 턴 종료 전) 턴당 신규 설치 최대 1회. 제거는 자신의 마커만 가능하며 제거해도 당해 턴 설치 횟수는 반환되지 않음. 자신의 지뢰 위에도 설치 가능
턴 종료 필수 행동(탐색·지뢰 설치) 완료 후 턴 종료 대기 단계 상대 차례의 일반 탐색 단계로 전환, 턴 내 사용 횟수 초기화, 턴 수 +1, 즉시 진행 가능 여부 판정

턴 진행 및 마커 운용 규칙

  • 일반 탐색 진입 시 진행 가능 판정: 일반 탐색 단계에 진입할 때와 탐색 전 마커를 조작한 직후, '즉시 탐색 가능한 후보 칸'과 '자신의 마커를 제거해 확보할 수 있는 후보 칸'을 판정한다. 두 후보가 모두 0개이면 즉시 무승부로 종료된다. 만약 자신의 마커를 제거해 탐색할 수 있는 칸이 남아 있다면 차례와 단계를 유지하여 마커 제거 후 탐색을 이어갈 수 있게 한다(단, 미공개 칸 전체가 마커로 덮인 '전체 마커 봉쇄'는 즉시 무승부가 우선한다).
  • 마커(깃발)를 턴당 1개로 제한한 이유: 마커는 위험 구역을 표시하는 메모 기능인 동시에 상대방의 탐색과 지뢰 설치를 막는 강력한 보드 제어 수단이다. 한 턴에 마커를 여러 개 난립할 수 있게 되면 상대의 행동을 과도하게 봉쇄하여 밸런스가 무너지므로, 신중하게 사용하도록 턴당 신규 설치를 1개로 제한하고 제거 시에도 횟수가 반환되지 않도록 설계했다. (턴이 넘어가도 보드에 설치된 마커는 유지되며, 보드 전체의 누적 보유 상한은 두지 않는다.)
  • 자신의 지뢰 위에도 마커 설치를 허용한 이유: 자신이 매설한 지뢰 위에 마커를 꽂아 상대의 심리를 흔드는 블러핑(심리전) 수단으로 활용할 수 있게 함과 동시에, 만약 내 지뢰가 있는 칸에 마커가 안 꽂히도록 막으면 그 제약 자체가 플레이어의 조작과 판단을 부자연스럽게 묶기 때문에 허용했다.
  • UI 조작 및 CPU 행동 간격(650ms): 보드 입력은 플레이어 차례이면서 팝업이 열려 있지 않을 때만 활성화된다. 탐색 및 지뢰 설치 단계에 진입하면 하단 조작 모드가 자동으로 해당 단계에 맞게 전환되며, 모드를 바꾸는 것만으로는 행동 횟수가 소모되지 않는다. CPU 차례에는 탐색·지뢰 설치·마커 조작·턴 종료의 각 단계를 650ms 간격으로 실행한다. 이는 CPU가 모든 행동을 0초 만에 끝내버리면 플레이어가 상황 변화를 인지하기 어렵기 때문에, CPU의 행동 순서와 보드의 숫자 변화를 눈으로 따라갈 수 있도록 배려한 UX 연출이다(팝업이 열리거나 브라우저 탭이 비활성화되면 타이머 잔여 시간을 보존한 채 일시 정지한다).
05장 Mermaid 도식 4

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

05장 Mermaid 도식 4

위 도식은 일반 턴의 단계 전이를 나타낸다. 자신의 마커를 제거해 탐색 후보를 확보할 수 있는 경우에는 탐색 단계를 유지한다.

온라인 전용: 20초 턴과 마감 처리

상황 서버 처리
초기 안전 탐색 행동마다 20초. 만료 시 다른 공개 칸·지뢰·마커가 없는 유효 안전 칸 1개를 무작위 공개
초기 지뢰 설치 행동마다 20초. 만료 시 미공개·무마커·자기 지뢰 없음 칸에 무작위 1개 설치. 상대 지뢰와 중첩 가능
일반 턴 시작 탐색 진입 시 20초 마감 설정. 탐색·설치·마커를 해도 같은 마감 유지
탐색 전 시간 초과 탐색과 설치를 생략하고 상대 턴으로 전환
탐색만 완료 후 시간 초과 공개 칸은 유지하고 지뢰 설치를 생략하여 교대
탐색·설치 완료 후 시간 초과 지뢰와 숫자·마커를 유지한 채 교대
턴 종료 버튼 탐색·설치를 완료한 단계에서만 가능. 조기 종료 시 상대에게 새 20초 부여
모달·언어 변경·백그라운드·단절 서버 시한은 계속 흐름. 복귀 시 최신 단계와 남은 시간 동기화
마감 시각 이상에 도착한 행동 먼저 시간 초과를 처리하고 옛 턴의 행동을 거절. 재전송도 이전 행동을 중복 적용하지 않음

시간 초과의 HP 감소·점수 차감은 없다. 마커로 사라진 마지막 안전 칸 등은 차례 종료를 기다리지 않고 08장의 온라인 종료 판정을 적용한다. 통신·알람 지연으로 화면 갱신이 늦을 수 있으나 유효성 기준은 서버 마감 시각이다.

06. 지뢰 설치 사양

공통 기본 사양 — 기존 CPU 기준 표·설명을 보존한다. 온라인의 차이는 이 장 끝의 온라인 전용 절을 따른다.

설치 조건 초기 지뢰 설치 (오프닝) 일반 턴 지뢰 설치
현재 차례 및 지뢰 설치 단계 필수 필수
미공개 칸 필수 필수
마커(깃발) 없음 필수 필수
자신의 지뢰 없음 필수 필수
상대의 지뢰 없음 불필요 (중첩 설치 가능) 불필요 (중첩 설치 가능)
설치 수량 양측 각 1개 턴당 1개

지뢰 중첩 허용 및 심리전 설계 의도

  • 상대 지뢰가 있는 칸에도 중첩 설치를 허용한 이유: 지뢰를 매설할 때 만약 상대방의 지뢰가 이미 있는 칸에 설치가 거절(설치 불가)된다면, 플레이어가 이곳저곳 설치를 시도해 보는 것만으로도 상대 지뢰의 위치를 공짜로 알아낼 수 있는 허점이 생긴다. 이를 방지하기 위해 상대 지뢰 유무와 상관없이 미공개 + 마커 없음 + 자신의 지뢰 없음 조건만 만족하면 같은 칸에 양측의 지뢰가 겹쳐(중첩) 설치될 수 있도록 설계했다(한 번 설치한 지뢰는 회수할 수 없다).
  • 숫자 변화를 통한 중첩 간접 추리: 상대의 지뢰가 이미 있는 칸에 내 지뢰를 겹쳐 설치하더라도 시스템 안내 문구는 일반 설치와 동일하게 표시되며 중첩 여부를 직접 알려주지 않는다. 다만 04장의 규칙에 따라 '인접한 공개 칸의 숫자가 증가하지 않는 현상'이 화면에 그대로 반영되므로, 플레이어는 숫자 변화를 관찰해 "내가 방금 지뢰를 놓은 칸에 이미 상대의 지뢰가 깔려 있었다"는 사실을 역으로 추리할 수 있다.
  • 단계 전환 규칙: 오프닝의 초기 지뢰 설치에서는 플레이어가 설치를 마치면 즉시 CPU 차례로 넘어가고, CPU가 초기 지뢰를 설치하면 플레이어의 1턴째 일반 탐색으로 진입한다. 일반 턴 지뢰 설치 후에는 같은 차례의 턴 종료 대기 단계로 전환되며, 플레이어가 마커 관리 등을 마친 뒤 직접 '턴 종료' 버튼을 눌러야 차례가 넘어간다(중첩된 칸도 양측의 누적 지뢰 설치 수에 각각 가산된다).

온라인 전용 보충

설치 셀 조건과 중첩 시 숫자 계산은 위 표와 동일하다. 타이머에 의한 초기 자동 설치도 같은 조건을 사용한다. 일반 턴은 자동 지뢰 설치를 하지 않으며, 설치를 못 마친 채 만료하면 그 행동만 생략한다. 유효 설치 후에도 일반 턴의 남은 시간은 재설정되지 않는다. 서버는 중첩 여부나 상대 설치 좌표를 별도 알림으로 보내지 않는다.

07. 탐색 및 정보 공개 사양

공통 기본 사양 — 기존 CPU 기준 표·설명을 보존한다. 온라인의 차이는 이 장 끝의 온라인 전용 절을 따른다.

선택 칸의 조건 판정 및 처리 결과
자신의 차례가 아님 / 탐색 단계가 아님 / 이미 공개된 칸 / 마커가 있는 칸 / 자신의 지뢰가 있는 칸 입력 거절 (보드 상태 및 행동 횟수 유지)
미공개 + 마커 없음 + 자신의 지뢰 없음 + 상대 지뢰 없음 해당 1칸을 안전 공개하고 탐색 주체를 기록 (숫자 0이어도 주변 자동 연쇄 공개 없음)
미공개 + 마커 없음 + 자신의 지뢰 없음 + 상대 지뢰 있음 탐색한 쪽이 지뢰를 밟아 즉시 패배 (대전 종료)
  • 자신의 지뢰 칸 선택 방지: 화면에 자신이 설치한 지뢰 위치가 항상 표시되므로, 플레이어나 CPU가 자신의 지뢰가 있는 칸을 탐색하는 것은 허용하지 않으며(선택 거절), 진행 가능 후보 산출 조건과 실제 탐색 허용 조건을 동일하게 유지한다.
  • CPU의 탐색 후보 분류: CPU 역시 상대 지뢰의 실제 위치를 몰래 참조하지 않으며, 관측 가능한 숫자 힌트를 바탕으로 탐색 가능 후보를 '안전 확정' / '불확실' / '지뢰 확정'으로 분류해 추리한다(마커를 놓을 수 없는 상태에서 지뢰 확정 후보만 남은 경우에는 인간과 동일하게 해당 칸을 탐색하여 패배한다).
07장 Mermaid 도식 5

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

07장 Mermaid 도식 5

위 도식은 탐색 입력 시의 판정 흐름을 나타낸다. 일반 탐색 단계 진입 시점에 이미 공통 탐색 후보가 모두 소진된 경우에는 입력을 받기 전에 무승부로 종료된다.

온라인 전용 보충

위의 셀 탐색 허용·거절 조건은 온라인에도 적용한다. 자신의 지뢰와 중첩 칸은 탐색 거절이며 상대 단독 지뢰 접촉만 KO다. 서버가 차례·단계·마감·셀 상태를 검증하고, 안전 공개 후에도 실제 안전 탐색 칸이 남아 있는지 즉시 검사한다. CPU용 '후보 소진 시 자기 마커 제거 기회' 대신 온라인은 실제 안전 칸 0개에서 즉시 점수 종료한다. 끝난 뒤 지뢰·마커 전체 공개는 04장, 종료 우선순위는 08장을 따른다.

08. 승패 및 종료 판정 사양

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

판정 우선순위 / 조건 결과 판정 시점 및 세부 기준
지뢰 접촉 (승/패) 상대 지뢰 접촉 시 탐색자 패배 (플레이어 접촉 → 패배 / CPU 접촉 → 승리) 탐색 실행 즉시 판정
전체 마커 봉쇄 무승부 보드의 모든 미공개 칸에 마커(깃발)가 설치된 순간, 마커 제거 가능 여부와 무관하게 즉시 무승부
공통 탐색 후보 소진 무승부 일반 탐색 단계에서 즉시 탐색 가능한 후보 칸이 0개이고, 자신의 마커를 제거해 확보할 수 있는 후보 칸도 0개인 경우
필수 지뢰 설치 불가 무승부 지뢰 설치 단계에서 지뢰를 매설할 수 있는 후보 칸과 자신의 마커를 제거해 확보할 수 있는 후보 칸이 모두 0개인 경우

종료 판정 순서 및 기획 의도

  • 무승부(교착 해소) 규칙의 기획 의도: 양측이 끝까지 지뢰를 밟지 않고 보드를 한계까지 채웠다는 것은 양쪽 모두 훌륭한 수싸움을 펼쳤다는 의미다. 이 상태에서 억지로 우열을 가리기 위해 부가 규칙(예: 마커로 실제 지뢰를 맞힌 개수 비교, 탐색으로 연 칸의 숫자 합계 비교 등)을 추가하면 "룰은 가볍게, 플레잉은 깊게"라는 핵심 지향점을 해치고 규칙이 복잡해진다. 따라서 보드가 완전히 교착된 경우에는 깔끔하게 무승부로 처리하여 "다음 판에서야말로 결착을 내자"는 감정으로 자연스럽게 재플레이(리매치)를 유도했다.
  • '전체 마커 봉쇄' 시 마커 제거를 강제하지 않고 즉시 무승부로 끝내는 이유: 모든 미공개 칸에 마커가 꽂힌 상태에서 억지로 자신의 마커를 지우게 하더라도, 그 직후 할 수 있는 필수 행동은 '탐색'뿐이므로 결국 위험 칸을 억지로 밟아 패배하게 만드는 불합리한 결과가 된다. 또한 마커를 지웠다 다시 꽂는 행위가 반복되며 게임이 영원히 끝나지 않는 무한 루프(교착 지연) 가능성을 원천 차단하기 위해 전체 마커 봉쇄 시점에는 즉시 무승부가 성립하도록 설계했다.
  • 일반 탐색 후보 소진 판정의 세부 흐름:
    1. 모든 미공개 칸에 마커가 꽂혀 있으면 즉시 전체 마커 봉쇄 무승부로 종료한다.
    2. 마커가 없는 탐색 후보 칸(미공개 + 마커 없음 + 자신의 지뢰 없음)이 1칸 이상 남아 있으면 정상적으로 탐색을 진행한다.
    3. 즉시 탐색 가능한 후보 칸이 0개이더라도, 자신의 마커가 꽂힌 칸 중 자신의 지뢰가 없는 칸이 남아 있다면 자신의 마커를 제거해 탐색을 이어갈 수 있도록 현재 차례와 단계를 유지한다(상대방의 마커는 제거할 수 없으며, 자신의 지뢰 위에 꽂은 마커는 제거해도 탐색할 수 없으므로 복구 후보에서 제외한다).
    4. 즉시 탐색 가능한 후보와 마커 제거를 통한 복구 후보가 모두 0개이면 공통 탐색 후보 소진 무승부로 종료한다.
  • 외통수(지뢰 확정 칸만 남은 상황)에서의 승패 귀결: 만약 현재 차례의 행동자가 더 이상 마커를 설치할 수 없는 상태에서(이미 당해 턴 마커를 사용했거나 마커로 봉쇄할 수 없는 상태), 마커가 없는 탐색 후보 칸이 남아 있고 그 칸들이 모두 상대방의 지뢰인 경우에는 인간 플레이어와 CPU 모두 예외 없이 반드시 '탐색'을 수행해 지뢰를 밟고 패배한다. 즉, 상대가 마커로 도망치지 못하게 유도하고 남은 탐색 후보를 모두 내 지뢰로 채워 강제로 밟게 만드는 것은 정당한 승리 수단(외통수)으로 작동한다.
  • 결과 확정 및 재시작 처리: 종료 시 결과와 기록을 고정하고 CPU 행동 타이머를 해제한다. 결과 팝업은 배경·Escape로 닫히지 않지만 보드 보기로 전환할 수 있다. 재시작 확정 시 언어만 유지하고 새 보드·턴·난이도·기록을 준비한다.

온라인 전용: 종료 우선순위와 마커 점수

서버는 유효성 검증 → 행동 적용 → 상대 단독 지뢰 접촉 KO → 속행 불가 → 점수 비교 → 결과 통지 순서로 처리한다. 만료·단절 기한은 행동 적용 전에 서버 시각으로 정산한다. 이미 확정된 KO·점수 결과를 뒤늦은 단절로 바꾸지 않는다.

속행 불가: U = 미공개 AND 마커 없음, S = U 중 실제 지뢰가 없는 칸. S가 0개이면 즉시 종료한다. U 자체가 0개인 경우도 포함하며, 논리적 추론 가능 여부는 사용하지 않는다. 잘못 놓인 마커가 마지막 안전 칸을 막아도 종료하고 자기 마커 제거 기회를 먼저 주지 않는다. 따라서 CPU의 교착 무승부·외통수 규칙과 다르다.

종료 사유 결과 / 점수 적용
상대 단독 지뢰 접촉 (KO) 탐색자 패배. 마커 점수 미적용
안전 탐색 칸 소진 아래 마커 점수 비교, 높은 쪽 승리 / 같으면 무승부
나가기 확인 후 기권 기권자 패배. 점수 미적용
단절 후 한쪽 미복귀 2분 유예 만료한 쪽 패배. 점수 미적용
양쪽 미복귀 양쪽 유예가 모두 끝난 뒤 대전 무효. 무승부와 구분, 점수 미적용

점수 = 종료 시 남아 있는 본인 마커의 정답 수 − 오답 수. 제거한 마커는 포함하지 않고 음수를 허용한다.

본인 마커가 놓인 칸 정답 / 오답 점수
상대 단독 지뢰 정답 +1
양측 중첩 지뢰 정답 +1
자기 단독 지뢰 오답 -1
지뢰 없음 오답 -1

예: 양측 점수가 -1과 -2라면 -1인 쪽이 승리하고 -1과 -1이면 무승부다. 점수는 일반 KO·기권·단절 결과를 뒤집지 않는다.

온라인 전용: 재접속·재대전·보관

  • 서버가 단절을 감지한 시점부터 2분 이내, 같은 기기·브라우저에 저장된 세션 토큰으로 복귀한다. 창/브라우저를 완전히 닫았다 열어도 토큰이 남아 있으면 복귀 가능하다. 단절 중에도 20초 턴은 계속 진행한다.
  • 정상 소켓 종료는 즉시 감지한다. 무통보 단절은 생존 확인 때문에 늦게 감지될 수 있으며, 기기의 실제 단절 순간과 동일하다고 보장하지 않는다. 양쪽 부재는 두 유예가 모두 끝나야 무효다. 한쪽이 이미 만료되고 다른 쪽이 자기 유예 안에 복귀하면 먼저 만료한 쪽이 패배한다.
  • 종료 전 KO·속행 불가가 먼저 확정되면 그 결과를 유지한다. 대전이 이미 끝났다면 복귀는 결과 조회이며 승패를 복구하지 않는다.
  • 재대전은 양측 동의·접속이 필요하며 선후공을 바꾸고 셀·지뢰·마커·횟수·턴·단계·결과·시한을 초기화한다. 방과 좌석 인증은 유지한다. 온라인에는 HP 상태가 없다.
  • 대기방은 생성 후 24시간에 만료, 종료 결과는 각 종료 시각부터 24시간 보관한다. 진행 중 방은 생성 24시간을 이유로 삭제하지 않는다. 이전 결과의 서버 보관 기능은 있으나 과거 결과 목록을 고르는 UI는 없다.

종료 보드 재열람 및 기록

승리·패배·무승부 결과에서 보드 보기 → 결과 보기를 횟수 제한 없이 반복할 수 있다. 새로운 대전을 시작하기 전까지 같은 최종 보드를 유지하며, 열람 중 탐색·설치·마커·턴 종료 입력은 차단한다. 종료된 타이머는 재개하지 않는다. CPU는 기존 자기 시야를 유지하고, 온라인은 종료 후 공개되는 양측 지뢰·중첩·마커 정오를 그대로 표시한다. 이는 최종 보드 확인이며 행동 순서를 재생하는 리플레이가 아니다.

기록 항목 기준
총 진행 턴 수 양측에 부여된 일반 턴 기회를 합산. 결과가 확정된 진행 중인 턴도 포함
턴 예시 선공 첫 턴 → 후공 첫 턴 → 선공 두 번째 턴에서 종료하면 총 3턴
오프닝 안전 공개·초기 지뢰 설치는 일반 턴에 포함하지 않음. 오프닝 중 종료는 0턴
시간 초과 온라인 일반 턴의 시간 초과도 진행 턴에 포함. 미수행 행동을 생략하는 기존 규칙 유지
CPU 경과 시간 게임 시작 버튼부터 게임 로직의 종료 판정까지 실제 경과 시간. 메뉴·백그라운드 체류 포함
온라인 경과 시간 양측 Ready 또는 재대전 동의로 실제 시작한 서버 시각부터 서버 종료 판정 시각까지. 단절·재접속 시간 포함
표시 승리: 3턴 만에 승리 / 승리까지의 시간. 패배: 패배 턴 수 / 대전 시간. 무승부·무효: 총 진행 턴 수 / 대전 시간
시간 표현 초 미만을 버리고 언어별 단위 사용. 예: 2분 34초 / 1시간 2분 15초
기록 고정 결과 화면·보드 재열람 시간을 추가하지 않음. 온라인 재접속도 동일한 서버 기록 복원
이전 버전·미시작 이전 대전의 시작 시각을 알 수 없으면 시간 기록 없음으로 안내. 시작하지 않은 대기방에는 결과 기록을 만들지 않음

CPU의 행동 지연은 메뉴에서 일시 정지되지만, 대전 경과 시간은 실제 흐른 시간이다. 온라인 기록은 클라이언트 현재 시각이나 화면 갱신 횟수로 계산하지 않는다. 기권·단절 패배·양측 단절 무효의 기존 사유와 점수 적용 조건은 유지한다.

09. CPU 행동 사양

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

09.1 인간적인 추리 수준을 모사한 추론 규칙

  • 공정한 시야 기반의 소거법 추론: CPU는 플레이어의 지뢰 위치를 몰래 참조하지 않으며, 오직 현재 보드에 표시된 공개 숫자·자신이 설치한 지뢰 위치·공개 상태·마커(깃발) 상태만을 이용해 추리한다.
    1. 먼저 자신이 매설한 지뢰 칸들을 '지뢰 확정'으로 분류한다.
    2. 각 공개 숫자 칸에 대해, 인접한 미공개 칸 중 이미 지뢰로 확정된 칸 수를 뺀 '남은 지뢰 수'와 아직 판별되지 않은 '미확정 칸 수'를 비교한다.
    3. 남은 지뢰 수가 0이면 인접한 미확정 칸들을 모두 '안전 확정'으로 분류하고, 남은 지뢰 수가 미확정 칸 수와 같으면 인접한 미확정 칸들을 모두 '지뢰 확정'으로 분류한다.
    4. 더 이상 새로운 칸이 분류되지 않을 때까지 위 과정을 반복 순회하며, 끝까지 어느 쪽으로도 확정되지 않은 칸은 '불확실'로 남긴다.
  • 과거 숫자 변화 이력을 기억하지 않게 한 설계 의도: CPU가 이전 턴마다 어느 칸의 숫자가 언제 바뀌었는지까지 완벽히 기억해 역산하는 '무결점 계산기'처럼 행동하면 인간 플레이어가 이기기 지나치게 어려워진다. 따라서 현재 보드에 보이는 정보만으로 소거법을 수행하도록 하여 인간 플레이어의 자연스러운 추리 수준을 모사했다.

09.2 탐색 후보 선택 및 난이도별 오판율 설계

CPU는 즉시 탐색 가능한 후보 칸(미공개 + 마커 없음 + 자신의 지뢰 없음)을 위 추론 결과에 따라 안전 확정 / 불확실 / 지뢰 확정의 세 그룹으로 나누어 행동을 결정한다.

후보 구성 상황 CPU의 탐색 선택 규칙
안전 확정과 불확실 후보가 모두 있음 정상 판단 시에는 안전 확정 후보 중 무작위 선택, 오판 분기 시에는 불확실 후보 중 무작위 선택
안전 확정 후보만 있음 오판 분기가 발생하더라도 안전 확정 후보 중 무작위 선택
불확실 후보만 있음 불확실 후보 중 무작위 선택
지뢰 확정 후보만 있음 (안전·불확실 없음) 마커 사용이 가능하면 지뢰 확정 칸에 마커를 설치하며, 마커를 더 이상 사용할 수 없는 상태라면 지뢰 확정 후보 중 1칸을 탐색하여 패배(외통수)
즉시 탐색 가능한 후보가 0개 자신의 마커를 제거해 확보할 수 있는 후보가 있으면 마커를 제거하고, 없으면 공통 탐색 후보 소진 무승부
난이도 일반 탐색 시 오판 확률 (안전 확정 대신 불확실 선택)
쉬움 40%
보통 20%
어려움 5%
  • 난이도를 '판단 실수(오판) 확률'로 설계한 의도: 솔로 모드를 최대한 실제 인간과의 대전에 가까운 감각으로 플레이할 수 있도록 설계했다. 이 게임에서 패착은 결국 모두 '판단 실수'에서 비롯된다. 또한 "최고 난이도를 클리어하지 못하면 대인전에서도 사람을 이기지 못한다"고 느끼는 플레이어 심리를 고려했다. 실제로 아무리 숙련된 사람이라도 낮은 확률로 판단 실수를 할 가능성이 있기 때문에, 솔로 모드의 성공 체험(클리어 성취감)과 대인전에 가까운 환경 구축을 위해 최고 난이도(어려움)에서도 0%가 아닌 5%의 오판율을 남겨두었다. (※ 표의 확률은 안전 확정 칸 대신 불확실 칸을 고르는 분기 확률이며 승률이 아니다. 오프닝의 첫 안전 탐색에는 오판 분기를 적용하지 않는다.)
09장 Mermaid 도식 6

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

09장 Mermaid 도식 6

위 도식은 CPU의 탐색 단계 의사결정 흐름을 나타낸다. 전체 마커 봉쇄 여부는 공통 진행 판정에서 가장 먼저 확인한다.

09.3 지뢰 설치 가중치 및 마커 운용

  • 지뢰 설치 위치 가중치 (60% / 25% / 15%):
    • CPU는 지뢰 설치 가능 후보(미공개 + 마커 없음 + 자신의 지뢰 없음) 중에서 ① 전체 후보 무작위(60%), ② 플레이어가 직전에 안전 탐색한 칸의 인접 주변(25%), ③ 이미 열린 공개 칸들의 인접 주변(15%) 비율로 목표 구역을 선택한다(선택된 국소 구역에 후보가 없으면 전체 후보로 복귀하며, 초기 지뢰와 일반 지뢰 모두 상대 지뢰와의 중첩 설치가 가능하다).
    • 설계 의도: 100% 완전 무작위로 지뢰를 매설하는 것은 합리적인 플레이어의 행동 패턴이 아니기 때문이며, 플레이어가 방금 연 칸이나 이미 열린 숫자 칸 주변에 지뢰를 심어 숫자 변화를 통한 심리전과 압박감을 체감할 수 있도록 가중치를 배분했다.
  • 마커(깃발) 설치 확률 (70%)과 인간의 '놓침' 구현:
    • 턴 종료 전(턴 종료 대기 단계) 당해 턴의 마커 설치 횟수가 남아 있다면, CPU는 70% 확률로 추론상 상대 지뢰로 확정한 칸(미공개 + 마커 없음 + 자신의 지뢰 없음) 중 1곳에 마커를 설치한 뒤 턴을 마친다(해당하는 후보가 없으면 생략하고 즉시 턴을 종료한다).
    • 설계 의도: 지뢰 확정 칸을 발견했을 때 100% 매번 마커를 꽂지 않고 70% 확률을 둔 것은, 인간 플레이어가 확신하는 칸이 있어도 간혹 마커 표시를 깜빡하거나 놓치는 자연스러운 모습을 구현하기 위함이다.

온라인 적용 범위: 이 장의 AI·난이도·60/25/15 설치 가중치·70% 마커 확률은 CPU 대전에만 적용한다. 온라인에서는 두 사람이 직접 행동하며 서버는 합법성·시간·승패만 판정한다. 온라인 오프닝 시간 초과의 무작위 자동 행동은 CPU 추리 AI나 플레이어 대체 봇이 아니다.

10. UI 및 조작 사양

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

단일 화면 및 모바일 기준 UI 설계 의도

최대한 가볍게 구동되는 환경과 직관적인 조작을 목표로, 별도의 타이틀 씬으로 화면을 전환하지 않고 단일 보드 화면 위에 팝업(모달)을 올리는 구조로 설계했다. 웹·모바일 어디서든 접속 즉시 한 손으로 빠르게 한 판을 즐길 수 있도록 모바일 세로 화면을 기준으로 레이아웃을 구성했으며, PC(데스크톱) 환경에서도 시선 이동과 마우스 동선이 짧아 쾌적하게 플레이할 수 있도록 동일한 모바일 웹 UI 규격을 활용한다.

화면·영역 구성 요소 및 입력 동작 및 반응 사양
최초 언어 선택 팝업 Select Language 및 4개 언어 버튼 선택 즉시 언어 설정을 저장하고 시작 규칙 팝업으로 이동 (배경 클릭·Escape 닫기 불가)
시작 규칙·난이도 팝업 규칙 안내 본문, 난이도 3종, 게임 시작 버튼 선택한 난이도를 적용하고 대전을 시작 (배경 클릭·Escape 닫기 불가)
상단 정보 영역 (HUD) 타이틀, 메뉴(☰) 버튼, 현재 턴·진행 단계·난이도·양측 누적 지뢰 수·마커 잔여 횟수 메뉴 버튼 외에는 현재 대전 상태를 실시간으로 표시
메인 보드 영역 8×8 (64칸) 그리드, 숫자, 내 지뢰 아이콘, 양측 마커(깃발) 하단에서 선택된 조작 모드를 클릭/터치한 칸에 실행
범례 및 상태 안내줄 양측 탐색 색상·마커 색상 범례, 현재 단계 및 조작 결과 안내 문구 현재 차례·단계 및 직전 조작 결과를 텍스트로 피드백
하단 조작 버튼 바 탐색 / 지뢰 설치 / 마커 설치 / 마커 제거 / 턴 종료 현재 단계와 잔여 횟수에 따라 활성화 상태 갱신. 모드 선택 후 보드 칸을 눌러 실행
메뉴 팝업 (☰) 규칙 보기 / 재시작 / 언어 변경 / 닫기 선택한 하위 팝업 1개로 전환. 배경 클릭 또는 Escape로 게임 복귀 가능
진행 중 규칙 보기 시작 시와 동일한 규칙 설명 본문 및 닫기 버튼 진행 중이므로 난이도 선택 영역은 표시하지 않음. 배경 클릭·Escape로 복귀 가능
재시작 확인 팝업 진행 상황 초기화 안내, 취소 / 재시작 버튼 취소·배경 클릭·Escape 시 현재 대전 유지, 확정 시 초기화 후 시작 규칙 팝업으로 이동
진행 중 언어 변경 4개 언어 선택 버튼(현재 언어 표시) 및 닫기 버튼 진행 중인 보드·턴·난이도를 그대로 유지한 채 화면 전체 문구를 즉시 전환
결과 팝업 승패·사유·총 턴 수·대전 시간, 보드 보기 / 재시작 / 메뉴 보드 보기로 전환, 보드 직하의 결과 보기로 복귀. 재시작은 확인 창을 거침
업데이트 안내 팝업 신규 버전 감지 안내, 나중에 / 업데이트 버튼 실행 버전보다 새로운 버전만 안내. 나중에 선택 시 현재 플레이를 유지하고 같은 세션에서 해당 버전의 재안내를 생략. 업데이트 선택 시 ?v=새버전 URL로 이동하며, 새로고침 후 대전은 새 게임으로 시작

팝업 내부 본문을 스크롤하거나 드래그하다가 손가락/마우스가 팝업 밖으로 나간 경우에는 실수로 팝업이 닫히지 않도록, 누르기 시작과 떼기 지점이 모두 팝업 바깥일 때만 외부 닫기로 처리한다. 또한 화면에는 항상 최대 1개의 팝업만 표시한다.

화면 구성 예시

번호 화면 구분 주요 확인 요소
① 시작 규칙 및 난이도 선택 규칙 설명 본문, 3단계 난이도 선택, 게임 시작 버튼
② 대전 진행 보드 상단 상태 표시, 양측 탐색 색상 구분, 내 지뢰 아이콘 및 하단 조작 바
③ 인게임 메뉴 규칙 다시 보기, 재시작, 언어 변경 메뉴
④ 패배 결과 화면 지뢰 폭발 위치(!) 표시, 결과 팝업 및 보드 추가 입력 잠금
⑤ 무승부 결과 화면 무승부 종료 사유 안내 및 재시작/메뉴 동선

기존 캡처는 v0.2.1-web의 UI 배치 참고이며 신규 규칙·결과 검증 자료가 아니다.

화면 ②: 공개판 한국어 보드

320×568 모바일 세로 화면 기준의 레이아웃 예시 이미지다.

온라인 전용 화면과 조작

화면 / 요소 입력 표시·응답
CPU의 ☰ 메뉴 온라인 대전 별도 online.html로 이동. 기존 CPU 한 판을 온라인 상태로 이식하지 않음
온라인 대기실 방 생성 / 코드 입력·참가 최대 2석, 상대 접속과 Ready 상태. 이미 찬 방은 참가 거절
초대 URL 초대 링크 복사 같은 online.html?room=방코드. 토큰 없음. 복사 실패 시 URL을 화면에서 확인 가능
준비 각자 Ready 한 사람만 준비하면 대기. 양측 준비·접속이면 시작
온라인 HUD 상태 조회 내/상대 차례, 단계, 양측 지뢰 수, 마커 잔여, 서버 기준 남은 초, 접속·준비·재대전 상태
보드와 행동 버튼 탐색 / 설치 / 마커 / 제거 / 턴 종료 내 차례·합법 단계·연결·응답 대기·모달·시한에 따라 활성/비활성
규칙 / 언어 select 규칙 열기·닫기 / 언어 변경 보드 입력만 잠금. 규칙 창 중에도 서버 턴·상대 행동은 계속됨
단절 / 재접속 자동 재시도 / 재접속 버튼 최신 서버 시야와 남은 시간 복원. 만료·좌석 교체 등 오류 표시
나가기 / CPU 대전으로 확인 후 나가기 대전 중 기권 확정 후 이동. 오프라인 상태에서는 기권 전송 불가
결과 영역 결과 조회 / 재대전 동의 양측 지뢰·중첩·마커 정오, 사유, 승패/무효. 속행 불가일 때 점수·정답·오답 수

온라인은 CPU와 같은 결과 모달이 아니라 화면 안 결과 영역과 상단 결과 안내를 사용한다. 턴 제한시간은 남은 초로, 종료 기록은 분·초 등 자연어 단위로 표시한다. 대기실·진행 화면은 v0.3.0의 배치 참고이며, 아래 신규 결과 화면은 v0.3.1 기준이다.

화면 한국어 자료 확인 요소
대기실 방·초대·Ready 방 코드, 초대 링크, 접속·준비
대전 20초 턴과 보드 차례, 시한, 자기 지뢰, 탐색 색
결과 KO 결과와 전체 지뢰 결과 사유, 내/상대 지뢰, 재대전

온라인 대전 공개 화면·한국어

최종 보드와 결과 화면의 이동

  • CPU: 결과 팝업에 보드 보기·재시작·메뉴를 제공한다. 보드 보기로 팝업을 닫고, 보드 바로 아래의 결과 보기로 같은 팝업을 연다. 재시작은 기존 확인 창을 거친다.
  • 온라인: 기존 화면 내 결과 영역을 접고 보드 바로 아래의 결과 보기로 복원한다. 보드 열람 중 재대전 동의는 숨기며 결과 화면으로 돌아오면 다시 제공한다.
  • 종료 사유와 기록은 유지된다. 새로운 대전이 시작되면 이전 열람 상태를 초기화한다.

CPU 결과: 턴 수·소요 시간과 보드 보기

CPU 종료 보드: 입력 잠금과 결과 보기

온라인 결과: 전체 지뢰 공개와 대전 기록

온라인 종료 보드: 결과 화면 복귀

위 네 화면은 공개 v0.3.1-web의 실제 UI다. 종료 정보 공개 범위는 04장, 기록 집계 기준은 08장을 따른다.

11. 다국어 및 반응형 레이아웃 사양

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

항목 사양 내용
지원 언어 (4개 국어) 한국어(ko), 일본어(ja), 영어(en), 중국어 간체(zh-CN)
언어 설정 유지 선택한 언어는 브라우저에 저장되어 재접속 시에도 유지됨 (대전 진행 상태와 난이도는 세션마다 초기화)
실시간 언어 전환 대전 도중 언어를 변경해도 현재 보드·턴·난이도·숫자 상태는 그대로 유지되며, 모든 UI 텍스트와 상태 안내만 즉시 해당 언어로 전환됨
모바일 세로형 기준 레이아웃 최대 폭 480px 기준의 세로형 단일 컬럼 레이아웃으로 모바일 한 손 조작과 PC 웹 플레이를 동시에 지원
보드 크기 자동 조절 기기의 화면 폭과 상·하단 UI를 제외한 남은 높이에 맞춰 8×8 보드 한 변의 크기를 224px ~ 452px 범위에서 자동으로 조절
화면 높이별 컴팩트 대응 세로 높이가 작은 화면(660px 이하)에서는 여백과 조작 버튼 높이를 축소(최소 36px)하여 한 화면에 들어오도록 조정하고, 여유 있는 화면(780px 이상)에서는 조작 버튼 높이(48px)와 여백을 넓혀 터치 편의성을 확보
폰트 구성 별도의 무거운 외부 웹폰트를 다운로드하지 않고 각 OS의 기본 한·일·중(CJK) 시스템 폰트를 사용하여 초기 로딩 속도를 경량화
신규 버전 업데이트 안내 접속 시, 화면에 보이는 동안 60초 간격, 탭 복귀 시 version.json을 cache: 'no-store'로 확인. 숫자.숫자.숫자-web 형식의 안전한 정수 3개를 앞자리부터 비교하여 실행 버전보다 새로운 경우에만 안내하며, 같은 버전·이전 버전·잘못된 값은 안내하지 않음. 다른 팝업이 열려 있으면 닫힌 뒤 업데이트 안내를 표시하며 강제 이동하지 않음
업데이트 후 HTML 캐시 안정화 현재 실행 버전과 v 쿼리가 일치하는 프로젝트 기본 URL 또는 index.html로 진입한 경우에만, 쿼리·해시를 제거한 같은 출처의 프로젝트 기본 URL을 cache: 'reload'로 1회 요청. 성공한 HTML 응답의 본문 수신 완료까지 기다려 기본 URL 재방문 시 구버전 HTML이 재사용될 가능성을 줄임. 일반 기본 URL 접속에서는 별도 갱신 요청을 하지 않으며 Service Worker는 사용하지 않음

온라인 전용: 언어·반응형·설정 유지

온라인도 ko / ja / en / zh-CN과 같은 언어 저장값을 사용한다. 직접 접속 시 저장 언어가 없으면 한국어로 표시하고 상단 select에서 변경한다. CPU의 최초 언어 선택 모달을 온라인에도 자동 표시하는 것은 아니다. 변경해도 보드·차례·시한·결과·재대전 동의를 유지한다.

온라인 보드는 화면 폭에 맞춰 최대 390px로 표시하고 행동 버튼은 최소 44px, 작은 세로 화면은 스크롤을 허용한다. Safe Area·CJK 시스템 폰트를 사용한다. CPU의 한 화면 높이 맞춤 규격과 구분한다.

세션 토큰은 같은 브라우저 저장소에 보존하며 초대 URL에 넣지 않는다. 저장소가 차단되면 온라인 참가·복귀 불가 안내를 표시하고 CPU 이동을 제공한다. 서버의 24시간 보관은 영구 저장·다른 기기 로그인 기능이 아니다.

두 진입 페이지의 CSS/ES Module 의존성 모두 콘텐츠 해시를 사용하고 이전 해시 자산도 유지한다. 다만 기존 60초 새 버전 감지·업데이트 안내·HTML 캐시 보정은 CPU 페이지에만 연결되어 있다. 온라인 페이지에 동일한 업데이트 팝업이 구현됐다고 해석하지 않는다. Service Worker는 없다.

결과의 보드 보기·결과 보기·턴 수·소요 시간도 네 언어로 표시한다. 예를 들어 같은 154초는 한국어 2분 34초, 일본어 2分34秒, 영어 2m 34s, 중국어 간체 2分34秒로 표현한다. 언어를 바꿔도 기록 원본은 유지한다.

12. 예외 처리 사양

CPU 대전 — 온라인 전용 규칙은 해당 절과 구분한다.

예외 상황 시스템 및 UI 처리 규칙
유효하지 않은 칸 선택 (이미 열린 칸·마커 칸·내 지뢰 칸 탐색, 타인 마커 제거, 단계에 맞지 않는 입력 등) 입력을 거절하고 보드 상태와 잔여 행동 횟수를 그대로 유지하며, 상단 안내줄에 불가 사유를 표시
일반 탐색 단계에서 즉시 탐색 가능한 후보가 0개이나, 자신의 마커를 제거해 탐색할 수 있는 칸이 있는 경우 즉시 종료하지 않고 현재 차례·단계·사용 횟수를 유지하여 자신의 마커를 제거하고 탐색을 이어갈 수 있는 기회를 부여 (단, 모든 미공개 칸이 마커로 덮인 '전체 마커 봉쇄'는 즉시 무승부 우선)
일반 탐색 또는 지뢰 설치 단계에서 후보 칸과 자신의 마커 제거를 통한 복구 후보가 모두 0개인 경우 더 이상 유효한 행동을 수행할 수 없으므로 즉시 무승부로 대전을 종료
CPU 차례·팝업 표시 중·대전 종료 후의 플레이어 보드 입력 보드 입력을 비활성화하고 모든 클릭/터치 요청을 차단하여 오조작을 방지
CPU가 행동 중인 도중에 메뉴를 열거나 재시작을 실행한 경우 메뉴가 열려 있는 동안에는 CPU 행동 타이머를 일시 정지하며, 재시작 확정 시에는 진행 중이던 이전 CPU 타이머를 완전히 폐기하고 새 세션을 시작
빠른 연속 터치(연타) 입력 매 입력 시점마다 변경된 현재 단계를 기준으로 유효성을 즉시 재검증하여, 한 번의 연타로 다음 단계 행동까지 의도치 않게 실행되는 현상을 방지
브라우저 저장소 제한 또는 버전 확인 통신 실패 저장소 접근이 제한된 환경(시크릿 모드 등)이나 일시적인 네트워크 오류 발생 시에도 에러로 게임이 멈추지 않고 현재 세션 내에서 정상적으로 플레이를 지속
오프라인 및 업데이트 확인 실패 navigator.onLine === false이면 버전 확인·HTML 갱신 요청을 생략. 버전 확인은 중복 실행을 막고, 통신 실패·5초 타임아웃·잘못된 버전 데이터가 발생해도 이미 로드된 게임을 유지. HTML 갱신은 요청을 시작하면 성공 여부와 무관하게 해당 페이지에서 재시도하지 않으며, 오프라인으로 생략한 경우에는 첫 online 이벤트에서 다시 시도. 오프라인 신규 접속을 보장하는 기능은 아님
캐시 갱신의 적용 범위 새 코드가 실행되어야 적용되며, 이미 열린 구버전 탭·방문 기록·BFCache를 소급 삭제하지 않음. 오프라인·타임아웃·갱신 완료 전 이동·CDN 구버전 응답·브라우저 캐시 비저장 정책·별도의 index.html 캐시 키 등에서는 최신 HTML 재사용을 보장하지 않음

온라인 전용: 예외 처리

상황 처리
잘못된 차례·단계·좌표·자기 지뢰·마커 거절하고 판 상태·행동 횟수 유지. 서버 시한은 계속됨
응답 대기 중 연타 클라이언트는 추가 명령을 막고 서버는 중복 ID/순번을 검증. 같은 요청을 재전송해도 두 번 적용하지 않음
옛 대전·옛 턴·오래된 상태 요청 거절하고 최신 snapshot으로 동기화. 재대전 보드에 이전 요청을 적용하지 않음
마감과 탐색 요청 경합 먼저 지난 마감을 정산. 마감 이전에 성공 처리한 행동은 유지
브라우저 백그라운드 / 모달 게임을 일시 정지하지 않음. 복귀 시 서버 시간·현재 상태 재동기화
같은 좌석을 다른 탭에서 접속 마지막 인증 연결이 제어권을 가짐. 이전 연결은 교체 안내 후 중단
저장소 차단 / 토큰 유실 온라인 복귀를 보장할 수 없음. 유실 토큰을 방 코드로 재발급·우회하지 않음
네트워크 오류 / 무료 서버 한도 초과 연결 오류·재시도 안내. 유료 자동 전환 없음. 진행 대전의 단절 규칙은 계속 적용
대기방·결과 보관 만료 방/결과 조회 종료. 새 방 이용 필요
위조·미인증·비정상 메시지 게임 시야 전송 전 인증하고 거절·연결 종료. 다른 사람의 지뢰/좌석 조회 불가

온라인 규칙 모달은 입력 차단만 수행하며, CPU용 '팝업 중 일시 정지'와 구분한다. 실제 네트워크가 끊긴 시점과 서버 감지는 차이가 날 수 있다.

결과 열람 및 기록의 경계 처리

  • 보드와 결과 화면을 전환해도 새 행동으로 취급하지 않으며 기록·마커 횟수를 변경하지 않는다.
  • 종료 보드는 입력을 거절하고, CPU 예약 행동과 온라인 종료 시한을 다시 활성화하지 않는다.
  • 재접속은 같은 서버 결과를 복원한다. 새 대전 식별자가 오면 이전 열람 상태를 초기화해 결과가 섞이지 않게 한다.
  • CPU 재시작은 언어만 유지하고 새 보드·난이도·기록으로 시작한다. 시작하지 않은 대기실에 임의의 기록을 부여하지 않는다.

13. 밸런스 설계 및 검증 기준

난이도와 정보 공정성

난이도는 안전 확정 후보 대신 불확실 후보를 선택하는 확률로 구분한다. 이는 실전 승률이 아니다. CPU의 판단 정보는 인간에게 공개되는 숫자·자기 지뢰·공개 칸·마커로 제한하며, 온라인에서는 서버가 플레이어별 시야를 분리한다.

설계 요소 기준 의도 및 확인 관점
CPU 난이도 쉬움 40% / 보통 20% / 어려움 5% 판단의 불확실성을 조정. 확정 지뢰만 남았을 때의 공통 규칙과 구분
지뢰 설치 전체 무작위 60% / 최근 탐색 주변 25% / 공개 칸 주변 15% 배치 선택의 다양성. 전략 후보가 없으면 전체 후보로 대체
CPU 마커 턴 종료 시 위험 후보에 70% 확률 선택적 방어. 후보가 모두 확정 지뢰일 때는 가능한 마커를 우선하는 별도 규칙 적용
정보 공정성 숨겨진 상대 지뢰를 CPU 판단에 전달하지 않음 난이도를 비공개 정보 접근량으로 차등화하지 않음
교착 처리 CPU 공통 진행 불가 무승부 / 온라인 실제 안전 칸 소진 시 점수 모드마다 정한 종료 기준을 일관되게 적용
결과 경험 종료 보드 반복 열람과 고정 기록 자신의 선택과 성과를 확인할 시간을 제공. 효과를 실측 성과로 단정하지 않음

주요 경계 상황과 기대 동작

상황 기대 동작
지뢰 중첩과 숫자 변화 상대 지뢰와 중첩해도 인접 숫자는 점유 칸당 1. 탐색 색상 유지
마커 제거와 후보 소진 횟수는 회복되지 않음. CPU 복구 기회와 온라인 즉시 점수 종료를 구분
확정 지뢰만 남은 CPU 가능한 마커 설치 우선. 설치 불가 시 실제 탐색 수행
온라인 시간 초과 완료 행동 유지, 미완료 행동 생략 후 교대. 오프닝은 자동 유효 행동
KO·점수·접속 종료 경합 먼저 확정된 결과 유지. 점수는 속행 불가에만 적용
결과·보드 반복 전환 입력 잠금과 같은 기록 유지. 새 대전에서만 초기화
연결 복구·재대전 서버 기록 복원, 새 대전의 기록과 이전 결과 분리
언어·화면 크기 변화 규칙·기록 값 유지, 번역 문구·버튼·도식 접근성 유지

자동 대전 시뮬레이션은 규칙의 종료성과 추론 일관성을 확인하는 보조 수단이며 인간 플레이테스트나 실제 승률의 근거로 취급하지 않는다. 설계 판단을 위한 경계 조건과 사용자 경험의 효과 검증을 구분한다.

14. 구현 범위 및 기술 구조

구분 공개 게임 v0.3.1-web 구현 범위
CPU 대전 기존 8×8·초기/일반 중첩·숫자 갱신·마커·공통 무승부·3난이도·4언어 유지
온라인 1:1 방 코드·초대·Ready·무작위 선공·20초 턴·서버 자동 오프닝·속행 불가 마커 점수
연결·결과 2분 복귀·기권·단절 패배/양측 무효·재대전 선공 교대·24시간 보관·종료 전체 공개
UI 별도 온라인 페이지·타이머·접속 상태·재대전·4언어. CPU 메뉴의 기존 기능 유지
범위 밖 회원 계정·랭킹·영구 전적·행동 재생형 리플레이

현재 대전의 종료 보드와 턴·소요 시간 기록을 제공한다. 영구 전적이나 행동 재생 기능과 구분한다.

기술 부록: 판정 책임과 상태 동기화

온라인은 서버 권위형으로 판정한다. 브라우저가 표시하거나 요청한 내용만으로 실제 지뢰·턴·승패를 확정하지 않는다.

계층 역할 / 공개 범위
GitHub Pages HTML/CSS/ES Modules 배포, 입력·시간 표시·자기 시야 렌더. 실제 지뢰 판정 권한 없음
Cloudflare Worker 요청 진입·허용 Origin 확인·방 연결·기본 비정상 요청 방어
Durable Objects (SQLite) 방별 실제 보드·턴·마감·종료·좌석·요청 이력을 직렬 처리·저장. 별도 객체로 진입 빈도 제한
WebSocket 인증 후 개별 snapshot 전송. 중복·옛 요청 방어, 재연결 시 최신 서버 상태 복원
14장 Mermaid 도식 7

도식을 확대하거나 스크롤하여 확인할 수 있습니다.

14장 Mermaid 도식 7

서버는 실제 지뢰를 보유하고 클라이언트별 공개 정보를 분리한다. 서버에는 토큰 원문 대신 해시를 저장한다. 초대는 방 식별자이며 인증 수단이 아니다. 저장·복구 구조가 있다고 해서 플랫폼 장애나 무제한 동시접속을 보장하는 것은 아니다.

DIAGRAM

도식은 상하좌우로 스크롤할 수 있습니다. Escape로 닫습니다.