본문 바로가기

OOP, FP/스칼라로 만드는 테트리스

01. [스칼라 테트리스] 오픈 소스, 전체 클레스 분석

스칼라로 작성된 싱글 테트리스


스칼라로 테트리스를 만들어 보려고 한다.

  1. 이 서비스와 유사한 서비스와 앱을 검색해서 알아보고 정리한다.

    1. 깃헙에서 Scaltris라는 프로젝트를 발견했다.

    2. 해당 프로젝트는 1인용 테트리스 게임이다.

  2. 코드의 흐름을 분석한다.

    1. 실행 방법

      1. 우선 실행을 위해선 sbt 1.0이상의 버전이 필요하다.

      2. sbt 1.0.2를 설치한 뒤 프로젝트 디렉터리에서 sbt run 명령어를 실행하니 문제없이 실행되었다.

    2. 프로젝트 설정 방법

      1. 이클립스에 scala plugin을 설치한다.

      2. sbt에 이클립스 플러그인을 추가한 뒤 sbt eclipse 명령어를 입력하면 프로젝트를 이클립스에 import 할 수 있다.

    3. 코드 분석 - 7개의 scala 클래스 파일이 있다.

      1. Scaltris.scala

        1. 프로그램을 처음 실행하면 시작되는 메인 클래스

        2. SimpleSwingApplication 라는 추상클래스를 상속받는다.

        3. 자바의 스윙을 스칼라로 사용하는 것으로 보아 UI는 스윙으로 구성된다.

        4. 가장 먼저 MainFrame을 생성한다.

        5. title을 문자열로, contents에는 TetrisPanel.scala의 인스턴스를 지정한다.

        6. MenuBar를 생성하여 좌측 상단에 메뉴를 생성한다.

      2. TetrisPanel.scala - 프레임에 들어있는 패널을 제어하고 내부 요소를 제어하는 클래스

        1. 메인화면에서 게임의 메인 화면으로 불러들일 패널 클래스

        2. Panel이라는 추상 클래스를 상속받는다.

        3. 컨트롤러로 BoardController 클래스를 사용한다.

        4. 패널의 크기, 색상을 설정하고, 테트로미노, 다음 테트로미노, 고스트 테트로미노와 스코어 문자를 생성한다.

        5. RescaleOp 클래스와 Tetromino 클래스를 이용해 테트로미노, 다음 테트로미노와 고스트 테트로미노를 생성한다.

        6. Graphics2D 클래스를 이용해 2D 이미지를 그린다.

        7. Reactor 클래스를 이용해 이벤트를 감지한다.

      3. BoardController.scala - 패널에 들어있는 게임 보드의 이벤트를 제어하는 클래스

        1. 테트리스 패널에서 이벤트 감지를 위해 사용되는 Reactor Trait 구현 클래스

        2. Board 클래스의 인스턴스, Tetromino 클래스의 인스턴스인 currentTetromino와 nextTetromino, GameOverAnimation 클래스의 인스턴스, 점수, 게임 진행 여부와 게임 오버 여부를 속성으로 갖는다.

        3. 움직이는 함수, 블럭이 떨어지는 함수, 블럭을 바로 떨어트리는 함수, 블럭을 멈추는 함수, 점수를 설정하는 함수를 정의하며 각각 KeyPressed 이벤트에 등록한다.

        4. ActionListener와 Timer 클래스의 인스턴스를 이용해 게임 진행을 제어한다.

        5. 게임 진행, 게임 일시정지, 게임 재개, 새 게임, 패널 다시그리기 등의 함수를 정의하며 마찬가지로 KeyPressed 이벤트에 등록한다

      4. Board.scala - 테트로미노를 담는 클래스

        1. 생성자로 Block의 3차원 Array를 받는다.

        2. 블럭 쌓기, 블럭 위치 검사, Row 클리어 등의 함수를 정의한다.

      5. Block.scala - 테트로미노의 각 Blcok (T, S, Z, O, I, L, J, EMPTY)를 담당하는 클래스

        1. 다음 블럭, 블럭 크기, 블럭 이미지, 블럭의 색, 블럭의 위치에 관련된 함수를 정의한다.

        2. ImageIO 클래스를 이용해 이미지를 로드하고 제어한다.

        3. Color 클래스를 이용해 색상을 제어한다.

      6. Tetromino.scala - 블럭을 담는 클래스

        1. 블럭의 위치, 회전, 좌우하 움직임, 블럭 복사 함수에 관련된 정의한다.

        2. 회전, 움직임은 복사 함수를 이용해서 새로운 테트로미노를 반환한다.

      7. GameOverAnimation.scala - 게임 종료와 관련된 클래스

        1. BoardController의 ActionListener에서 사용된다.

        2. ActionListener와 Timer 클래스를 이용해 게임 종료, 게임 재시작을 제어한다.


기본적인 코드의 흐름은 잡힌 것 같다.

주요 클래스는 Panel, Frame, RescaleOp, Reactor, Graphics2D, ActionListener, Timer, Array, Tuple, ImageIO, Color 정도 되는 것 같다.


다음 포팅에서는 이 프로젝트에 대해 모방할 점과 개선할 점을 정리해보고, 어떻게 프로그램을 만들지 정리해볼 계획이다.