본문 바로가기

Development/Tetris

Python - 테트리스(Tetris) 만들기 (11) - Diagram

시작하기 전에...

테트리스(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을 아래와 같이 그릴 수 있습니다.

 

Main Screen에 접속해서, Setting 값 설정, Tetris Application실행, 종료 등을 담은 Digram이다.

 

 

많이 복잡해졌죠? 하지만 이렇게 미리 구현할 요소를 확인해야 헤매지 않습니다.

 

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가 될 수도 있습니다. 각자 익숙하신 것을 사용하면 됩니다.

json으로 값을 관리한다.

 

다음 시간에는 Main Screen을 만들어보는 시간을 가지겠습니다.