so_long 시작 전 톺아보기
목표
C/기초 알고리즘/검색 등을 활용해서 프로젝트를 완성해보자.
그래픽 디자인 프로젝트로 windows, colors, events, textures 등의 기술을 익힐 수 있다.
공통 지침
- norm 체크
- seg faults, bus error, double free 등으로 예상치 못하게 종료하는 일이 없어야 한다. 발생시 0점
- 메모리 누수 체크
- 문제에서 Makefile 요구 시 -Wall -Wextra -Werror 플래그를 붙여서 컴파일해야 하고, 메이크파일 리링크 문제가 없어야 한다.
- 메이크파일에 최소한 $(NAME), all, clean, fclean, re 의 규칙이 있어야 한다.
- 보너스 제출을 위해서는 메이크파일에 bonus 규칙을 추가해야 한다. bonus 규칙을 통해 프로젝트의 메인 파트에서 금지되었던 여러 헤더, 라이브러리, 함수 등을 추가할 수 있다. 보너스는 _bonus.{c/h}로 끝나는 필수 파트와 구분되는 파일이어야 한다. 필수 파트와 보너스 파트는 구분되어 평가된다.
- libft가 허용되면 libft의 소스와 연관된 메이크파일을 libft폴더에 두어야 한다. 전체 프로젝트의 메이크파일은 라이브러리의 메이크파일을 이용해 컴파일하고 난 다음에 프로젝트를 컴파일해야 한다.
- 테스트 파일을 제출하거나 평가하지는 않지만 만들어서 테스트하는 것을 장려한다. 이를 통해 너의 작업물이나 동료의 작업물을 쉽게 테스트해볼 수 있다. 디펜스할 때 특히 유용. 디펜스에서 너나 동료의 테스트를 자유롭게 사용해도 된다.
- 할당된 깃 레포짓에 작업물을 제출해라. 깃 레포짓에 제출된 작업물만 평가될 것이다. Deepthought가 평가를 해야 한다면 동료 평가가 끝난 뒤에 할 것이다. Deepthought의 평가 과정에서 오류가 발생하면 평가는 중단된다.
필수 파트
- 프로그램 명 : so_long
- 제출 파일 : 모든 관련 파일
- 메이크파일 : all, clean, fclean, re, bonus
- 인자(arguments) : *.ber 형식의 map
- 외부 함수 : open, close, read, write, malloc, free, perror, strerror, exit \& MinilibX의 모든 함수
- Libft 허용 여부 : Yes
- 설명 : 돌고래가 약간의 물고기를 먹은 후 지구를 탈출하는 소규모 2D 게임을 만들어야 한다. 아니면 어떤 히어로가 장소를 떠나기 전에 가치가 있는 것들을 챙겨가는 게임을 만들어야 한다.
제약은 다음과 같다.
- miniLibX를 사용’해야만’ 한다. os에서 가능한 버전도 괜찮고 소스에서 받아온 버전도 괜찮다. 소스에서 받아온 버전이라면 ‘공통 지침’ 파트의 libft와 동일한 규칙을 적용해야 한다.
- window의 management는 smooth해야 한다 : 다른 window로 전환, minimizing 등등.
- 예시는 돌고래 테마로 주어졌지만 사용하고 싶은 어떤 것을 사용해도 무방하다.
- 맵은 벽(walls), 수집품(collectibles), 빈 공간(free spaces)의 세 가지 구성요소로 이루어진다.
- 플레이어의 목표는 맵 상의 모든 가능한 수집품을 모으고 탈출하는 것을 최소한의 움직임을 통해 하는 것이다.
- 매 이동마다 쉘 상에 현재까지의 이동 횟수가 띄워져야 한다.
- 플레이어는 상, 하, 좌, 우로 이동할 수 있다.
- 2D 뷰를 사용할 것이다.(top-down or profile)
- 게임이 실시간일 필요는 없다.
- 플레이어는 벽 안으로 이동할 수 없다.
-
프로그램은 창에 이미지를 띄우고 다음의 규칙을 따라야 한다. :
- W, A, S, D를 통해 메인 캐릭터를 움직일 수 있다.
- ESC를 통해 창을 닫고 프로그램을 종료할 수 있어야 한다.
- 창 프레임의 적색 크로스를 클릭함으로써 창을 닫고 프로그램을 종료할 수 있어야 한다.
- minilibX의 이미지를 사용하는 것을 강력하게 추천한다.
-
프로그램은 .ber 확장자의 맵 디스크립션 파일을 첫번째 인자로 받아야 한다.
- 맵은 다음의 다섯 가지 문자로만 이루어져 있어야 한다. 빈 공간에는 ‘0’, 벽에는 ‘1’, 수집품에는 ‘C’, 출구에는 ‘E’, 플레이어의 시작 포지션에는 ‘P’. 다음은 유효한 맵의 간단한 예시이다.
1111111111111 10010000000C1 1000011111001 1P0011E000001 1111111111111
- 맵은 벽들로 쌓여 있거나 닫혀 있어야 하며 그렇지 않은 경우 프로그램은 에러를 반환해야 한다.
- 맵은 최소한 한 개의 출구, 한 개의 물고기, 한 개의 시작 지점을 가져야 한다.
- 맵에 유효한 경로가 있는지 체크할 필요는 없다.
- 맵은 직사각형이어야만 한다.
- 맵의 규칙을 따르는 맵인 경우, 어떤 종류의 맵이라도 파싱할 수 있어야 한다.
- 또 다른 .ber 맵의 예시이다.
1111111111111111111111111111111111 1E0000000000000C00000C000000000001 1010010100100000101001000000010101 1010010010101010001001000000010101 1P0000000C00C0000000000000000000C1 1111111111111111111111111111111111
- 파일에 어떠한 잘못된 구성이라도 발견되는 경우 프로그램은 적절하게 종료되고 “Error\n”와 너가 선택한 명백한 오류 메세지를 반환해야 한다.
보너스 파트
! : 보너스는 필수 파트가 완벽한 경우에만 채점된다. 완벽이라는 말은 프로그램 사용자가 끔찍하게 잘못 사용한 경우에도 프로그램이 실패해서는 안 된다는 의미. 필수 파트에서 모든 점수를 얻지 못하는 경우 보너스 파트는 완벽히 무시될 것.
다음은 보너스 목록 :
- 마주치면 패배하게 되는 순찰하는 적들을 만들기
- 스프라이트 애니메이션 넣기
- 이동 횟수가 쉘 출력이 아니라 스크린 상에 직접적으로 나타나게 하기
※ 나중에 더 나은 게임을 만들테니 너무 많은 시간을 쏟지 마라.
예시
문제지 참고