안녕하세요
이번 강좌에서는 깜빡거리는 커서를 숨기고, 헤더파일을 분할하는 작업을 진행하도록 하겠습니다.
[목차]
1. 커서 숨김처리
2. 헤더파일 분할하기
[1 커서 숨김처리]
깜빡거리는 커서를 없애보도록 하겠습니다.
init 함수 기억하시나요?
콘솔창의 크기를 설정하고 창 제목을 설정하던 부분이 있는 함수였습니다.
프로그램의 초기화를 담당하는 함수였죠
커서를 숨기는 기능은 한번만 실행되면 되기때문에 이 init 함수 내에 구현할것입니다.
저기 보이는 5줄을 init 함수에 추가합니다.
실행시켜보면 깜빡이던 커서가 실종사라졌다는것을 알 수 있습니다.
[2 헤더파일 분할하기]
지금까지는 main.c(혹은 다른이름) 소스코드에 모든 코드가 작성되어있습니다.
소스코드 100줄은 충분히 넘겼을거라고 생각합니다.
생각해보면 별거아니지만 금방금방 불어나고있습니다.
코드가 길어질수록 한 파일에 집중적으로 작성하는것은 옳지못합니다.
관리하기도 까다롭고 찾기 또는 수정할때 비효율적이기 때문입니다.
이번 챕터에서는 코드가 어느정도 구현되었고 핵심 기능인 게임로직을 구현하기전에
소스코드 청소를 한번 할까합니다.
귀찮으니까 하기싫다!
하시는분은 넘어가셔도 좋습니다.
(다만 절대로 좋은 습관이 아닙니다.)
저는 아래와 같이 파일을 분할할 예정입니다.
현재(파일 1개)
main.c
분할 후(파일 6개)
main.c
main.h
game.c
game.h
util.c
util.h
벌써 귀찮음이 몰려오시나요?
하지만 한번 잘 정리해두면 이후에 고생할일이 줄어듭니다.
(삽질은 계속된다..)
간단하게 정리를 미리 해보자면 아래와 같습니다.
main.c 는 메인함수가 있으며 별다른 기능을 하지않습니다.
main.h 는 프로그램에 필요한 헤더파일 및 전처리코드가 작성될 예정이고
game.c 가 실제 게임로직을 담당할 소스코드입니다. (중심)
util.c 에는 gotoxy와 색깔 변경함수(추후에 추가예정)가 구현될 부분이구요
game.h, util.h 에는 함수 정의 및 기타 내용이 작성될 예정입니다.
본격적으로 시작해보도록하죠
체크한 부분에 마우스 우클릭 > 새 파일(New file)
을 누르면 새로운 파일이 생성됩니다.
Ctrl + S 또는 저장을 하면 파일 이름을 물어봅니다.
main.h / game.c / game.h / util.c / util.h
위의 파일들을 모두 생성해둡니다.
위와같이 모든 파일을 생성하였으면 분할하는 작업을 시작할 준비가 되었습니다.
먼저 main.c / main.h 입니다.
main.c 의 헤더파일 선언 부분을 잘라내기합니다.
현재는 2개의 헤더파일이 인클루드되어있습니다.
이 부분을 복사하고 지워줍니다.
그리고 위와같이 하나 작성해줍니다.
main.h로 와서 코드를 작성합니다.
아까 복사해둔 stdio.h 헤더파일과 windows.h 헤더파일을 인클루드해줍니다.
그런데 처음보는게 있죠?
당황하지 않으셔도 됩니다.
1~6까지 세트
8~13까지 세트입니다.
#ifndef 전처리기는 만약 정의되어있지 않으면 아래 내용을 진행합니다.
#endif 까지 진행합니다.
한줄씩 설명해드리도록 하겠습니다.
#ifndef __STDIO_H__
__STDIO_H__ 라는 매크로가 정의되어있지 않으면
#define __STDIO_H__
__STDIO_H__ 를 정의한다
#include <stdio.h>
stdio.h 헤더파일을 선언한다
#endif
ifndef 종료
#ifndef ~ #endif 까지 하나의 묶음이라고 보시면됩니다.
처음 컴파일할때 __STDIO_H__ 가 당연히 정의되어있지 않으므로 아래로 내려가서
__STDIO_H__ 를 정의합니다.
그리고 stdio.h 헤더파일도 선언합니다.
그리고 종료.
어려운건 없습니다.
위와같이 헤더파일을 선언하는 이유는
중복선언을 방지하기 위한 방법입니다.
만약 main.h가 두번 선언되었다고 가정합니다.
처음 컴파일할때에는 __STDIO_H__ 가 선언되지 않았으므로 아래로 내려가서 선언을 하게됩니다.
그러다가 또 두번째로 main.h 를 컴파일할때에는 방금 _STDIO_H__ 를 선언하였기때문에
안에있는 부분은 컴파일하지 않게되죠
이러한 방식으로 중복선언을 방지할 수 있습니다.
__STDIO_H__ 뿐만아니라 아래에 __WINDOWS_H__도 같습니다.
__STDIO_H__ 대신 원하는 매크로로 변경하셔도 상관없습니다.
그 다음으로는 game.c / game.h 입니다.
main.c에 선언 및 구현되어있던 함수 중
keyControl
titleDraw
menuDraw
infoDraw
함수를 아래와같이 game.c 로 모두 옮깁니다.
선언부분은 따로 game.h 로 옮길 예정입니다.
소스코드 맨 위에는 game.h 를 인클루드해주세요
game.h에서는 main.h를 인클루드해주시고 키보드값을 정의합니다.
#ifndef 로 위 사진처럼 한번만 정의하게 하셔도 됩니다.
그리고 아래에는 함수 선언한 부분을 작성해주시면 됩니다.
이제 마지막으로 util.c / util.h 입니다.
util.c 에는 init 함수와 gotoxy의 구현부분을 작성해줍니다.
상단에 util.h 를 인클루드해주세요
util.h
main.h 를 인클루드해주시고 함수 선언부분을 헤더파일에 작성하시면 됩니다.
이제 파일분할은 모두 마쳤습니다.
main.c 에 모든 코드가 있었지만 지금은 크게 줄어든 모습을 확인하실 수 있습니다.
(main.c 의 코드 전체)
각각의 파일로 나누어졌기때문에 기능 또는 성격별로 소스코드가 정리되어있습니다.
game.c 에는 게임관련 코드
util.c 에는 유용한(기능적인) 코드가 작성되어있습니다.
이렇게 분할해두면 관리하기 더욱 편리해집니다.
실행시켜보면 정상적으로 실행되는 모습을 확인하실 수 있습니다.
[ 현재까지 진행한 내용 첨부파일 ]
위 첨부파일에는 파일 분할작업을 마친 소스코드가 포함되어있습니다.
(중간업로드)
여러분들이 작성한 코드로 계속 진행하시면 됩니다.
혹시 문제가 발생하였을 경우에는 위 소스코드를 사용하시면 됩니다.
다음 강좌에서는 맵 구현방법 및 맵 선택기능에대해 알아보도록 하겠습니다.
감사합니다.