이 코드에서 사용할 핵심 기법은 깊이 우선 탐색(DFS, Depth-First Search) 기반의 백트래킹(Backtracking)입니다. 이름은 거창하지만 원리는 아주 단순합니다.
일단 갈 수 있는 방향 중 하나를 무작위로 골라 벽을 부수고 전진합니다.
지나온 길은 '수첩(Stack)'에 기록해 둡니다.
사방이 다 막혀있거나 이미 방문한 곳뿐이라면(막다른 길), 수첩을 보고 직전에 있었던 갈림길로 되돌아갑니다. (이것이 백트래킹!)
수첩에 적힌 모든 기록을 지우고 출발지로 돌아오면 미로 완성!
이제 이 원리가 코드로 어떻게 구현되는지 단계별로 살펴보겠습니다.
💻 코드 파헤치기 1. 꽉 막힌 방들로 이루어진 판 만들기 (초기화) 먼저 미로의 뼈대가 될 격자(grid)를 만듭니다. 처음에는 모든 칸의 사방(상, 하, 좌, 우)에 벽이 쳐져 있는 상태로 시작합니다.
2. 탐험 준비 및 시작 가장 왼쪽 위 [0][0]을 출발점으로 잡고 탐험을 시작합니다.
3. ✨핵심 포인트: 가장 먼 종료 지점 찾기 보통 미로를 만들면 습관적으로 가장 반대편인 우측 하단([size-1][size-1])을 도착점으로 둡니다. 하지만 미로의 길이 꼬불꼬불하다면, 물리적인 거리와 상관없이 실제로 가장 많이 걸어야 하는'가장 난이도가 높은 칸'은 다른 곳일 수 있습니다. 우리는 stack의 길이를 이용해 이 문제를 해결합니다. 탐험 중 stack에 쌓인 데이터의 개수는 곧 '출발지로부터 현재 위치까지 꺾어 들어온 거리'를 의미하기 때문입니다.
4. 무작위로 벽 부수며 전진하기 이제 인접한 칸 중 아직 안 가본 곳(neighbors)을 찾습니다. 갈 곳이 있다면 무작위로 하나를 골라 현재 칸과 다음 칸 사이의 벽(wall, opp)을 모두 false로 만들어 길을 뚫습니다. 갈 곳이 없다면 막다른 길이므로 수첩에서 현재 위치를 지우고(stack.pop()) 뒤로 물러납니다.
let neighbors = []; for (let d of directions) { let nx = current.x + d.dx; let ny = current.y + d.dy; if (nx >= 0 && nx < size && ny >= 0 && ny < size && !grid[ny][nx].visited) { neighbors.push({cell: grid[ny][nx], dir: d}); } }
if (neighbors.length > 0) { // 갈 곳이 있다면 무작위로 벽 부수고 전진 let chosen = neighbors[Math.floor(Math.random() * neighbors.length)]; current[chosen.dir.wall] = false; chosen.cell[chosen.dir.opp] = false; chosen.cell.visited = true; stack.push(chosen.cell); } else { // 막다른 길이면 뒤로 되돌아가기 stack.pop(); } }
5. 마무리 및 데이터 반환 수첩(stack)이 텅 비어 while 문이 끝났다는 것은 모든 방을 다 방문하고 다시 출발지로 돌아왔다는 뜻입니다. 이제 아까 기록해 둔 '가장 먼 곳'을 종료 지점(isEnd = true)으로 설정하고 데이터를 반환합니다.
이번에 구현 할 테트리스 게임은 아케이드 모드, 퍼즐 모드, 아이템 모드 총 3개의 모드로 구성이 됩니다.
1.2.1 아케이드 모드
테트리스의 기본 형태로, 모두가 잘 알고 있는 내용이라, 자세한 설명은 생략합니다.
1.2.2 퍼즐모드
퍼즐 모드 테트리스는 고전적인 테트리스 게임을 벗어나, 플레이어의 두뇌와 반응 속도를 동시에 시험하는 독특한 경험을 제공합니다. 이 게임에는 70가지 이상의의 다양한 퍼즐이 포함되어 있어, 게임을 진행하면서 플레이어의 전략적 사고력을 향상시키는 동시에 문제 해결 능력을 증진시키는 데 도움이 됩니다. 각 스테이지의 목표는 화면에 보이는 색상이 있는 블록을 모두 제거하는 것입니다. 이는 단순히 블록을 빠르게 쌓는 것을 넘어서, 플레이어가 어떻게 블록을 배치하고 어떤 블록을 사용할지를 신중하게 고려해야 하는 전략적인 요소를 게임에 도입합니다.
1.2.3 아이템 모드
아이템 모드는 다양한 아이템들이 포함된 전략적인 게임을 제공 합니다. 이 모드의 주요 아이템들은 Yellow Thunder, Black Thunder, Orange Thunder, Red Thunder, Blue Boom, Black Boom, Green Boom, 그리고 Red Boom입니다.
Yellow Thunder는 화면의 모든 검은 폭탄을 폭발시키며, Black Thunder는 최대 3개의 폭탄을 화면에 추가합니다. Orange Thunder는 아이콘이 바닥에 닿을 때 중심을 기준으로 3x3 영역을 지웁니다. 단, 아이콘이 포함된 줄이 꽉 차있다면 작동하지 않습니다. Red Thunder는 아이콘이 바닥에 닿으면 현재 위치한 세로 라인과 오른쪽 세로 라인을 지웁니다.
Blue Boom은 아이콘이 바닥에 닿았을 때 중심 주변 3x3 크기를 회색 블록으로 채웁니다. Black Boom은 폭탄이 포함된 줄이 블록으로 꽉 차면 위 아래 한 줄씩 총 3줄을 삭제합니다. Green Boom은 원형의 회색 블록을 추가합니다. 단, 아이콘이 포함된 줄이 꽉 차있다면 작동하지 않습니다. Orange Boom은 아이콘 중심으로 빈 3x3 사각형을 그립니다. 마찬가지로, 아이콘이 포함된 줄이 꽉 차있다면 작동하지 않습니다. Red Boom은 아이콘이 위치한 한 줄을 지웁니다.
아이템 테트리스는 이러한 독특한 아이템들을 활용해 주어진 판의 블록들을 모두 제거하면서, 전략적으로 높은 점수를 달성하는 것이 목표입니다.