테트리스 게임은 다양한 방식으로 개발할 수 있으며, 그 중 배열 방식과 비트마스크 방식은 특히 주목할 만한 구현 방법이다. 이 글에서는 이러한 두 가지 회전 방식을 단계별로 살펴보며, 각 방식이 갖는 특징과 장단점에 대해 정리하겠다.
배열 방식의 도형 회전: 간단하면서도 직관적인 접근
테트리스 도형을 배열 방식으로 구현할 때 가장 먼저 고려할 점은 도형의 회전 방식이다. 배열 방식은 도형을 2차원 배열로 표현하며, 각 셀은 해당 위치에 도형이 존재하는지를 나타내는 1 또는 0으로 채워진다. 이를 통해 도형의 회전은 배열의 인덱스를 조작하여 구현할 수 있다.
배열 구조와 도형 저장
각 도형은 3차원 배열에 저장된다. 3차원 배열의 첫 번째 차원은 도형의 종류를, 두 번째 차원은 도형의 모양을, 세 번째 차원은 도형을 구성하는 셀의 정보를 담고 있다. 예를 들어, 도형 ‘T’는 다음과 같은 배열 구조를 가진다.
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 0 | 0 | 0 |
이러한 배열을 통해 도형을 쉽게 정의하고, 회전 시 각 인덱스의 값을 조작함으로써 새로운 모양을 생성할 수 있다.
도형 회전 구현
도형의 회전은 간단한 인덱스 변환을 통해 이루어진다. 예를 들어, 왼쪽으로 회전하는 경우, 각 행의 인덱스를 열로 변환하고, 오른쪽으로 회전하는 경우 반대 방향으로 변환하는 방식이다. 이를 통해 도형의 회전이 가능해지며, 다음과 같은 코드를 통해 구현할 수 있다.
javascript
function rotateLeft(piece) {
var ret = [];
for (var y = 0; y < 4; y++) {
ret[y] = [];
for (var x = 0; x < 4; x++) {
ret[y][x] = piece[x][3 - y];
}
}
return ret;
}
이 코드는 도형을 90도 회전시키는 로직을 구현하며, 매개변수로 전달된 도형 배열을 변환하여 새로운 배열을 반환한다. 이와 같은 방식으로 도형의 회전을 처리할 수 있다.
Bitmask 방식의 도형 회전: 효율적인 메모리 사용
비트마스크 방식은 메모리를 보다 효율적으로 사용할 수 있는 방법으로, 특히 도형의 정보를 비트로 표현할 수 있다. 이 방식은 각 도형의 위치를 비트 배열로 처리하며, 회전 시에는 비트 연산을 통해 새로운 형태의 도형을 생성한다.
비트마스크 구조와 도형 저장
비트마스크 방식을 사용할 경우, 각 도형은 정수 형태로 저장된다. 예를 들어, ‘T’ 도형은 다음과 같은 비트 표현으로 나타낼 수 있다.
00000000
00011100
00001000
이러한 비트 표현을 통해 도형의 회전을 보다 간편하게 처리할 수 있는 장점이 있다.
도형 회전 구현
비트마스크 방식에서 도형의 회전은 비트 연산을 통해 수행된다. 이를 통해 새로운 도형을 생성할 때 메모리 사용을 최소화하고, 연산 속도를 높일 수 있다. 예를 들어, 왼쪽으로 회전하는 경우 다음과 같이 비트 연산을 활용할 수 있다.
javascript
function rotateLeft(piece) {
return (piece << 1) | (piece >> 1);
}
이 코드는 비트 시프트 연산을 통해 도형의 회전을 처리하며, 비트마스크 방식의 효율성을 극대화한다.
두 가지 방식의 비교: 배열 vs 비트마스크
배열 방식과 비트마스크 방식은 각기 다른 장단점을 가지고 있다. 배열 방식은 구현이 간단하고 직관적이지만, 메모리 사용 면에서 비효율적일 수 있다. 반면 비트마스크 방식은 메모리 사용이 효율적이나, 구현이 복잡해질 수 있다. 따라서, 개발자는 프로젝트의 요구 사항에 따라 적절한 방식을 선택해야 한다.
실제 구현: requestAnimationFrame과의 통합
테트리스 게임을 실제로 구현할 때는 requestAnimationFrame을 사용하여 게임 루프를 관리하는 것이 유용하다. 이를 통해 부드러운 애니메이션을 구현하고, 게임의 프레임을 효과적으로 제어할 수 있다. 아래는 requestAnimationFrame을 사용하는 기본적인 게임 루프의 예시다.
javascript
function gameLoop() {
draw();
update();
requestAnimationFrame(gameLoop);
}
이와 같은 방식으로 테트리스 게임의 전체적인 흐름을 관리할 수 있으며, 도형의 회전과 이동, 충돌 검사 등을 포함한 복잡한 로직을 효과적으로 처리할 수 있다.
결론
테트리스 게임 개발에서 배열 방식과 비트마스크 방식은 각각의 장단점이 있으며, 상황에 따라 적절한 방법을 선택하는 것이 중요하다. 배열 방식은 직관적이고 이해하기 쉬운 반면, 비트마스크 방식은 효율적인 메모리 사용과 빠른 연산 속도를 제공한다. 이러한 두 가지 방식을 통해 개발자는 다양한 테트리스 게임을 구현할 수 있을 것이다.