본문 바로가기

Development/Tetris

Python - 테트리스(Tetris) 만들기 (1) - Intro

 

https://www.flaticon.com/free-icon/tetris_566312

Intro(소개)

테트리스란, 블럭 4개로 이루어진 도형(Mino)를 필드에 쌓아, 줄을 지워나가는 게임입니다.

간단한 규칙에 비해, 다양한 기술들(예 : T-spin)이 있어 인기가 많은 게임입니다.

이 게임을 Python으로 구현하고자 합니다.

 

 


Purpose(목적)

이 블로그에서 python으로 테트리스를 만드는 목적이 무엇일까요? 이해하기 쉬운 게임을 통해 프로그래밍의 기본적인 흐름을 보여주는 것이 주된 목적입니다. 구현을 아래 6단계로 나눠서 진행합니다.

 

  1단계. 요구사항 문서 분석

  2단계. 요구사항에 따른 언어 선택

  3단계. 요구사항의 기능을 상세 분석, 구현

  4단계. 기능 Test

  5단계. Bug fix, 기능 확장(구현 단계인 3으로 돌아감)

  6단계. 완성

 

보통사람들은 막연한 요구사항을 머릿속으로 생각하면서 기능을 구현하고 확장합니다. 하지만 이런 방식으로는 코드가 거대해지면 어디서 문제가 생긴 것인지, 내가 만든 것이 제대로 동작하는 것인지 정확히 알기 어렵습니다.

이 글에서는 요구사항을 끊임없이 참조하여 어떻게 기능을 구현할지 차근차근 알려드릴 예정입니다. 뿐만 아니라 실패하고 고민하는 중간 과정을 설명하면서, 어떤 식으로 사고를 해야 하는지를 보여드릴 겁니다.

사실, 인터넷에 "python tetris"라고 검색하면 이미 잘 되어 있는 코드가 널려있습니다. 필자는 왜 잘된 코드를 만들어서 설명하지 않을까요? 

유튜브에서 검색해도 관련 정보가 많다

 

위 영상은 여러 문서를 가지고 분석하고 기능을 구현하고 실패하는 과정이 생략된 최종 산출물 입니다. 하지만 최종 산출물으로는 중간과정을 알 수 없어, 여러분들의 프로그래밍 사고력 향상에 도움이 되지 않습니다.

제 블로그에서는 고민하는 중간 과정을 모두 알려드립니다. 글은 길어질 수 있지만, 왜 이렇게 코드를 작성했는지를 더욱 쉽게 이해할 수 있고, 결국은 프로그래밍 사고력을 더욱 향상시킬 수 있습니다.

 

 


1단계. 요구사항 문서 분석

테트리스에 왠 요구사항 문서일까요? 테트리스는 1986년도에 Alexey Pajitnov라는 소련의 개발자에 의해 탄생했지만 지금은 2023년도입니다. 그동안 테트리스의 규칙은 끊임없이 변해 왔습니다.

Web에서 Play 할 수 있는 Tetris인 Jstris. 180도 회전, 홀드 규칙은 생소한 규칙이다.

 

필자는 Modern Tetris의 reference 문서로, https://tetris.fandom.com/wiki/Tetris_Wiki를 참고합니다.

 

Content가 보기좋게 정렬되어 있다.

General Gameplay OverView에서 다음과 같은 기능사항을 발견할 수 있습니다.

 

The action of Tetris happens within a machine called a tetrion. The largest part of the tetrion consists of the playfield measuring ten spaces across by twenty spaces down. It has other parts explained below.
(계속....)

 

해석하면 다음과 같습니다.

 

  1. 테트리스 액션은 테트리온(Tetrion)이라는 기계 안에서 이루어 집니다. 
  2. 테트리온의 가장 큰 부분은 가로 10칸 x 세로 20칸의 플레이 필드입니다.
  3. 무작위로 선택된 테트로미노(Tetromino. 이하 "미노"라 하겠습니다.)는 4개의 정사각형 블록으로 구성된 도형입니다.
  4. 미노는 한 번에 하나씩 떨어집니다.
  5. 미노는 모양에 따라 주어진 방향과 색으로 플레이 필드에 들어옵니다.
  6. 미리보기(Preview)라고 하는 테트리온의 일부에는 앞으로 들어올 조각이 표시됩니다.
  7. 회전할 공간이 있는 경우 시계(+반대)방향을 눌러 90도씩 회전할 수 있습니다. 일부 버젼에서는 공간을 확보하기 위해 벽이나 다른 블록에서 밀어내기도 합니다.
  8. 플레이어는 왼쪽, 오른쪽 화살표를 짧게 눌러 떨어지는 미노를 한칸씩 옆으로 이동시킬 수 있으며, 길게 누를 경우 움직일 공간이 있으면 더 빠르게 이동할 수 있습니다.
  9. 테트리온의 왼쪽 상단(경우에 따라 오른쪽 하단)에는 미노를 보관할 수 있는 홀드박스라는 공간이 있습니다. 
  10. 각 미노는 저절로 천천히 아래로 이동합니다. 어떤 방법을 사용하면 빠르게 아래로 이동하거나,  떨어뜨릴 수 있습니다.
  11. 미노가 바닥이나 다른 블록에 떨어지면 플레이어가 움직일 수 있는 시간이 잠기기까지 잠시 지연됩니다. 시간이 지나 잠긴 후에는 테트로미노를 움직일 수 없습니다.
  12. 테트로미노가 잠기고 그로 인해 한 줄 이상 빈공간을 모두 채우면 그 줄은 비워집니다. 그 위에 남은 블록은 제거된 행 수 만큼 아래로 이동합니다.
  13. 플레이 필드가 채워지지 않으면 다음블록이 들어갑니다.

 

하나씩 읽어보면, 각 항목이 테트리스의 어떤 부분을 설명하는지 아실 겁니다. 우리는 이 항목들을 참고하면서 테트리스를 만들어 갈 것입니다.

 

 

그럼 다음 글에서는 2단계. 요구사항에 따른 언어 선택(Python)을 시작하겠습니다.

 

 


*reference

jstris : https://jstris.jezevec10.com/

modern tetris : https://tetris.fandom.com/wiki/Tetris_Wiki