테트리스

양규빈·2024년 2월 15일
0

C# 공부

목록 보기
30/30

깃허브 링크

테트리스

테트리스는 아마도 전세계에서 가장 유명한 게임 중 하나일 것입니다.
위에서부터 떨어지는 퍼즐 조각을 움직여, 라인을 채우는 간단한 게임입니다.

C++, C# 등. 여러가지 언어를 이용하여 구현이 가능하며,
그중에서도 C# 언어를 이용하여 간단한 테트리스 기능을 구현해봤습니다.

현재,
테트리스 미노의 랜덤 생성과 드랍, 그리고 이동을 구현했으며.
라인 체크를 통한 블록 부수기.
엔드 포인트 도달 혹은, 생성 블록과의 중첩을 통한 게임 패배를 구현했습니다.

추가적으로 구현할 요소로는
앞으로 생성될 블록의 미리보기.
점수판과 게임 리셋 등이 있을 것입니다.

InitGame

게임의 시작을 담당하는 클래스입니다.
필요한 변수 등을 초기화하고, Play 클래스 인스턴스화하여 실질적으로 게임 프로세스를 가동합니다.

게임 보드 배열의 상태에 따라서, 게임 보드를 드로우하는 함수입니다.

게임 패배 조건을 검사하는 함수와 라인에 블록이 모두 찾는지 체크하고 조건을 만족하는 라인을 파괴한 후에, 상위 라인을 아래로 당기는 함수입니다.

PlayGame

게임 프로세스 함수는, while문을 통해서, 패배조건을 만족하지 않는 동안에는 게임의 진행과 관련된 함수를 무한 반복해주는 함수입니다.

UpdateGame()에서는 블록의 drop, 라인 체크 및 패배 체크 등을 하며.

Input()에서는 유저의 키 입력을 받아서, 블록의 이동을.

마지막으로 Render()에서는 게임 보드를 채우는 역할을 합니다.

진행

ControlBlocks() 함수는,
드롭 상태가 아니라면, 새 블록을 생성.
드롭 상애라면, 생성된 블록을 바닥 혹은, 다른 블록의 위까지 당겨주는 역할을 합니다.

랜덤으로 블록의 타입을 리턴하여, 생성하는 블록을 결정해줍니다.

이동

왼쪽 화살표를 눌렀을 때, 블록을 왼쪽으로 이동시켜주는 함수입니다.
블록의 좌표를 저장한 child 배열을 순회하며, 보드를 벗어나지 않는 한에서 x축 값을 감산하여 이동합니다.

반대로 블록을 오른쪽으로 이동시켜주는 함수입니다.
마찬가지로 child배열을 순회하며, 보드를 벗어나지 않는 내에서 x축에 값을 더하여, 이동합니다.

아래 화살표를 눌러서, 아래로 빠르게 블록을 당겨주는 함수입니다.
y축에 1을 더해줍니다.

각 블록의 타입에 따라서, 알맞게 회전 함수를 호출하는 함수입니다.

Block

블록 클래스입니다.
하강 중인 블록 객체를 저장하는 클래스이며,
타입과 초기 x,y좌표.
블록의 몸통을 저장하는 좌표들의 배열 등을 맴버 변수로 가지고 있습니다.

블록을 생성하는 객체이며, 7가지 종류의 블록을 생성합니다.

이때, 생성 위치에 이미 블록이 존재할 경우에는 게임 종료를 알림으로써.
끝내도록 합니다.

회전

I미노

1자형 블럭을 회전시키는 함수입니다.
회전 각도를 저장하는 rotate 변수의 값에 따라서, childBlocks의 좌표 값을 수정해줍니다.
주의해야할 점은, 회전 중간에 만나게 될 벽과 block의 존재입니다.

체크해주도록 합니다.

O미노

O미노는 회전을 해도 변화하지 않기 때문에, 함수 호출 후. 실질적으로 기능 구현은 생략했습니다.

Z미노

Z모양의 블럭을 Z미노라 부릅니다.
Z미노는 총 두 가지 회전 패턴이 존재하며. rotate 변수를 기준으로, 실질적으로 회전을 구현했습니다.

dx와 dy 변수를 구현하여. flagX, flagY를 기준으로 +- 계산하여. 각 블럭의 좌표를 구합니다.
이후, 회전 좌표에 블럭이 겹치는지 체크. 그리고 게임 보드와 child 배열의 원소를 수정하는 것으로 마칩니다.

이러한 코드 구현 방법은 아래의 S미노 J미노, L미노, T미노에서도 사용했습니다.
즉, 회전을 위한 dx, dy 보정 값만 달라질 뿐. 코드의 구현 방식은 동일한 것입니다.

S미노

S미노는 Z미노의 좌우 반전 버전입니다.
구체적인 구현 방식은 위와 같습니다.

J미노

J미노와 L미노, S미노는 네 가지 회전 패턴이 존재하며.
각각의 dx, dy를 구현하여 회전시키도록 하였습니다.

L미노

T미노

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글