본문 바로가기

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

(11)
11. [스칼라 테트리스] 07. 메인 프레임, 테트리스 패널 메인 프레임스윙 애플리케이션에서 전체 화면의 모양을 담당한다. 프레임은 내부에 다른 컨테이너를 담을 수 있는 최상위 컨테이너 중 하나로, 윈도우나 메뉴를 가지는 일반적인 데스크탑 애플리케이션에 적합하다.* 최상위 컨테이너란 다른 컨테이너에 포함되지 않고도 화면에 출력되어 독립적으로 존재할 수 있는 컨테이너이다. 메인 프레임은 가장 상단에 메뉴바가 존재하며 내부 컨테이너로 패널을 담는다. 메뉴는 위의 그림처럼 새 게임, 일시정지, 도움말 보기 그리고 게임 종료 4가지의 아이템이 존재한다. 위 창은 메뉴바에서 Help 아이템을 클릭했을 시 띄워지는 다이얼로그 창이다. 스윙에서 다이얼로그는 프레임과 마찬가지로 최상위 컨테이너 중 하나이며, 메뉴가 없는 일반적인 대화 상자 형식의 간단한 애플리케이션에 사용된다...
10. [스칼라 테트리스] 06. 게임을 진행하는 보드 컨트롤러 보드 컨트롤러보드 컨트롤러는 게임 진행을 담당하는 클래스. 테트리스는 현재 블록, 현재 블록의 고스트블록과 다음에 생성될 블록 세 개의 테트로미노 블록으로 게임을 진행된다. 이러한 블록들의 움직임과 처리를 담당하는 클래스가 보드 컨트롤러이다. 키보드 이벤트를 추가하기 위해 Reactor 트레잇의 reactions 속성을 이용한다. 자세한 설명은 분석을 참조하자. 구현보드 컨트롤러는 앞서 말한 세 개의 테트로미노 블록이 필요하다. 또한 패널을 다시 그리기 위해서 패널의 인스턴스를 가져야 하며, 공간을 의미하는 보드의 인스턴스까지 필요하다. 1 2 3 4 5 6 class BoardController(val parent: TetrisPanel) extends Reactor { var board = new B..
09. [스칼라 테트리스] 05. 테트로미노를 쌓는 게임보드 지금까지 블록, 테트로미노 클래스를 개발하고 테스트했다.블록은 하나의 정사각형, 테트로미노는 4개의 블록으로 이루어진 테트리스의 기본 블록이다. 이제 테트로미노 블록이 움직이고 쌓이는 보드 클래스와 보드의 게임 동작을 제어하는 보드 컨트롤러를 구현하고보드 컨트롤러와 스윙을 이용한 패널, 프레임을 개발하면 싱글 테트리스는 완성된다.이번에는 테트로미노를 쌓는 게임보드 클래스를 구현해보자. 게임보드 스칼라 테트리스의 기본 실행화면은 위의 사진과 같다.메인프레임 내의 패널, 점수판, 메뉴바가 존재한다.게임보드 클래스는 왼쪽 검정색 패널에서 테트로미노 블록을 이동시키고, 쌓기 위한 공간을 의미한다. 앞에서 (x, y) 튜플의 2차원 배열로 블록의 포지션을 정의하고,테트로미노 블록의 회전값과 위치를 정의한 이유가 ..
08. [스칼라 테트리스] 04. 4개의 블록을 표현하는 테트로미노 이번에는 테트로미노를 구현해보자.블록과 테트로미노가 헷갈릴 수 있기 때문에 다시 한번 정리하고 넘어가겠다. 블록블록은 하나의 정사각형을 의미한다.블록은 T, Z, S 등 7가지의 종류와 EMPTY라는 빈 블록으로 분류된다. 테트리스라는 게임에서 블록을 회전시켜 모양을 변경할 수 있기 때문에 각각의 블록은 4가지 다른 모양을 가져야 한다.블록이 가진 모양은 4개의 튜플(점)으로 구현한다. (T의 경우 (0, 0), (1, 0), (-1, 0), (0, -1)) 테트로미노테트로미노는 4개의 정사각형(블록)으로 이루어진다. 4개의 블록으로 구성되지만 블록의 종류는 같아야 한다.하나의 테트로미노가 L, T, EMPTY, T 이런 식으로 구성되는 것은 말이 안되기 떄문이다.따라서 하나의 테트로미노 객체에는 하나의..
07. [스칼라 테트리스] 03. 블록 클래스 구현, 테스트 스칼라 테트리스 github 이제 본격적으로 테트리스 코드를 작성하고, 테스트 케이스를 만든다.지금까지 코드를 작성하고 일일히 메소드를 실행하면서 테스트를 진행했다.하지만, 이는 나 혼자만 알고있는 테스트 과정으로, 남들은 이 코드가 올바르게 동작하는 지 알 수 없다. 테스트 케이스를 작성해 본 적이 없고, 영어가 많이 부족하기 때문에 힘들겠지만...이번에는 하나의 클래스를 만들고 메소드마다 테스트 케이스를 작성하는 방식으로 진행하려고 한다. 스칼라는 scalatest 라는, 자바의 JUnit과 같은 테스트 라이브러리가 존재한다.이 라이브러리는 여러가지 테스팅 스타일을 제공한다.이 테스팅 스타일 중 나는 FlatSpec라는 스타일을 선택했다. 123456789101112131415import org.sc..
06. [스칼라 테트리스] 02. 프로젝트 생성 SBT스칼라 프로젝트를 만들고 빌드하기 위해서는 SBT(Simple Build Tool)라는 툴이 필요하다.SBT는 최신 빌드 도구 중 하나로, 스칼라로 작성되어 사용하기 편한 기능을 제공하는 범용 빌드 도구이다.나머지 자세한 설명은 위의 링크를 클릭하여 읽어보길 바란다. SBT를 설치한 뒤, 환경변수를 등록해야 한다.윈도우 기준으로 윈도우 키 + r를 누르면 실행 창이 나타나는데, sysdm.cpl 을 입력해보자. 그럼 시스템 속성을 설정할 수 있는 창이 나타난다.고급탭에서 환경 변수(N)... 버튼을 클릭하면 환경 변수를 등록할 수 있는 창이 나타난다.시스템 변수에서 Path로 등록되어 있는 변수를 찾아서 편집을 클릭하자.환경 변수 편집창에서 "SBT 설치 경로\bin"을 등록하면 커맨드라인 창에서 ..
05. [스칼라 테트리스] 개발시작 01. GUI 라이브러리 비교와 전체구조 자바 스윙기반의 스칼라 싱글 테트리스에 대한 분석을 마쳤다.이제 이를 기반으로 나만의 프로그램을 어떻게 만들 것이며, 무엇이 필요한지에 대한 정리가 필요하다.Swing 의 단점이 무엇일까?학창 시절, 스윙의 단점은 속도에 있다고 배웠다.스윙 기반의 가상 윈도우를 만들었는데, 속도가 굉장히 느렸다.실행 시 메모리를 너무 많이 차지한다.속도는 시간이 해결해준다?1995년 자바가 처음 등장했을 때부터 제기되었다.아직까지 해결이 안되었다.8년? 10년 뒤에도 같은 문제가 제기될 것이다.비주얼 베이직보다 느린 스윙을 선호하는 사용자는 별로 없다.초기 Java 설계 시 함수 포인터의 개념을 빼서 오직 인터페이스만을 이용해서 Event Driven을 만들어야 한다.코드가 길어진다.재사용이 어렵다.단점이라고 하긴 뭐하..
04. [스칼라 테트리스] GUI, 스윙 컴포넌트 이벤트 분석 -2- 이번에는 이벤트를 감지하여 블록의 움직임, Row 클리어, 화면 갱신, 게임 오버 등의 동작을 발생시키는 클래스들을 분석할 차례이다.Board 라는 클래스에서 2차원 배열로 Block을 담는다.1차원은 Board의 y, 2차원은 Board의 x를 표현한다.Board 클래스는 이름이 같은 짝 객체(Companion Object를 갖는다)보통 팩토리를 만들 때 짝 객체를 사용한다. 123456class Bar(foo: String) object Bar { def apply(foo: String) = new Bar(foo)}// Bar()를 이용하여 'new' 키워드를 사용하지 않고 새 객체를 만들 수 있다.cs width, height를 속성으로 갖는다.EmptyBoardRow 속성은 보드의 width만큼 ..