본문 바로가기

Development/Tetris

Python - 테트리스(Tetris) 만들기 (10) - Requirement

들어가기에 앞서...

테트리스 만들기(9) - Refactoring까지 따라오셨다면, 왜 제대로 된 설계 없이 기능 순서대로 마구잡이로 개발하면 안되는지 알게 되셨을 껍니다. 물론 혼자 진행하는 Practice라면 상관이 없지만, 만약에 이게 팀 단위의 Project였고, Refactoring할 시간은 없는데 새 기능을 추가해야 하는 상황이라면 어떻게 될까요? 아찔합니다.

 

이번 시간에는, 다시 처음으로 돌아가 https://tetris.fandom.com/wiki/Tetris_Wiki의 문서를 분석하고자 합니다.

 

돌고 돌아, 결국 다시 요구사항 분석을...

 

 

 


Tetris 요구사항을 전부 확인

먼저, Overview부터 살펴보도록 합시다.

게임의 가장 기초적인 설명

 

 - 테트리스는 테트리온이라는 장치 내에서 동작합니다.

 - 테트리온의 가장 큰 부분은 가로 10칸, 세로 20칸 크기의 Playfield로 구성되어 있습니다.

 

여기서 PlayField 링크를 클릭해봅니다.

Playfield 설명

 

 - playfield는 tetromino가 떨어지는 그리드 입니다.

7개의 tetromino 설명. 직관적인 그림이 있으니 넘어갑시다.

 

 - playfield는 tetrion이라는 frame으로 둘러쌓여 있습니다.

 

 - 대부분의 게임은 가로 10칸, 세로 16 ~ 24칸입니다. 그 예외도 있습니다

  → 이렇게 된다면, 가로 4칸 이상, 세로 4칸 이상의 정수값을 input으로 field를 만들 수 있게 하면 됩니다.

 

 - tetromino는 천장과 겹쳐서 소환됩니다. 천장도 단단하기 때문에 I는 생성 직후 회전이 불가능합니다.

  → 요즘 tetris는 천장에서도 자유롭게 회전이 가능하니 트렌드를 따라갑시다.

 - SRS 회전을 기본으로 사용합니다. 

  → 킥이란, 벽에 붙어있을 때 회전을 하면 벽에서 한칸 멀어질 때가 있는데 이것을 킥이라 합니다.

assuming x increases to the right and y increases upwards

rotate left: {{0,0,},{0,-1,},{1,0,},{1,-1,},{-1,0,},{-1,-1,},{0,1,},{1,1,},{-1,1,},}
rotate right: {{0,0,},{0,-1,},{-1,0,},{-1,-1,},{1,0,},{1,-1,},{0,1,},{-1,1,},{1,1,},}

 

SRS(초회전체계)는 tetromino들의 행동을 안내합니다. 너무 복잡하니, 쉬운 Guideline부분부터 읽어봅시다.

 

 


Guideline에서 보이는 요구사항들

Tetris Guideline에는 게임을 진행하기 위한 기본적인 사항이 주어진다.

 

 - Playfield는 10 x 40이지만 field frame에 가려져 플레이어는 10 x 20으로 착각하게 합니다.

  * input 크기가 자유로울 때는 숨겨진 공간의 세로크기를 20으로 유지합니다.

 - Tetromino 색깔

   I: Cyan,  O: Yellow,  T: Purple,  S: Green,  Z: Red,  J: Blue,  L: Orange

 - Tetromino 시작위치

   * I, O는 가운데 열에 생성됩니다.

   * 나머지는 왼쪽 가운데 열에 생성됩니다.

   * 수평으로 생성되며, J, L, T는 평평한 면이 먼저 스폰됩니다.

   * I는 21열, 다른 모든 Tetromino는 21/22열에 playfield 위에 생성됩니다.

   * 경로에 기존 Block이 없으면 즉시 한 칸 떨어뜨립니다.

 

 - Computer Keyboard에 따른 동작

   * x key : 90º 시계방향

   * z key : 90º 시계반대방향

   * space key : locking hard drop. 내려간 후 더이상 움직이지 못함.

   * down key : non-locking soft drop. 내려간 후 여전히 움직일 수 있음.

   * shift key : hold (나중에 설명합니다)

   * esc key : pause

   * left, right key : tetromino의 좌 우 동작

 

 - 7-bag Random Generator : 7개의 Tetromino의 묶음 종류를 의미합니다.

tetromino의 블럭은 완전 무작위가 아니라, 7개의 블럭 묶음 내에서 랜덤이며, 묶음이 끝나면 다음 묶음이 시작된다.

 

 - Hold

   * 플레이어는 버튼(shift key)을 눌러 tetromino를 hold box로 보낼 수 있습니다

   * hold box에 있었던 tetromino는 화면 상단에 다시 불러올 수 있습니다.

   * hold 기능은 tetromino가 locks down이 될 때까지 재사용할 수 없습니다.

 

 - 소리 효과

   * rotation

   * movement

   * landing on surface

   * touching a wall

   * locking

   * line clear

   * game over

 

 - ghost 조각 기능 기본적으로 활성화 : 바닥에 hard drop할 시 예상 위치를 반투명으로 표시

   * 원한다면 off도 시킬 수 있어야 합니다.

 

 - 지정된 Soft drop속도는 version마다 다릅니다. 

   * Soft drop 속도를 설정할 수 있어야 합니다.

 

 - 플레이어는 라인을 클리어하거나 T-spin을 수생해야만 Level을 올릴 수 있습니다.

   * 필요량은 게임마다 다릅니다.

   * 고정 목표, 가변 목표가 사용됩니다.

   * 고정 목표는 10줄 입니다.

   * 가변 목표는 레벨의 5배 입니다.

   * 가변 목표 레벨의 라인 값 : 싱글(1), 더블(3), 트리플(5), 테트리스(8)

 

 - 0.5초 lock delay를 사용합니다.

 

 - 조각이 블럭과 겹쳐서 생성되거나(block out), 조각이 visible field 보다 위에서 lock되면(lock out) top out이 됩니다.

Top out이란 Tetris Death를 의미합니다.

 

 - 미리보기 조각을 1개부터 6개 사이로 보여야 합니다.

   * 미리보기 숫자는 6개를 추천합니다.

 

 - 15레벨까지 진행하는 모드를 Marathon mode라 합니다.

 

 - 40줄을 지우는 모드를 Sprint mode라 합니다.

 

 - 2분, 혹은 3분 시간제한모드를 Ultra mode라 합니다.

 

 - 게임은 "시작을 누른 후"와 "일시 중지된 게임을 다시 시작한 후"에 3부터 카운트 해야 합니다.

 

 - 게임이 시작될 때 이 알림이 표시되어야 합니다.

Tetris © 1985~XXXX Tetris Holding.
Tetris logos, Tetris theme song and Tetriminos are trademarks of Tetris Holding.
The Tetris trade dress is owned by Tetris Holding.
Licensed to The Tetris Company.
Tetris Game Design by Alexey Pajitnov.
Tetris Logo Design by Roger Dean.
All Rights Reserved.

 

여기까지가 Guideline이었습니다. 이번에는 이전에 넘어갔던 SRS에 대해서 알아봅시다.

 

 


SRS (Super Rotation System)

맨 좌측이 생성 상태이다

 

SRS를 super rotation system이라 부르며, 블럭의 회전에 대한 행동를 안내합니다.

SRS는 매우 복잡하다.

 

 - Basic Rotation : 방해물이 없는경우, 점을 중심으로 순수하게 회전합니다. 

 

 - Wall kick : 회전을 시도할 때 벽이나 바닥, 또는 블럭에 막히면 tetromino를 근처의 다른 위치로 이동을 시도합니다.

   * 5개의 위치가 순차적으로 테스트 되며, 5개가 모두 실패하면 회전이 실패합니다.

   * 0: 생성상태,  1: 시계방향 90도 회전상태,  2: 180도 회전상태,  3: 270도 회전상태

   * x, y의 좌표에서 x는 오른쪽 방향을, y는 위쪽을 의미합니다.

"1" 이 표시된 부분 : T미노는 불가능한 움직임이다. 이미 자체 회전을 했기 때문.

 

SRS까지 알아보았습니다. 이번에는 Line Clear에 대해 정리해 보겠습니다.

 

 


Line Clear

Playfield의 가로줄을 블럭으로 다 채우면 가로줄이 지워지고, 가로줄 위에 있던 블럭들이 내려오게 됩니다.

 

 - T-spin에 대한 조건은 version마다 다릅니다.

   * 3-corner T와 3-corner T no kick이 있습니다. 이 블로그에서는 3-corner T를 따르기로 합니다.

   * 3-corner T란 : 줄을 없애기 직전 T미노 동작이 회전이며, T를 둘러싼 4개의 대각선 모서리 중 3개가 블럭으로 차있어야 합니다.

출처 : https://hse30.tistory.com/82

 

 - Single : 한 줄이 다 채워짐

 

 - Double : 두 줄이 한 번에 다 채워짐

 

 - Triple : 세 줄이 한 번에 다 채워짐

 

 - Tetris : 네 줄이 한번에 다 채워짐

 

 - T-spin mini : T-mino를 회전 시 wall-kick이 일어나면서3-cornet T조건을 만족한 채 0줄, 혹은 한 줄을 삭제

   * 3-corner T no kick조건에서는 T-spin mini가 없습니다.

 

 - T-spin single : T-mino를 회전 시 wall-kick 없이 3-cornet T조건을 만족한 채 한 줄을 삭제

 

 - T-spin double : T-mino를 회전 시3-cornet T조건을 만족한 채 두 줄을 삭제

 

 - T-spin Triple : T-mino를 회전 시 3-cornet T 조건을 만족한 채 세 줄을 삭제

 

 - Back-to-Back : Tetris와 t-spin이 일어났을 때 이전에도 Tetris나 t-spin이었다면 Back-to-Back 상태가 됩니다.

   * Back-to-Back 상태에 대한 보상은 Line clear로 인한 점수, 상대방 추가 공격 등으로 나타납니다.

 

 - Combo : line clear를 수행 후 다음 mino에서도 line clear가 수행되면 Combo의 숫자가 올라간다.

   * Combo의 숫자가 올라갈 수록 보상을 받는다.

 


Timing Handling

이하는 Tetr.io에서 주로 사용되는 Handling과 관련된 부분들의 요구사항입니다.

 

 - Gravity : 자동으로 Drop되는 것을 의미.

   * 1G는 1frame(=1/60초)당 1칸 떨어지는 단위이며, 보통은 1초에 한 칸 떨어지는 1/60G(= 0.0167G)가 기본값이다.

 

 - ARE(あれ) : lockdown되고 다음 생성까지 delay되는 시간

 

 - DAS(Delayed Auto Shift) : 왼쪽, 오른쪽, 아래 키를 꾹 누른 후 해당 방향으로 자동 이동될 때까지 걸리는 시간

 

 - ARR(Automatic Repeated Rate) : 좌우로 자동 이동될 때 한 칸 이동하는 시간

 

 - SDF(Soft Drop Factor) : 아래로 자동 이동될 때 걸리는 시간. 보통은 Gravity의 배속으로 표현한다.

 

 


정리

이 모든 요구사항을 정리하면 다음과 같이 묶을 수 있습니다.

 

1. Tetrion : playfield area(10x20), hidden playfield(10x40) area, hold area, preview area

2. Tetromino : shape, color, 7-bag random generator, center position, init position

3. Movement : left, right, softdrop, hard drop, SRS

4. Keyboard event : right, left, rotation, hold, soft/hard drop, press key long/short time.

5. Application life cycle : Application start reference alarm, setting parameter, tetris start

6. Tetris life cycle : game start, pause, end

7. game mode : marathon, sprint, Ultra mode

8. Tetris hold system

9. Tetris ghost system

10. sound system

11. line clear : block remove, score, combo, t-spin, back-to-back

12. Timing Handling : lock delay, gravity, ARE, DAS, ARR, SDF

 

영어가 익숙하지 않으신 분들을 위해 번역하면 다음과 같습니다.

 

1. 테트리온 : 놀이공간 영역(10x20), 숨겨진 영역(10x40), 홀드 영역, 미리 보기 영역

2. 테트로미노 : 모양, 색깔, 7가방 랜덤 생성, 중심위치, 시작위치

3. 이동 : 좌, 우, 소프트 드랍, 하드 드랍, 초회전체계

4. 키보드 이벤트 : 좌, 우, 회전, 홀드, 소프트드랍, 하드 드랍, 길게/짧게 누르기

5. 프로그램 주기 : 프로그램 시작시 참조 문구 알람, 설정값 설정, 테트리스 시작

6. 테트리스 주기 : 게임 시작, 멈춤, 끝

7. 게임 모드 : 마라톤, 스프린트, 울트라 모드

8. 테트리스 홀드 시스템

9. 테트리스 고스트 시스템

10. 사운드 시스템

11. 라인 삭제 : 블럭 삭제, 점수, 콤보, 티스핀, 백투백

12. 타이밍 다루기 : 락 지연, 중력, 락 되고 다음 생성까지의 지연시간(ARE), 자동 이동까지 걸리는 키보드 누르는 시간(DAS), 좌우로 자동 이동될 때 한 칸 이동하는 시간(ARR), 아래로 자동 이동할 때의 속도(SDF)

 

엄청 많아 보였지만, 사실상 이 12개 Category에 정리되었습니다. 만약에 요구사항이 추가가 된다면 이 12개에 속하는 항목인지, 아니면 13번째 category를 추가해야 하는지를 쉽게 알 수 있습니다.

 

다음시간에는 이 요구사항들로 코드 초안을 작성해 보도록 하겠습니다.

 

 


* reference

https://tetris.wiki/TETR.IO

https://hse30.tistory.com/82

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