눈숨은 눈치 보며 숨바꼭질의 줄임말이에요. 연필, 노트, 테이프 사이에 물건인 척 숨어보고, 술래가 되면 친구를 찾아봐요. PC와 모바일 웹에서 설치나 가입 없이, 마이크를 켜지 않고도 함께할 수 있어요. 혼자라면 AI 친구 3명과 먼저 시작해 보세요.
현재 게임 버전은 0.020입니다. Android에서는 고화질 모루 아이콘을 넣은 **눈숨 테스트 0.020-test**로도 실행할 수 있어요. 이 APK는 PC 서버와 USB 연결이 필요하며, Android 실행·설치 안내에서 준비 방법을 확인할 수 있어요.
- 별명과 난이도만 고르면 AI 3명과 시작하는
AI와 바로 시작 - 자리가 있는 공개 대기실로 들어가는 4~10명 빠른 매칭
- 새 대기실을 연 뒤 방장이 쉬움·보통·어려움 AI를 한 명씩 추가·삭제하는
방 만들기 - 사람과 AI를 합쳐 최대 10명까지 참여하는 대기실, 초대 링크·코드 참가와 게임 시작 전 채팅
- 3라운드마다 바뀌는
밤의 문구점,달빛 물류창고,별빛 포장공방 - 이동 공백을 줄인 밀집형 맵, 다양한 구조물과 양방향 문·포탈 이동
- 숨는 팀 · 틈새정령은 감춘 채 술래 · 밤지기만 기준 배치를 미리 탐색하는 기억 단계
- 이동 입력을 완전히 막는 위치 고정, 맵 전체 같은 종류 중 무작위 1회 자리바꿈, 진열 미션과 관찰 렌즈
- 경기 중 자유 채팅 대신 사용하는 역할별 팀 신호
- 숨는 팀 · 틈새정령 6.5·술래 · 밤지기 9.5의 빠른 이동, 약 46% 추격 우위와 프레임 연속 로컬 이동·30Hz 서버 좌표 시간 보간
- 직전 라운드에 술래였던 이용자를 연속 배정하지 않는 역할 순환과 20점 단위 생존 점수
- 소개 화면의 귀여운 모루는 보존하고 실제 경기에서는 어두운 망토·균열 가면·발광 눈을 사용하는 밤지기 외형
- 마우스 드래그·휠로 살피는 기준 배치와 시각적인 마지막 추격 경보
- 역할을 크게 알려주는 10초 역할표, 첫 플레이 말풍선과 마우스·키보드·터치 도움말
- 화면을 넓게 쓰는 경기 맵과 필요할 때 여는 역할 설명·참가자·팀 신호
- 숫자 1·2·3 역할 단축키와 모바일 원형 조이스틱·행동 버튼, 휴대폰 가로 화면 플레이
- 현재 게임 화면 8장과 펼쳐 보는 설명으로 입장부터 결과까지 안내하는 게임 방법 페이지
- 움직임 파문·고정 오라·행동별 색상 효과와 맵마다 다른 바닥·구조물·사물 외형
- 접속한 PC의 현재 IP·호스트명을 자동으로 따르는 같은 네트워크 공유
- 10초 재접속 유예와 방장 이전
- 수색 중 위치를 드러낸 뒤 6초 생존하면 20점을 받는
여기 있었지!도발 - 최종 결과의 내 점수·순위, 같은 방 재경기와 내 결과·초대 링크 복사
- 기본 무음, 선택적으로 켜는 자체 합성 배경음·효과음
패치 버전은 공개 게임 기능의 변화 단위를 0.001처럼 세 자리 숫자로 기록하고, 날짜는 연-월-일에 해당하는 YYYY-MM-DD 형식을 사용합니다. 아래 내용은 내부 작업 기록이 아니라 이용자가 체감할 수 있는 변경 사항을 기준으로 정리했습니다.
- Android 테스트 앱은 휴대전화의 회전잠금을 켜도 가로 화면으로 열려요. 양쪽 가로 방향을 지원해요.
- 모바일 웹은 세로 화면에서 회전 안내를 보여요. 휴대전화를 가로로 돌리면 이어서 조작할 수 있어요.
- 화면 WASD 버튼을 원형 조이스틱으로 바꿨어요. 원하는 방향으로 밀어 움직이고, 조금 밀면 천천히 움직여요.
- 조이스틱 바깥까지 손가락이 움직여도 터치를 유지하고, 손을 떼면 바로 멈춰요. 오른손으로 역할별 스킬이나 사물을 터치할 수 있어요.
- 조이스틱을 누른 채 다른 손가락으로 스킬을 눌러도 실행돼요. 터치 뒤에 생기는 클릭 때문에 스킬이 두 번 실행되지 않도록 처리했어요.
- 위치 고정·발견·화면 전환·연결 종료 때 이전 터치를 초기화해요. 다시 움직이려면 조이스틱을 새로 눌러 주세요.
- 빠른 터치 변화가 이동 신호를 지나치게 많이 보내지 않도록 방향 변경 전송을 제한하고, 시작·정지는 즉시 반영해요.
- 모루 아이콘을 유지한
0.020-testAPK와 게임 방법·모바일 안내를 갱신했어요.
- 숨는 팀은 키보드 위쪽 숫자
1로 위치 고정·해제,2로 자리바꿈,3으로 ‘여기 있었지!’를 사용할 수 있어요. 술래는1로 관찰 렌즈를 켜요. - 채팅이나 별명을 입력하는 중에는 숫자가 게임 행동을 실행하지 않아요. 키를 누르고 있어도 행동이 반복되지 않아요.
- 휴대폰에는 화면 WASD와 역할별 행동 버튼이 보여요. 손가락이 이동 버튼 밖으로 조금 벗어나도 놓을 때까지 이동해요.
- 랜딩과 게임 화면을 좁은 휴대폰 너비에 맞추고, 가로 화면에서는 상하 여백을 줄여 맵과 조작부를 함께 볼 수 있어요.
- 모루 아이콘을 넣은 PC 연결용 Android 테스트 앱을 추가했어요. PC 서버와 USB 연결이 필요한 개발용 APK이며, 설치 안내를 따라 실행해요.
- 앱 아이콘에는 1254×1254 모루 이미지를 사용하고, 모자와 귀가 잘리지 않도록 여백을 뒀어요.
- Android의 상태 표시줄·키보드·내비게이션 영역을 고려해 화면을 배치하고, 가로로 돌려도 게임 화면을 유지해요. 연결에 실패하면 다시 연결하는 버튼이 나와요.
- 게임 방법의 숫자 단축키 설명과 모바일 사진을 새 WASD 화면에 맞췄어요.
- 술래와 겹친 숨는 사물도 클릭할 수 있도록 고쳤어요. 연필 끝과 노트 가장자리도 실제 모양대로 눌려요.
- 움직이는 상대를 확인할 때 짧은 화면·통신 지연을 보완해요. 서버가 최근 0.2초의 이동 위치를 확인하며, 벽과 순간이동 전 이력은 계속 제한해요.
- 이동키를 놓으면 서버의 정지 확인이 올 때까지 마지막 위치와 방향을 유지해요. 좌표 보정 때문에 캐릭터가 반대로 돌아보던 현상도 고쳤어요.
- 경기 중에는 맵을 넓게 쓰고, 자세한 설명과 참가자·팀 신호는 위쪽 버튼으로 열어요. 설명을 열어도 맵 크기는 유지돼요.
- 휴대폰에서도 사물 크기를 유지하고, 이동키와 행동 버튼을 한 화면에서 쓸 수 있도록 배치를 바꿨어요.
- 게임 방법의 안내와 사진을 새 배치에 맞췄어요.
- 게임 이름을 눈숨 · 눈치 보며 숨바꼭질로 바꿨어요. 홈페이지, 게임 화면, 공유 안내와 관련 문서에 새 이름을 반영했어요.
- 첫 화면을 밝고 차분하게 정리했어요. ‘혼자 해보기’와 ‘친구랑 하기’에서 원하는 방식으로 시작해 보세요.
- 역할·미션·도발·연결 안내를 친근하게 다듬고, 실제 조작과 설명을 맞췄어요.
- 게임 방법에 현재 화면 8장을 담았어요. 궁금한 부분만 펼쳐서 볼 수 있어요.
- 결과 화면의 복사 버튼 글자가 더 잘 보이게 고쳤어요.
- 홈페이지에서 실제 플레이 장면, 참여 인원·시간·비용과 혼자/친구 시작 방법을 먼저 확인할 수 있습니다.
- 혼자 플레이·친구와 함께·공개방 찾기를 나눠, 선택한 방식에 필요한 입력만 보여줍니다.
- 게임 중 내 역할과 상태를 맵 위에, 행동 버튼과 이동 조작을 맵 아래에 모았습니다.
- 대기실은 참가자·AI·준비·채팅 중심으로 보여주고, 경기 중 보조 설명은 필요할 때 펼칠 수 있게 했습니다.
- 작은 화면의 글자·버튼·도움말 배치를 보강했습니다.
- 서버가 잠시 지연될 때 이동 신호가 몰려 정상 참가자가 퇴장하던 문제를 줄였습니다. 방향 변경과 키 해제는 즉시 전달하고, 움직이는 동안만 0.2초 간격으로 신호를 보냅니다.
- 포탈 이동 전의 늦은 정지 좌표가 도착 위치를 다시 끌어당기지 않도록 순간이동 순서를 확인합니다.
- 재접속 중 나가기를 누르면 예약된 재연결을 취소하고, 이전 방의 응답이 새 방 화면을 지우지 않게 했습니다.
- 브라우저 저장 공간을 사용할 수 없어도 별명 입력과 방 연결을 계속할 수 있게 했습니다.
- 채팅창에서 WASD·방향키를 입력할 때 게임 이동키가 글자와 커서 조작을 가로채지 않게 했습니다.
- 예기치 않은 연결 종료에는 재입장 안내를 표시합니다.
AI와 바로 시작에서 난이도를 고르면 AI 3명과 바로 출발합니다. 친구방의 인원·AI 관리도 계속 사용할 수 있습니다.- 숨는 팀의
여기 있었지!는 현재 위치를 알리고 6초간 생존하면 20점을 줍니다. 라운드당 2번, 20초 간격이며 잡히거나 연결이 끊기면 보상이 없습니다. - 진열 미션은 수색이 시작된 뒤에만 진행됩니다. 숨기·결과 시간에는 점수를 얻지 않습니다.
- 최종 결과에서 내 점수와 순위를 보고 같은 방에서 재경기하거나 내 결과와 초대 링크를 복사할 수 있습니다.
- 원하는 경우 배경음과 효과음을 켤 수 있습니다. 직접 합성한 소리를 사용하며, 필수 단서는 화면에도 표시합니다.
- 기억 단계의 사물 식별자를 수색 단계와 분리해 식별자 비교만으로 정답을 알아내는 문제를 막았습니다.
- 서버의 시계 갱신을 하나로 정리하고 일반 이동과 정지 보정에 공통 시간 예산을 적용했습니다. AI가 같은 사람을 계속 발견할 때 반응이 미뤄지던 문제도 수정했습니다.
- 대기실·최종 결과의 상태 전송은 최대 초당 5회로 줄였습니다. 실제 이동 판정은 초당 30회를 유지합니다.
- 키를 누르는 동안 화면이 서버보다 조금 앞서 움직인 뒤, 키를 놓을 때 과거 서버 좌표로 끌려가 다른 목적지에서 멈춘 것처럼 보이던 원인을 수정했습니다.
- 키를 놓은 순간 화면에 보이던 좌표를 함께 보내고, 서버가 최대 0.2초의 예측 범위·실제 역할 속도·맵 경계·구조물 충돌을 다시 확인한 뒤 안전한 정지 좌표로 확정합니다.
- 이동 중
위치 고정을 누르면 정지 좌표를 먼저 확정하고 같은 연결 순서에서 고정을 적용해, 화면에서 본 자리와 고정된 자리가 달라지지 않게 했습니다. - 정지·고정 뒤 3.2픽셀 이하의 미세한 서버 좌표 차이에는 캐릭터를 다시 끌어당기지 않으며, 창이 숨겨진 경우에도 눌린 이동키를 즉시 해제합니다.
- 실제 소켓 네 명이 참여한 회귀 검증에 키 해제 좌표, 위치 고정 좌표와 고정 이후 반복 이동 신호 차단을 추가했습니다.
- 선반 모서리를 실제 캐릭터의 원형 충돌에 맞춰 계산하고, 이동 거리를 작은 고정 구간으로 나눠 서버와 화면 주사율이 달라도 같은 경로를 따르게 했습니다.
- 일시적인 긴 프레임의 이동 시간을 버리지 않으며, 서버 좌표 보정도 구조물 충돌 계산을 통과하게 해 선반 안으로 밀려 들어갔다가 튕기는 현상을 막았습니다.
- 현재 키 입력을 과거 서버 좌표에 소급 적용하지 않고 서버가 실제로 확정한 좌표만 기준으로 삼아, 급회전과 방향 전환 때 잘못된 경로가 만들어지지 않게 했습니다.
- 이동 입력 확인 주기를 0.05초로 줄여 키를 누르거나 방향을 바꿀 때의 반응을 빠르게 했습니다.
빠른 매칭은 새 방을 무조건 만드는 대신 자리가 있는 공개 대기실을 찾아 합류하며, 빈자리가 없을 때만 새 공개 대기실을 엽니다.- 별도의 AI 방 선택 없이
방 만들기로 최대 10명 대기실을 열고, 방장이 쉬움·보통·어려움 AI를 필요한 만큼 한 명씩 추가하거나 삭제할 수 있게 했습니다. - 대기실에 텍스트 채팅을 추가해 참가자끼리 인원과 AI 구성을 의논하고 준비 여부를 맞출 수 있습니다.
- 참가자의 연결이 끊기면 시작 준비를 취소하고, 공개방 방장이 재연결되는 동안에는 해당 방을 빠른 매칭에서 잠시 제외한 뒤 재연결 또는 방장 이전에 맞춰 자동으로 다시 엽니다.
- 초대 링크·코드, 참가자 목록, 준비 상태와 AI 관리 기능을 한 대기실 흐름에서 이해할 수 있도록 안내 문구를 정리했습니다.
- 서버와 브라우저가 하나의 하위 단계 충돌 계산을 사용하도록 통합해 선반 모서리에서 안쪽으로 겹쳤다가 튕겨 나오는 현상을 막았습니다.
- 내 캐릭터는 30Hz 서버 좌표가 도착할 때만 움직이는 대신 화면 프레임마다 계속 전진하고, 이동을 멈춘 뒤에만 작은 좌표 차이를 정리하도록 바꿨습니다.
위치 고정을 누르는 즉시 키·터치 입력과 화면 예측을 모두 멈추며, 이동 신호가 반복 수신돼도 명시적으로 고정을 해제하기 전에는 서버 위치가 변하지 않습니다.무작위 자리바꿈은 거리와 관계없이 맵 전체 같은 종류 사물 중 하나를 균등하게 선택하며 라운드당 한 번만 사용할 수 있습니다.- 자리바꿈 도착 위치는 숨는 팀에게만 보여주고, 술래에게는 좌표 없는 사건 문구만 표시합니다. 같은 사물의 식별자도 기존 위치에 남기고 내부 이동 표식을 비식별화해 전후 좌표 비교만으로 정답을 좁히지 못하게 했습니다.
- 별도의 친구방·AI 방 선택을 없애고, 하나의
친구·AI 방 만들기에서 AI 난이도를 고르도록 정리했습니다. 혼자면 AI 세 명이 참여하고 친구가 들어오면 AI가 한 명씩 빠집니다. - 역할 이름과 지금 할 일, 현재 고정 상태, 단계별 말풍선, 버튼 도움말의 글자와 문구를 처음 이용자도 바로 이해하도록 보강했습니다.
- 세 맵의 바닥 문양·구조물 장식·사물 실루엣을 테마별로 구분하고, 움직임 파문·고정 오라·포탈·자리바꿈·정답 효과를 색과 움직임으로 구별했습니다.
- 화면 움직임 감소 설정을 사용하는 이용자에게는 반복 애니메이션 대신 정적인 강조 상태를 제공합니다.
- 게임 좌표는 React 화면 갱신을 기다리지 않고 Phaser가 30Hz 상태를 즉시 받게 하고, 점수·시간 UI는 10Hz로 분리해 불필요한 전체 재렌더링을 줄였습니다.
- 다른 참가자는 시간표가 붙은 좌표 버퍼로 두 서버 틱 사이를 보간하고, 잠깐 늦은 패킷은 최대 두 틱까지만 예측해 이동 간격을 일정하게 만들었습니다.
- 내 캐릭터는 키를 누르는 즉시 서버와 같은 속도·충돌 규칙으로 예측 이동한 뒤 권위형 서버 좌표로 부드럽게 보정합니다.
- 이미 보간된 캐릭터를 카메라가 다시 늦게 따라가던 이중 완화를 없애고 정수 픽셀 반올림도 사용하지 않도록 정리했습니다.
- 기존 혼자 연습을
AI 방으로 확장해 쉬움·보통·어려움 난이도를 선택할 수 있고, 친구가 초대 링크로 합류하면 AI가 한 자리씩 빠져 사람과 AI 합계 네 명을 유지합니다. - AI는 벽 너머의 정답을 아는 대신 난이도별 시야, 반응시간, 라운드 내 기억, 이동속도와 오판률로 순찰·추적·확인·은신·도주·자리바꿈을 판단합니다.
- 사람과 AI를 같은 역할 이력으로 관리해 직전 라운드에 술래였던 이용자는 다음 라운드에 연속 배정하지 않고, 세 라운드에서 역할이 순환하게 했습니다.
- 틈새정령은 승패와 관계없이 수색에서 살아남은 시간 구간에 따라
20·40·60·80점중 하나를 받고, 결과 화면에 이번 라운드 생존 점수가 따로 표시됩니다.
- 숨는 팀 · 틈새정령 이동속도를 5.0에서 6.5, 술래 · 밤지기를 7.8에서 9.5로 높여 두 역할의 이동 공백을 줄였습니다.
- 술래 · 밤지기의 직선 추격 우위는 약 46%로 유지해 숨는 팀도 포탈과 구조물을 활용해 도망칠 수 있게 했습니다.
- 서버 위치 갱신과 입력 전송을 초당 20회에서 30회로 높이고, 키 입력 시작·해제 즉시 방향을 전달하도록 바꿨습니다.
- 좌표 보간 응답을 빠르게 하고 카메라 추적 지연과 정수 픽셀 반올림을 줄여 이동 화면이 뚝뚝 끊겨 보이는 현상을 완화했습니다.
- 실제 경기의 밤지기에게 어두운 망토, 뿔, 균열 가면, 발광 눈과 아바타별 오라 색을 적용했습니다.
- 기존 귀여운 밤지기 모루 디자인은 입장 전 소개 화면에 원본 모습으로 계속 보존합니다.
- 4인 기준 한 라운드를 역할 확인 10초, 숨기·기준 배치 확인 35초, 수색 125초, 결과 10초의 총 180초로 조정했습니다.
- 참가자가 한 명 늘 때마다 수색 시간이 15초 추가되며, 라운드가 시작된 뒤 인원이 바뀌어도 현재 라운드 시간은 갑자기 변하지 않습니다.
- 역할 확인 전에 서버가 역할을 확정해 본인의 역할·승리 조건·첫 행동 세 가지를 큰 화면으로 보여주고, 다른 참가자의 역할과 위치는 숨깁니다.
- 숨는 팀 · 틈새정령 속도는 5.0으로 유지하고 술래 · 밤지기만 7.8로 높여 수색 이동 시간을 줄였습니다.
- 세 맵의 면적을 약 9~10% 줄이고 사물 수와 양방향 포탈 2쌍을 유지해 빈 이동 구간을 줄였습니다.
- 포탈 표시에 도착지 이름을 함께 적어 처음 보는 맵에서도 이동 결과를 예상할 수 있게 했습니다.
- 첫 플레이 말풍선, 항상 다시 열 수 있는 역할 도움말과 스킬별 상세 설명을 추가했습니다.
- 스킬 설명은 마우스 올리기, 키보드 포커스와 모바일 터치를 모두 지원합니다.
- 입장부터 결과까지 실제 멀티플레이 화면을 촬영해 번호 표시와 단계별 설명이 있는 게임 방법 페이지를 만들었습니다.
- Docker 이미지에
localhost게임 서버 주소를 고정하지 않고, 브라우저가 접속한 IP 또는 호스트명을 자동으로 사용하게 했습니다. - 네트워크가 바뀌어 PC의 사설 IP가 달라져도 Docker 이미지를 다시 만들거나 설정 파일의 IP를 수정할 필요가 없습니다.
- 초대 링크도 방장이 실제로 접속한 주소를 기준으로 만들어 친구가 같은 네트워크에서 그대로 열 수 있습니다.
- 게임 서버는
same-host정책으로 같은 IP·호스트의 웹 Origin을 자동 허용하고, 다른 호스트에서 보낸 요청은 거부합니다. - 일반 HTTP 사설 IP에서도 방 입장용 ID 생성과 초대 링크 복사가 동작하도록 브라우저 호환 경로를 추가했습니다.
- 외부 도메인이나 별도 게임 서버를 사용할 때는 기존 환경 변수로 명시적 주소를 우선 적용할 수 있습니다.
- 입장 화면에서 친구가 보낸 초대 코드 또는 전체 초대 링크를 직접 붙여 넣어 방에 참가할 수 있게 했습니다.
- 술래 · 밤지기의 이동속도를 숨는 팀 · 틈새정령보다 30% 빠르게 조정해 추격 역할의 우위를 분명히 했습니다.
- 확인 스티커 재사용 대기를 정답 1.2초, 오답 3초, 집중력 소진 6.5초로 늘리고 남은 시간을 화면에 표시합니다.
- 한 라운드를 카운트다운 3초, 숨기·기억 18초, 수색 55초, 결과 8초로 압축했습니다.
- 술래 · 밤지기가 기준 배치를 전체 보기로 시작해 마우스 드래그로 이동하고 휠로 확대·축소할 수 있게 했습니다.
- 수색 마지막 15초에 붉은 테두리, 점멸 타이머와 문구로 무음 위험 경보를 제공합니다.
- 웹과 게임 서버를 함께 실행하고 두 서비스의 상태를 확인하는
hide_and_seekDocker 컨테이너를 추가했습니다.
- README에 버전별 패치노트와 다음 작업의 완료 조건을 추가했습니다.
- GitHub Actions의 공식 실행 구성요소를
v7계열로 올려 구형 Node.js 실행 환경 경고를 제거했습니다. - CI에 고위험 이상 의존성 취약점 검사를 추가했습니다.
- React
19.2.8, vinext1.0.0-beta.6, Vite8.2.1과 Cloudflare 도구 체인을 보안 수정 버전으로 갱신했습니다. - 현재 의존성 감사 결과가 취약점 0건인지 다시 확인했습니다.
- 라운드별 맵을
밤의 문구점,달빛 물류창고,별빛 포장공방3종으로 확장했습니다. - 맵 크기와 구조물·기본 사물 수를 늘리고 구역을 오가는 양방향 문·포탈을 추가했습니다.
- 술래 · 밤지기가 숨는 이용자를 보지 못한 상태로 기준 배치와 사물 위치를 직접 돌아볼 수 있게 했습니다.
- 술래 · 밤지기도 사전 탐색 중 포탈을 사용할 수 있게 하고, 서버가 숨는 이용자의 위치와 효과를 가리도록 보강했습니다.
- 키보드·터치 이동 속도와 입력 주기를 개선하고 화면 좌표 보간을 적용했습니다.
- 반응형 랜딩·대기실·게임 HUD와 오리지널 캐릭터 표현을 완성했습니다.
- 단위 테스트, 실제 WebSocket 다중 클라이언트 통합 테스트, 린트, 타입 검사와 프로덕션 빌드를 하나의 검증 명령으로 묶었습니다.
- GitHub Actions 자동 검증과 Docker 게임 서버 실행 구성을 추가했습니다.
- 공개 이용자를 위한 실행 방법, 라이선스와 외부 패키지 고지를 정리했습니다.
- 공개 빠른 매칭, 친구 초대방과 서버 봇이 참여하는 혼자 연습 모드를 구현했습니다.
- 서버 권위 이동·충돌·태그·점수 판정과 3라운드 경기 흐름을 구현했습니다.
- 역할별 팀 신호, 사물 고정·자리바꿈, 진열 미션과 관찰 렌즈를 추가했습니다.
- 10초 재접속 유예, 방장 이전과 SQLite 경기 결과 저장을 추가했습니다.
- 음성 대화 없이 즐기는 웹 사물 숨바꼭질이라는 제품 방향을 확정했습니다.
- 숨는 팀 · 틈새정령과 술래 · 밤지기, 수상한 잡화점 세계관을 독립 창작했습니다.
- React·Phaser·Colyseus 기반 웹과 실시간 게임 서버의 기본 구조를 만들었습니다.
- 다른 게임의 코드·캐릭터·맵·문구·에셋을 복제하지 않는 독립 구현 원칙을 세웠습니다.
이 항목의 날짜는 출시 약속이 아니라 작업 기준일입니다. 자동 테스트만으로 판단할 수 없는 재미와 밸런스를 실제 이용자 플레이로 검증하는 것이 다음 우선순위입니다.
- 4~6명이 직접 만든 방에서 세 라운드를 완주하며 숨는 팀 · 틈새정령과 술래 · 밤지기를 모두 경험합니다.
- 사람 1명부터 사람과 AI 합계 10명까지 여러 조합을 만들고, 세 난이도 AI를 섞어서 플레이합니다.
- 빠른 매칭이 자리가 있는 공개 대기실을 우선 찾는지, 방장의 AI 추가·삭제 권한이 다른 참가자에게 열리지 않는지 확인합니다.
- 대기실 채팅의 전송·표시 순서와 길이 제한을 확인하고, 경기 중 팀 신호와 용도가 명확히 구분되는지 살펴봅니다.
- 맵별 발견률, 포탈 이용 횟수, 평균 생존 시간과 중도 이탈 원인을 기록합니다.
- 역할 확인 10초와 사전 탐색 35초가 처음 이용자에게 충분한지 확인합니다.
- 4인 125초부터 1명당 15초씩 늘어나는 수색 시간이 맵 크기와 술래 수에 적절한지 확인합니다.
- 술래 · 밤지기 9.5와 숨는 팀 · 틈새정령 6.5의 속도 차이가 이동 공백은 줄이되 일방적인 추격으로 이어지지 않는지 확인합니다.
- 30Hz 좌표 갱신이 4~10명 환경에서 끊김을 줄이면서 서버 CPU·네트워크 사용량을 과도하게 늘리지 않는지 측정합니다.
- 프레임 연속 로컬 이동과 75ms 원격 보간 지연이 실제 무선 네트워크에서도 순간이동이나 벽 끼임 없이 보이는지 확인합니다.
- 위치 고정 상태에서 키를 계속 누르거나 자리바꿈을 사용해도 고정이 임의로 풀리지 않는지 확인합니다.
- 맵 전체 무작위 자리바꿈이 세 맵과 세 난이도에서 도착지를 충분히 다양하게 만드는지 기록합니다.
- AI 밤지기의 발견률과 AI 틈새정령의 생존 점수가 난이도 순서에 맞게 변하는지 기록합니다.
- 정답 1.2초·오답 3초·집중력 소진 6.5초의 확인 대기가 전수 클릭을 충분히 줄이는지 기록합니다.
- 팀 신호와 모바일 조작만으로 경기 중 협력이 가능한지 확인합니다.
- 재접속, 포탈 연속 진입과 라운드 전환 경계 상황을 실제 네트워크에서 점검합니다.
완료 기준은 치명적인 진행 중단 0건, 세 라운드 완주율 90% 이상, 역할별 승률이 한쪽으로 70% 이상 치우치지 않는 것입니다. 기준을 충족하지 못하면 네 번째 맵이나 결제 기능보다 조작·시간·맵 배치를 먼저 조정합니다.
- Node.js
22.13.0이상, 권장24.x - npm
10이상
git clone https://github.com/antisdream/hide_and_seek.git
cd hide_and_seek
npm ciWindows PowerShell:
Copy-Item .env.example .env.local
npm run dev:allmacOS 또는 Linux:
cp .env.example .env.local
npm run dev:all브라우저에서 http://localhost:3000을 엽니다. 웹은 기본 3000, 게임 서버는 기본 2567 포트를 사용합니다.
두 프로세스를 별도로 실행할 수도 있습니다.
# 터미널 1: 웹
npm run dev
# 터미널 2: 게임 서버
npm run dev:server/game에서 별명을 입력합니다.- 처음이라면 상단
게임 방법을 열어 역할과 조작을 확인합니다. 경기 중에는도움말이나역할·조작 설명을 열 수 있습니다. - 혼자라면
AI와 바로 시작으로 AI 3명과 바로 시작합니다. 친구를 초대하려면친구랑 하기→친구 방 만들기로 최대 10명 대기실을 엽니다. - 방장은 대기실에서 쉬움·보통·어려움 AI를 필요한 만큼 한 명씩 추가하거나 삭제합니다.
- 초대 링크를 친구에게 보내고, 대기실 채팅으로 인원과 AI 구성을 의논한 뒤 각자
준비 완료를 누릅니다. - 링크를 열기 어렵다면 받은 초대 코드나 링크를 입장 화면의
초대 코드로 참가에 붙여 넣습니다. - 공개 이용자와 플레이하려면
공개방 찾기에서공개 대기실 찾기를 선택합니다. 자리가 있는 공개 대기실에 먼저 합류합니다.
| 역할 | 행동 | PC | 모바일 |
|---|---|---|---|
| 공통 | 이동 | WASD 또는 방향키 | 맵 왼쪽 아래 원형 조이스틱 · 방향과 밀어낸 거리로 방향·속도 조절 |
| 숨는 팀 | 위치 고정·해제 | 숫자 1 또는 행동 버튼 |
위치 고정·고정 해제 버튼 |
| 숨는 팀 | 자리바꿈 | 숫자 2 또는 행동 버튼 |
자리바꿈 버튼 · 라운드당 1회 |
| 숨는 팀 | 도발 | 숫자 3 또는 행동 버튼 |
여기 있었지! 버튼 · 수색 중 사용 |
| 술래 | 관찰 렌즈 | 숫자 1 또는 행동 버튼 |
관찰 렌즈 버튼 |
| 술래 | 수상한 사물 확인 | 가까운 사물을 클릭 | 가까운 사물을 터치 |
| 공통 | 참가자·팀 신호 | 상단 참가자·팀 |
상단 참가자·팀 |
숫자 단축키는 키보드 위쪽 숫자 행 기준이며 숫자패드는 지원하지 않습니다. 글을 입력하거나 조합키를 누르는 중에는 실행되지 않으며, 길게 눌러도 행동이 반복되지 않습니다. 역할·단계·사용 횟수·재사용 대기시간에 따라 사용할 수 있는 행동이 달라집니다. 위치를 고정했거나 발견된 뒤에는 이동할 수 없습니다.
모바일은 가로 화면으로 플레이합니다. APK는 회전잠금 설정과 관계없이 가로로 열리고, 모바일 웹은 세로 화면에서 회전 안내를 표시합니다. 조이스틱에서 손을 떼면 즉시 멈추며, 고정·화면 전환 후에는 새로 눌러 이동합니다.
눈숨 테스트는 PC의 웹 3100·게임 서버 2568에 USB로 연결합니다. 위의 기본 웹 실행 포트 3000·2567과 다르므로 Android 안내의 서버 실행 명령을 사용하세요. PC 서버 종료·USB 분리 후에는 다시 연결해야 합니다.
APK는 android/app/build/outputs/apk/debug/app-debug.apk로 빌드됩니다. 소스 저장소에는 APK 바이너리를 포함하지 않으며, 현재 구성은 개발용 테스트 앱입니다.
| 라운드 | 맵 | 특징 |
|---|---|---|
| 1 | 밤의 문구점 | 긴 진열대와 계산대·창고 연결 |
| 2 | 달빛 물류창고 | 상자 더미와 선반 사이의 교차 통로 |
| 3 | 별빛 포장공방 | 작업대와 리본 통로가 나뉜 구조 |
각 맵의 문과 포탈에는 도착지 이름이 함께 표시되며, 들어가면 연결된 다른 구역으로 즉시 이동합니다. 술래 · 밤지기는 숨기 35초 동안 숨는 팀 · 틈새정령을 볼 수 없으며, 전체 기준 배치를 마우스로 이동·확대하거나 직접 포탈을 통과하며 구조물과 기본 사물 위치를 기억할 수 있습니다.
| 역할 | 목표 | 주요 행동 |
|---|---|---|
| 숨는 팀 · 틈새정령 | 수색 종료까지 한 명 이상 생존 | 이동, 위치 고정, 무작위 자리바꿈 1회, 도발 2회, 수색 중 진열 미션, 팀 신호 |
| 술래 · 밤지기 | 제한시간 안에 모든 틈새정령 발견 | 기준 배치 탐색, 포탈 이동, 사물 확인, 관찰 렌즈, 팀 신호 |
| 발견된 틈새정령 | 남은 팀 지원 | 팀 신호 |
4인 한 라운드는 역할 확인 10초, 숨기·기준 배치 확인 35초, 수색 125초, 결과 10초의 총 180초입니다. 5명부터는 참가자가 한 명 늘 때마다 수색 시간만 15초 추가되어 10명에서는 한 라운드가 최대 270초가 됩니다. 숨는 팀 · 틈새정령을 모두 찾으면 남은 시간과 관계없이 결과로 넘어갑니다.
숨는 팀 · 틈새정령은 초당 6.5칸, 술래 · 밤지기는 초당 9.5칸을 이동합니다. 방향 변경과 키 해제는 즉시 전송하고, 움직이는 동안만 0.2초마다 유지 신호를 보냅니다. 서버는 초당 30회 판정하며, 내 캐릭터는 서버와 같은 원형 모서리 충돌 규칙으로 화면 프레임마다 움직입니다. 키를 놓거나 위치를 고정하면 화면의 정지 좌표를 서버가 최대 0.2초 이동 범위와 충돌 규칙 안에서 다시 검사해 확정하며, 3.2픽셀 이하의 미세한 차이는 화면을 다시 끌어당기지 않습니다. 다른 참가자는 서버 시간 기준으로 프레임 사이를 연결합니다. 확인 스티커는 정확한 확인 뒤 1.2초, 잘못된 확인 뒤 3초, 집중력을 모두 쓴 뒤 6.5초 동안 다시 사용할 수 없습니다. 게임 수치의 기준은 shared/game-rules.ts와 shared/input-rules.ts입니다.
수색에서 버틴 시간은 네 구간으로 나눠 20·40·60·80점으로 표시됩니다. 전원 발견 여부와 관계없이 각 틈새정령이 버틴 구간만큼 받고, 틈새정령 팀이 시간 종료로 승리하면 기존 팀 승리 보너스 50점이 별도로 더해집니다.
여기 있었지! 도발은 위치를 공개한 뒤 6초를 살아남으면 20점, 한 라운드 최대 40점입니다. 도발 뒤 이동·자리바꿈을 할 수 있지만 잡히거나 연결이 끊기면 보상은 취소됩니다. 수색 시간이 6초 넘게 남아야 사용할 수 있습니다. 진열 미션은 수색 중 지정 구역에서 2초 고정하면 25점입니다.
| 난이도 | 행동 특징 | 공정성 기준 |
|---|---|---|
| 쉬움 | 반응이 느리고 움직임 단서를 자주 놓치며 오판이 많음 | 사람 역할보다 낮은 이동속도 |
| 보통 | 시야·기억·실수를 균형 있게 사용 | 사람과 비슷하지만 조금 낮은 이동속도 |
| 어려움 | 단서를 빨리 포착하고 오래 추적하며 적극적으로 도주 | 사람 역할의 최고 속도를 넘지 않음 |
방을 만들면 사람과 AI를 합쳐 최대 10명이 참여할 수 있습니다. 방장만 대기실에서 세 난이도의 AI를 한 명씩 추가하거나 삭제할 수 있으며, 친구가 합류해도 AI 구성은 자동으로 바뀌지 않습니다. 참가자들은 대기실 채팅으로 구성을 정한 뒤 준비합니다.
AI는 별도 머신러닝 모델을 훈련하거나 접속자의 데이터를 학습하지 않습니다. 서버에서 현재 라운드의 시야 안 단서와 짧은 기억만 사용하는 행동 AI이므로, 화면 밖이나 선반 너머에 숨은 정답 위치를 미리 알 수 없습니다. 사람과 AI는 같은 역할 순환·점수 규칙을 사용하며, 세부 프로필은 shared/ai-rules.ts에 있습니다.
- React 19 및 vinext 기반 웹 화면
- Phaser 기반 2D 게임 렌더링
- Colyseus 기반 실시간 멀티플레이
- 서버 권위 이동·충돌·시야·태그·점수 판정
- SQLite 경기 결과 저장
- TypeScript, ESLint, Node.js Test Runner
- Java Activity·Android WebView 기반 PC 연결 테스트 앱
| 경로 | 역할 |
|---|---|
app/ |
랜딩, 게임 입장, 대기실과 HUD |
app/game/game-renderer.ts |
맵, 캐릭터, 사물과 효과 렌더링 |
server/NunchisoomRoom.ts |
방 생명주기와 게임 판정 |
server/index.ts |
게임 서버와 상태 확인 API |
server/persistence.ts |
SQLite 결과 저장 |
shared/ |
웹과 서버가 공유하는 타입과 규칙 |
shared/ai-rules.ts |
AI 세 난이도의 시야·반응·기억·속도·오판 균형 |
shared/action-shortcuts.ts |
역할별 숫자 단축키와 사용 가능 조건 |
shared/map-generator.ts |
3개 맵, 구조물·사물 배치와 포탈 연결 |
tests/ |
단위 및 멀티플레이 통합 테스트 |
android/ |
모루 아이콘·WebView 앱·빌드와 지정 기기 설치 스크립트 |
필요한 값은 .env.example을 복사해 설정합니다.
| 이름 | 기본값 | 설명 |
|---|---|---|
NEXT_PUBLIC_GAME_SERVER_URL |
비어 있음 | 비우면 현재 웹 호스트의 2567 포트를 자동 사용하며, 별도 포트나 외부 게임 서버를 사용할 때 전체 주소 입력 |
NEXT_PUBLIC_SITE_URL |
http://localhost:3000 |
웹 기준 주소 |
GAME_PORT |
2567 |
게임 서버 포트 |
GAME_HOST |
0.0.0.0 |
게임 서버 바인딩 주소 |
ALLOWED_ORIGINS |
same-host |
같은 IP·호스트의 웹 Origin 자동 허용 또는 쉼표로 구분한 명시적 Origin 목록 |
FAST_GAME |
0 |
1일 때 개발용 짧은 라운드 사용 |
비밀값, .env.local, 로컬 데이터베이스는 Git에 포함하지 않습니다.
npm run verify이 명령은 린트, 엄격한 TypeScript 검사, 단위 테스트, 실제 WebSocket 다중 클라이언트 통합 테스트와 프로덕션 웹 빌드를 순서대로 실행합니다.
GitHub Actions에서는 위 검증에 더해 npm audit --audit-level=high로 고위험 이상 의존성 취약점을 검사합니다.
0.020 변경의 2026-09-08 로컬 검증 결과는 다음과 같습니다.
| 범위 | 확인 결과 |
|---|---|
| 웹 자동 검사 | 단위 79개·통합 24개, lint·타입 검사·프로덕션 빌드 통과. 조이스틱 방향·속도·다중 포인터 소유권·전송 제한·재터치·스킬 합성 클릭 중복 방지 회귀 포함 |
| 기존 PC 조작 | 숫자 1·2·3과 술래 렌즈 단축키 회귀 테스트 통과. 이전 버전에서 확인한 실제 브라우저 조작 범위는 유지 |
| Android 빌드 | assembleDebug·lintDebug 통과. lint 오류 0·경고 9, APK 서명·정렬 검사 통과 |
| Z Flip4 · Android 16 | 0.020-test 업데이트 설치, 회전잠금 상태의 가로 실행, 가로 입장 화면·역할 안내, 조이스틱 대각선 이동·원 밖에서 손떼기·고정·두 손가락으로 이동 중 자리바꿈 확인 |
GitHub CI는 웹 검증입니다. 여러 휴대폰·외부망·장시간 플레이와 스토어 배포는 추가 검증이 필요합니다. Android 실기기의 확인 범위는 앱 안내에 정리했습니다.
개별 명령은 다음과 같습니다.
npm run lint
npm run build:server
npm run test:unit
npm run test:integration
npm run builddocker compose up --build -d컨테이너 이름은 hide_and_seek이며 다음 주소를 함께 엽니다.
- 웹 게임:
http://localhost:3000 - 게임 서버 상태:
http://localhost:2567/health
같은 공유기·사내망에 있는 사람에게는 ipconfig에서 기본 게이트웨이가 있는 어댑터의 IPv4를 확인한 뒤 http://<현재 IPv4>:3000/game 형식으로 공유합니다. 예를 들어 IP가 192.168.0.41이면 http://192.168.0.41:3000/game입니다. IP가 바뀌면 새 IP로 접속 링크만 다시 알려주면 되며 Docker 재빌드는 필요하지 않습니다.
방장이 위 IP 주소로 게임에 접속한 상태에서 방을 만들고 상단 메뉴의 링크 복사를 누르면 같은 IP가 들어간 초대 링크가 자동 생성됩니다. 다른 기기에서 접속되지 않을 때는 두 기기가 같은 네트워크인지와 Windows 방화벽에서 TCP 3000, 2567 인바운드 연결이 허용됐는지 확인합니다.
상태와 로그를 확인하거나 종료할 때는 다음 명령을 사용합니다.
docker compose ps
docker compose logs -f hide-and-seek
docker compose down이 프로젝트는 숨바꼭질 장르의 일반적인 규칙과 실시간 멀티플레이 기술을 바탕으로 독립 구현했습니다. 다른 게임이나 참고 저장소의 코드, 캐릭터, 맵, UI, 문구와 에셋을 복제하지 않습니다.
눈숨, 수상한 잡화점, 밤지기 모루와 문구류 틈새정령은 이 프로젝트를 위해 만든 오리지널 설정입니다.
프로젝트 코드는 MIT License를 따릅니다. 외부 패키지 고지는 THIRD_PARTY_NOTICES.md를 확인하세요.
