시작하기 전에...
테트리스(Tetris) 만들기 (10) 에서 요구사항을 분석한 결과, 아래와 같은 결론을 얻을 수 있었습니다.
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)
사실 테트리스의 버전마다 조금씩은 다르지만, 그래도 이 정도면 웬만한 테트리스를 플레이하는데 문제가 없을 것입니다.
그리고 이렇게 요구사항을 정리하고 설계를 하면, 나중에 추가 요구사항이 들어왔을 때 적용하기가 매우 수월합니다.
프로그램 주기와 테트리스 주기 Diagram
기존에는 테트리스 주기만을 따졌을 때의 Diagram만을 그렸었습니다.
하지만, 이제는 제대로 된 테트리스로 확장하게 되었으므로 좀 더 많은 기능을 설명할 수 있는 Diagram이 필요합니다.
예를 들면, 응용 프로그램(Application)에서 설정값을 변경하고, 그것이 게임에 적용되어야 하며, 게임이 꺼졌다 켜져도 저장이 되어있는 등, 테트리스 게임의 외적으로도 동작할 수 있는 Diagram이 필요합니다.
이런 점들을 반영하면, Diagram을 아래와 같이 그릴 수 있습니다.
많이 복잡해졌죠? 하지만 이렇게 미리 구현할 요소를 확인해야 헤매지 않습니다.
Execute와 Exit을 빼고 나머지를 확인해 보겠습니다.
1. Main Screen: 프로그램을 시작하면 볼 수 있는 화면. Setting page, Tetris application, exit을 실행할 수 있다.
2. Setting Screen: 테트리스의 설정값을 관리
3. Parameter storage : 프로그램에서 Setting 한 값을 저장하는 장소
4. Play Screen : 테트리스를 실제로 실행하는 영역.
5. Pause Screen : 테트리스를 멈춘 화면. 재시작, 중간시작, Setting값 변경, Application 종료 기능을 지원한다.
6. Score Record Storage : 게임 플레이의 점수를 기록해서 저장. 현재로서는 Top Score만 저장할 예정이다.
이 Diagram은 State 관리의 Diagram입니다. 이전 Diagram에서는 Event, Backend, Display가 주를 이루었는데, 이 3가지 요소는 위의 Diagram에서 사라진 것이 아니라 모든 Applcation에 속해 있다고 생각하면 됩니다.
이제 이 Diagram을 코딩해 보겠습니다.
Diagram대로 Main Application 코딩하기
간단하게 main application을 작성해 보았습니다.
import pygame as pg
class MainDisplay:
def __init__(self, width, height):
self.width, self.height = width, height
self.display_surface = None
def init(self):
self.display_surface = pg.display.set_mode((self.width, self.height))
def update(self):
pass
class MainSystem:
def __init__(self):
pass
def init(self):
pass
class MainApp:
def __init__(self, width: int, height: int):
self.width, self.height = width, height
self.display = MainDisplay(width, height)
self.system = MainSystem()
self.tetris_app = None
self._running = False
def _init(self):
pg.init()
self.display.init()
self.system.init()
self._running = True
def _event(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self._running = False
elif event.type == pg.KEYDOWN:
print(event.key)
def _quit(self):
pg.quit()
def execute(self):
self._init()
while self._running:
self._event()
self.display.update()
self._quit()
def main():
main_app = MainApp(640, 480)
main_app.execute()
if __name__ == "__main__":
main()
그리고 저장할 storage는 json format으로 정했습니다. score.json과 setting.json를 생성했습니다.
* DB가 될 수도 있고 csv가 될 수도 있습니다. 각자 익숙하신 것을 사용하면 됩니다.
다음 시간에는 Main Screen을 만들어보는 시간을 가지겠습니다.
'Development > Tetris' 카테고리의 다른 글
Python - 테트리스(Tetris) 만들기 (13) - Setting Screen (0) | 2023.03.27 |
---|---|
Python - 테트리스(Tetris) 만들기 (12) - Main Screen (0) | 2023.03.26 |
Python - 테트리스(Tetris) 만들기 (10) - Requirement (0) | 2023.03.20 |
Python - 테트리스(Tetris) 만들기 (9) - Refactoring (0) | 2023.03.09 |
Python - 테트리스(Tetris) 만들기 (8) - Field (0) | 2023.03.09 |