게임 세상을 위한 데이타 정의하기

폼에 대해 더 이해하기 위해, 폼으로 우리가 만들 게임 세상을 데이타화 시켜봅시다.

우선, 게임에는 플레이어가 집고 사용가능한 오브젝트(Object)들이 있습니다 - 이러한 오브젝트들을 정의해 봅시다:

(def 상수_리스트_모든오브젝트 '(:위스키병 :양동이 :개구리 :사슬))

자, 이제 이 줄을 분석하고 그 의미를 살펴봅시다: 리스프 컴파일러는 항상 코드 모드에서 읽기 시작하고 형식을 기대하기 때문에 첫 번째 기호인def를 명령어 라고 간주합니다. def는 define 즉 정의하다의 약자입니다. 이 명령어는 주어진 값으로 변수를 설정합니다: 변수 이름은 상수_리스트_모든오브젝트이며, 키워드로된 오브젝트들이 리스트안에 들어있습니다. 편의상 변하지 않는 변수 이름 앞에 상수_를 붙였습니다. 이 리스트는 데이타이므로, :위스키병가 명령어로써 실행되지 않게 하기 위해 컴파일러를 데이타 모드로 변환시킬 필요가 있습니다. 리스트 앞의 붙은 따옴표(')는 컴파일러를 변형시키기 위한 명령어입니다.

오브젝트 이름 앞에 콜론(:)이 붙어 있는데, 클로저(Clojure)언어에서는 이를 키워드(keyword)라 합니다. 키워드는 심볼(symbol)에 비해 비교하는 연산에서 빠릅니다.

이제 게임 세상에 쓰일 오브젝트들을 정의해 봤습니다. 이제 더 나아가서 게임 세상의 지도를 정의해 보겠습니다. 여기에 게임 세상이 어떻게 생겼는지 나와있는 그림이 있습니다:

이 간단한 게임에는 3개의 다른 장소가 있습니다: 거실다락방을 가진 집이 있으며 그리고 정원도 있습니다.

이제 게임 세상을 표현하는 상수_전체지도라는 새로운 변수를 정의해 봅시다:

(def 상수_전체지도
  {:거실
   {:설명
    "[마법사의 집 - `거실`]: `마법사`가 소파에 코를 골며 자고있다."
    :사전_경로 {:서쪽 [:문 :정원]
                :위층 [:계단 :다락방]}}

   :다락방
   {:설명
    "[마법사의 집 - `다락방`]: 구석에 `용접`을 할 수 있는 화로가 있다"
    :사전_경로 {:아래층 [:계단 :거실]}}}

   :정원
   {:설명
    "[아름다운 `정원`]: `우물`이 앞에 보인다"
    :사전_경로 {:동쪽 [:문 :거실]}})

이 지도는 우리가 알고 싶은 세 곳에 대한 모든 중요한 내용을 담고 있습니다:

  • 장소를 나타내는 고유한 이름 (예: 거실, 다락방, 정원)
  • 그리고 그곳에서 볼 수 있는 것에 대한 간단한 설명
  • 해당 장소로의 입출입 경로의 위치와 방법.

이 변수는 더도 덜도 아닌 딱 우리가 알아야 되는 정보만을 담고 있습니다. 리스퍼는 군더더기를 빼고 보기만 해도 이해하기 쉬운 작고 간결한 코드를 작성하는 것을 좋아합니다

앞선 리스트와 달리, 괄호모양이 조금 다른것을 알 수 있습니다. 사전(dictionary)과 벡터(vector)를 사용하여 이 정보를 표현했습니다.

  • 벡터는 리스트와 비슷하지만, 중괄호 대신 대괄호([ ])로 둘러싸여 있습니다.
  • 사전(dictionary)은 키와 값으로 되어있는 컬렉션(collection)입니다. 리스트와 비슷하게 중괄호({ })로 둘러싸여 있습니다.
컬렉션기호big-O
리스트(list)( )(1 2 3)O(n)
벡터(vector)[ ][1 2 3]O(1)
사전(dictionary, 딕션어리){ }{:a 1 :b 2 :c 3}O(1)

그리고 문자열은 따옴표(" ")로 둘러싸여 있습니다.

이제 지도와 오브젝트 목록이 있으니, 각각의 오브젝트가 지도상의 장소 어디에 있는지 알 수 있는 변수를 선언해 봅시다:

(def 상수_사전_오브젝트_랑_장소
  {:위스키병 :거실
   :양동이   :거실
   :사슬     :정원
   :개구리   :정원})

여기서, 사전을 만들어서 오브젝트랑 장소를 각각 연결하였습니다. 이 사전은 오브젝트를 키로, 장소를 값으로 가지고 있습니다. 그리고 이 장소는 지도의 키로도 쓰입니다. 여기 :거실, :정원, :다락방 이라는 장소를 나타내는 세 개의 키가 있습니다.

게임 세상과 그 안에 있는 오브젝트들을 정의했으니, 이제 게임 플레이어의 장소만 남았습니다.

(def 상수_플레이어_시작_장소
  :거실)

자, 이제 게임에 쓰일 게임 커맨드들을 만들러 갑시다!

짚고넘어갈것

  • def
  • 키워드(:)
  • 리스트(( ))
  • 벡터([ ])
  • 사전({ })
  • 문자열(" ")
  • 데이터를 간결하게 추리기