목표

C/기초 알고리즘/검색 등을 활용해서 프로젝트를 완성해보자.

그래픽 디자인 프로젝트로 windows, colors, events, textures 등의 기술을 익힐 수 있다.


공통 지침

  1. norm 체크
  2. seg faults, bus error, double free 등으로 예상치 못하게 종료하는 일이 없어야 한다. 발생시 0점
  3. 메모리 누수 체크
  4. 문제에서 Makefile 요구 시 -Wall -Wextra -Werror 플래그를 붙여서 컴파일해야 하고, 메이크파일 리링크 문제가 없어야 한다.
  5. 메이크파일에 최소한 $(NAME), all, clean, fclean, re 의 규칙이 있어야 한다.
  6. 보너스 제출을 위해서는 메이크파일에 bonus 규칙을 추가해야 한다. bonus 규칙을 통해 프로젝트의 메인 파트에서 금지되었던 여러 헤더, 라이브러리, 함수 등을 추가할 수 있다. 보너스는 _bonus.{c/h}로 끝나는 필수 파트와 구분되는 파일이어야 한다. 필수 파트와 보너스 파트는 구분되어 평가된다.
  7. libft가 허용되면 libft의 소스와 연관된 메이크파일을 libft폴더에 두어야 한다. 전체 프로젝트의 메이크파일은 라이브러리의 메이크파일을 이용해 컴파일하고 난 다음에 프로젝트를 컴파일해야 한다.
  8. 테스트 파일을 제출하거나 평가하지는 않지만 만들어서 테스트하는 것을 장려한다. 이를 통해 너의 작업물이나 동료의 작업물을 쉽게 테스트해볼 수 있다. 디펜스할 때 특히 유용. 디펜스에서 너나 동료의 테스트를 자유롭게 사용해도 된다.
  9. 할당된 깃 레포짓에 작업물을 제출해라. 깃 레포짓에 제출된 작업물만 평가될 것이다. Deepthought가 평가를 해야 한다면 동료 평가가 끝난 뒤에 할 것이다. Deepthought의 평가 과정에서 오류가 발생하면 평가는 중단된다.

필수 파트

  1. 프로그램 명 : so_long
  2. 제출 파일 : 모든 관련 파일
  3. 메이크파일 : all, clean, fclean, re, bonus
  4. 인자(arguments) : *.ber 형식의 map
  5. 외부 함수 : open, close, read, write, malloc, free, perror, strerror, exit \& MinilibX의 모든 함수
  6. Libft 허용 여부 : Yes
  7. 설명 : 돌고래가 약간의 물고기를 먹은 후 지구를 탈출하는 소규모 2D 게임을 만들어야 한다. 아니면 어떤 히어로가 장소를 떠나기 전에 가치가 있는 것들을 챙겨가는 게임을 만들어야 한다.

제약은 다음과 같다.

  1. miniLibX를 사용’해야만’ 한다. os에서 가능한 버전도 괜찮고 소스에서 받아온 버전도 괜찮다. 소스에서 받아온 버전이라면 ‘공통 지침’ 파트의 libft와 동일한 규칙을 적용해야 한다.
  2. window의 management는 smooth해야 한다 : 다른 window로 전환, minimizing 등등.
  3. 예시는 돌고래 테마로 주어졌지만 사용하고 싶은 어떤 것을 사용해도 무방하다.
  4. 맵은 벽(walls), 수집품(collectibles), 빈 공간(free spaces)의 세 가지 구성요소로 이루어진다.
  5. 플레이어의 목표는 맵 상의 모든 가능한 수집품을 모으고 탈출하는 것을 최소한의 움직임을 통해 하는 것이다.
  6. 매 이동마다 쉘 상에 현재까지의 이동 횟수가 띄워져야 한다.
  7. 플레이어는 상, 하, 좌, 우로 이동할 수 있다.
  8. 2D 뷰를 사용할 것이다.(top-down or profile)
  9. 게임이 실시간일 필요는 없다.
  10. 플레이어는 벽 안으로 이동할 수 없다.
  11. 프로그램은 창에 이미지를 띄우고 다음의 규칙을 따라야 한다. :

    • W, A, S, D를 통해 메인 캐릭터를 움직일 수 있다.
    • ESC를 통해 창을 닫고 프로그램을 종료할 수 있어야 한다.
    • 창 프레임의 적색 크로스를 클릭함으로써 창을 닫고 프로그램을 종료할 수 있어야 한다.
    • minilibX의 이미지를 사용하는 것을 강력하게 추천한다.
  12. 프로그램은 .ber 확장자의 맵 디스크립션 파일을 첫번째 인자로 받아야 한다.

    • 맵은 다음의 다섯 가지 문자로만 이루어져 있어야 한다. 빈 공간에는 ‘0’, 벽에는 ‘1’, 수집품에는 ‘C’, 출구에는 ‘E’, 플레이어의 시작 포지션에는 ‘P’. 다음은 유효한 맵의 간단한 예시이다.
    1111111111111
    10010000000C1
    1000011111001
    1P0011E000001
    1111111111111
    
    • 맵은 벽들로 쌓여 있거나 닫혀 있어야 하며 그렇지 않은 경우 프로그램은 에러를 반환해야 한다.
    • 맵은 최소한 한 개의 출구, 한 개의 물고기, 한 개의 시작 지점을 가져야 한다.
    • 맵에 유효한 경로가 있는지 체크할 필요는 없다.
    • 맵은 직사각형이어야만 한다.
    • 맵의 규칙을 따르는 맵인 경우, 어떤 종류의 맵이라도 파싱할 수 있어야 한다.
    • 또 다른 .ber 맵의 예시이다.
    1111111111111111111111111111111111
    1E0000000000000C00000C000000000001
    1010010100100000101001000000010101
    1010010010101010001001000000010101
    1P0000000C00C0000000000000000000C1
    1111111111111111111111111111111111
    
    • 파일에 어떠한 잘못된 구성이라도 발견되는 경우 프로그램은 적절하게 종료되고 “Error\n”와 너가 선택한 명백한 오류 메세지를 반환해야 한다.

보너스 파트

! : 보너스는 필수 파트가 완벽한 경우에만 채점된다. 완벽이라는 말은 프로그램 사용자가 끔찍하게 잘못 사용한 경우에도 프로그램이 실패해서는 안 된다는 의미. 필수 파트에서 모든 점수를 얻지 못하는 경우 보너스 파트는 완벽히 무시될 것.

다음은 보너스 목록 :

  1. 마주치면 패배하게 되는 순찰하는 적들을 만들기
  2. 스프라이트 애니메이션 넣기
  3. 이동 횟수가 쉘 출력이 아니라 스크린 상에 직접적으로 나타나게 하기

※ 나중에 더 나은 게임을 만들테니 너무 많은 시간을 쏟지 마라.


예시

문제지 참고