버블 슈팅 퍼즐 · SOURCE GUIDE
PRISM POP
같은 색 버블을 연결하고 천장과 끊어진 묶음을 떨어뜨리는 퍼즐입니다. 육각형 이웃 관계와 연결 탐색을 실제 게임 소스로 배워봅니다.
AI Tools Lab · · 소스 v1.0.1

세 개를 맞추는 일과 묶음을 떨어뜨리는 일
PRISM POP은 같은 색 버블 세 개 이상을 연결하는 퍼즐입니다. 연결한 버블이 사라질 때 천장과 이어져 있지 않은 묶음도 떨어집니다. 눈앞의 세 개를 맞추는 것과 위쪽 연결 고리를 끊는 것은 서로 다른 목표가 됩니다.
벽에 튕기는 경로를 이용할 수 있고 현재 버블과 다음 버블을 바꾸는 기능도 있습니다. 곧장 닿지 않는 자리에 어떤 각도로 접근할지 생각하는 재미를 코드의 경로 계산과 연결해 읽어보세요.
육각형처럼 이어지는 격자
dist/engine.js에서 먼저 볼 함수는 neighbors()입니다. 행이 홀수인지 짝수인지에 따라 대각선 이웃이 달라집니다. 화면에서는 같은 간격의 원처럼 보여도 단순한 상하좌우 네 방향 배열과는 다릅니다.
component()는 연결된 버블을 찾습니다. 같은 색을 찾는 경우와 색을 무시하고 연결 여부를 찾는 경우를 나누어 쓰며, disconnected()는 천장 쪽에서 이어진 항목들을 제외한 나머지를 구합니다. 한 종류의 탐색을 두 가지 판정에 활용하는 예입니다.
발사와 판정이 만나는 흐름
fire()가 발사체를 만들고 step()이 시간을 따라 움직입니다. firstCollision()은 벽·천장·버블 중 먼저 부딪히는 대상을 찾고 attach()는 새 버블이 붙은 뒤 제거·낙하·점수를 처리합니다. game.js는 이 상태를 Canvas에 그리고 입력과 효과음을 연결합니다.
이 순서대로 읽으면 점수를 먼저 고치는 대신 어떤 버블이 왜 사라졌는지부터 추적할 수 있습니다. 단순히 가까운 원끼리 없애는 방식이 아니라 격자의 연결 관계를 사용한다는 점이 핵심입니다.
이번 소스에서 보완한 렌더링
제공 버전 1.0.1에서는 발사대의 타원을 그리는 호출을 수정했습니다. 회전각 다음에 시작각과 끝각을 모두 전달하도록 보완했습니다.
ctx.ellipse(0, 30, 53, 12, 0, 0, Math.PI * 2);
그리기 도중 예외가 발생하면 뒤에 연결된 애니메이션 루프가 시작되지 않을 수 있습니다. 메뉴가 보이거나 시작 버튼이 눌리는 것과, 게임 화면이 계속 갱신되는 것은 별도로 확인해야 합니다.
직접 바꿔볼 과제: 색 수와 배열을 따로 비교하기
LEVELS의 첫 스테이지에서 색 수를 바꾸기 전에 원래 배열을 기록합니다.- 색 수 또는 행 수 중 하나만 바꾸고 초반에 만들 수 있는 연결을 비교합니다.
misses를 바꿀 때는 천장이 내려오는 주기와 위험선까지의 여유를 함께 봅니다.
색 수를 늘리는 것과 행을 늘리는 것은 다른 종류의 난이도 변화입니다. 연결 탐색 코드를 수정했다면 같은 색 세 개 제거뿐 아니라 서로 다른 색이 천장에 매달린 경우도 확인하세요.
내 컴퓨터에서 실행하기
- 소스 ZIP을 내려받고 압축을 풉니다.
README.md와dist가 있는 폴더에서 터미널을 엽니다.- 아래 명령을 실행한 뒤
http://127.0.0.1:8080/에 접속합니다.
python3 -m http.server 8080 --bind 127.0.0.1 --directory distWindows에서는 python3 대신 py를 사용할 수 있습니다. Python이 없다면 코드 편집기의 로컬 정적 서버를 dist에 연결하세요. 종료는 Ctrl + C입니다.
HTML 파일 더블 클릭보다 로컬 서버를 권장합니다. 모듈·이미지 경로를 일관되게 읽을 수 있습니다. 포트가 사용 중이면 8081 등으로 바꾸고 접속 주소에도 반영하세요. npm 설치나 별도 게임 빌드는 필요하지 않습니다.
이 소스로 할 수 있는 일
이 ZIP에 포함된 AI Tools Lab 제작 소스와 게임 에셋은 개인·상업 목적으로 사용, 복제, 수정, 재배포할 수 있습니다. 저작권 소유권이 양도되는 것은 아닙니다. 이 허락은 AI Tools Lab 사이트의 다른 콘텐츠에는 적용되지 않습니다. 포함되지 않은 외부 폰트·상표 등 제3자 자료는 각 권리자의 조건을 따릅니다.
설명에 있는 수정 과제는 직접 비교해 볼 실습 제안입니다. 수행하지 않은 테스트 결과나 제작 당시의 경험을 의미하지 않습니다. 오류를 발견했다면 게임명·브라우저·조작 순서와 함께 알려주세요.