ai-creator

[파이썬 간단한 게임 만들기] 10.테트리스(Tetris) - 1탄. 게임 구성 요소 (설명) 본문

유치한 게임

[파이썬 간단한 게임 만들기] 10.테트리스(Tetris) - 1탄. 게임 구성 요소 (설명)

ai-creator 2021. 5. 15. 14:17
반응형

테트리스 게임을 완성해봅니다.

재밌게 즐겼던 테트리스 게임을 직접 만들어 본다 생각하니 설레이시죠?

게임을 만들어보면 느끼시겠지만, 생각보다 복잡한 과정들을 거칩니다.

중도에 포기하지마시고, 한단계 한단계 완성해보며 프로그래밍 실력을 향상시키는 계기가 되셨으면 좋겠습니다.

 

이번장은 제 1탄으로 게임의 구성요소를 살펴보겠습니다.

다음과 같은 순서로 설명합니다.

 

1. 게임판 구성

2. 게임 필드 구성

3. 블록구성

  3-1) 블록의 종류와 회전

  3-2) 블록데이터 (BLOCK_DATA)

4. 점수

ㅁ 정리

 

 

 

1. 게임판 구성

게임판의 구성요소는 다음과 같습니다.

1) 블록이 떨어지는 필드 영역

2) 점수 영역

3) 다음 블록 영역

 

 

하나의 작은 조각(이하 PIECE)들의 모음이며,

PIECE_SIZE는 24이고,

PIECE사이에 공백을 두어, GRID표현을 합니다.

 

아래 그림은 구성요소와 PIECE배치에 따른 좌표를 표기하였습니다.

1) 블록이 떨어지는 필드 영역 - 노란색

2) 점수 영역 - 녹색

3) 다음 블록 영역 - 주황색

각각의 PIECE는 약속된 값으로 채워집니다.

약속된 값은 

- 색

- 유효성

을 의미하게 됩니다.

이 값의 의미는 천천히 알아가도록 합시다.

2. 게임 필드 구성

게임 필드(이하 필드)는 PIECE가 12x22개로 구성되어 있습니다.

노란색 부분만 블록이 위치할 수 있습니다.

게임필드는 약속된 값을 통해

- 색

- 유효성

을 나타내게 됩니다.

 

필드의 경우는 약속된 값( = 8)을 채웁니다. 그럼 어떻게 색과 유효성을 판단할까요?

1) 색

색의 경우는 전체적으로 색을 관리하는 COLORS 변수를 정의할때,  8번째에 해당 PIECE의 색상을 지정합니다.

8번째는 Grey가 될 수 있도록 (128, 128, 128) 설정하였습니다. 

COLORS = ((0, 0, 0), (255, 165, 0), (0, 0, 255), (0, 255, 255), \
          (0, 255, 0), (255, 0, 255), (255, 255, 0), (255, 0, 0), (128, 128, 128))

2) 유효성

여기서 의미하는 유효성이란, 해당 위치에 PIECE를 위치시킬 수 있느냐는 의미입니다.

0이 아닌 값으로 채워져 있다면, 다른 PIECE를 위치시킬 수 없습니다.

여기서 8로 채워진 PIECE는 테트리스필드의 '벽'을 의미하므로, 다른 블록들이 사용할 수 없는 영역이라는 것이죠.

 

3. 블록 구성

3-1) 블록의 종류와 회전

블록은 총 7가지 종류가 있습니다.

블록은 키 입력에 따라 회전을 하죠.

 

3-2) 블록 데이터 (BLOCK_DATA)

블록의 종류와 회전에 따른 경우의 수를 생각해서 블록 데이터를 설정해봅시다.

아래와 같은 그림으로 데이터를 관리하고자 합니다.

 BLOCK_DATA는 3차원이며, 각 차원은 아래와 같은 의미를 지닙니다.

더보기
BLOCK_DATA = (
    (
        (0, 0, 1, \
         1, 1, 1, \
         0, 0, 0),
        (0, 1, 0, \
         0, 1, 0, \
         0, 1, 1),
        (0, 0, 0, \
         1, 1, 1, \
         1, 0, 0),
        (1, 1, 0, \
         0, 1, 0, \
         0, 1, 0),
    ), (
        (2, 0, 0, \
         2, 2, 2, \
         0, 0, 0),
        (0, 2, 2, \
         0, 2, 0, \
         0, 2, 0),
        (0, 0, 0, \
         2, 2, 2, \
         0, 0, 2),
        (0, 2, 0, \
         0, 2, 0, \
         2, 2, 0)
    ), (
        (0, 3, 0, \
         3, 3, 3, \
         0, 0, 0),
        (0, 3, 0, \
         0, 3, 3, \
         0, 3, 0),
        (0, 0, 0, \
         3, 3, 3, \
         0, 3, 0),
        (0, 3, 0, \
         3, 3, 0, \
         0, 3, 0)
    ), (
        (4, 4, 0, \
         0, 4, 4, \
         0, 0, 0),
        (0, 0, 4, \
         0, 4, 4, \
         0, 4, 0),
        (0, 0, 0, \
         4, 4, 0, \
         0, 4, 4),
        (0, 4, 0, \
         4, 4, 0, \
         4, 0, 0)
    ), (
        (0, 5, 5, \
         5, 5, 0, \
         0, 0, 0),
        (0, 5, 0, \
         0, 5, 5, \
         0, 0, 5),
        (0, 0, 0, \
         0, 5, 5, \
         5, 5, 0),
        (5, 0, 0, \
         5, 5, 0, \
         0, 5, 0)
    ), (
        (6, 6, \
        6, 6),
        (6, 6, \
        6, 6),
        (6, 6, \
        6, 6),
        (6, 6, \
        6, 6)
    ), (
        (0, 7, 0, 0, \
         0, 7, 0, 0, \
         0, 7, 0, 0, \
         0, 7, 0, 0),
        (0, 0, 0, 0, \
         7, 7, 7, 7, \
         0, 0, 0, 0, \
         0, 0, 0, 0),
        (0, 0, 7, 0, \
         0, 0, 7, 0, \
         0, 0, 7, 0, \
         0, 0, 7, 0),
        (0, 0, 0, 0, \
         0, 0, 0, 0, \
         7, 7, 7, 7, \
         0, 0, 0, 0)
    )
)

 

아래 도형의 경우는 회전을 해도 동일한 모양이므로, 동일 데이터가 들어가 있다.

 

위에서 설정한 BLOCK_DATA로 종류와 회전시의 모양을 표현했습니다.

 

그렇다면, 각 모양을 게임판에 표현하기 위해서는 어떻게 접근하면 될까요?

첫번째가 "블록의 종류" => "블록의 방향" => "데이터값"을 의미하게 된다.

만약, BLOCK_DATA[0][0]이라면, 1차원의 (0, 0, 1, 1, 1, 1, 0, 0, 0) 이 된다.

이때 주의할 점은 1차원이라는 점이다.

약속된 값을 통해

- 색

- 유효성

을 나타낸다는 언급을 위에서도 했죠? 방법은 동일합니다.

 

1) 색

총 7종류의 블록들은 각기 고유의 색상이 있습니다.

BLOCK_DATA에서 "약속한 값"에 따라 COLORS를 선택하게 되죠.

즉, 약속된 값이 '1이라면, 2라면, 3이라면'에 따른 색상 지정입니다.

COLORS = ((0, 0, 0), (255, 165, 0), (0, 0, 255), (0, 255, 255), \
          (0, 255, 0), (255, 0, 255), (255, 255, 0), (255, 0, 0), (128, 128, 128))

만약, BLOCK_DATA[0][0][3]이라고 한다면, 어떤 모양을 가진 블록이 어떤 컬러로 표현하면 될까?

- BLOCK_DATA[0][0]로 블록의 모양이 선택되고,

- BLOCK_DATA[0][0][3]로 PIECE에 채워질 값이 선택됩니다. [3]번째이므로 1을 의미한다. 이 경우 (255, 165, 0) 컬러값으로 PEICE를 표현하면 된다.

도형 / 색상

2) 유효성

여기서 의미하는 유효성이란, 해당 위치에 PIECE를 위치시킬 수 있느냐는 의미입니다.

0이 아닌 값으로 채워져 있다면, 다른 PIECE를 위치시킬 수 없습니다.

 

 

4. 점수

테트리스에서는 어떤 경우에 점수가 올라가나요?

그렇죠. 줄이 완성되었을때 입니다.

"완성"이라는 의미가 뭔가요? 색으로 꽉 채워졌을때겠죠?

색은 무엇으로 표현했나요? 약속된 값으로 표현했습니다.

그럼 이렇게 되겠네요.

값으로 모두 채워졌으면 => 줄 삭제 => 점수 획득이 되겠습니다.

 

ㅁ 정리

게임판의 구성요소는 3가지입니다.

1) 블록이 떨어지는 필드 영역

2) 점수 영역

3) 다음 블록 영역

 

그리고, 약속된 값으로 채워진 PIECE는

1) 색상

2) 유효성

을 체크하는데 사용합니다.

 

 

ㅁ 참고자료

- 게임으로 배우는 파이썬

 


도움이 되셨다면, 좋아요 / 구독 버튼 눌러주세요~

 

저작물의 저작권은 작성자에게 있습니다.
공유는 자유롭게 하시되 댓글 남겨주세요~
상업적 용도로는 무단 사용을 금지합니다.
끝까지 읽어주셔서 감사합니다^^

반응형
Comments