티스토리 뷰

안녕하세요



이번 강좌에서는 프로젝트를 생성하고 메인화면을 개발해보도록 하겠습니다.





저는 Dev C++로 강좌를 진행할것입니다.

Dev C++을 설치하고싶으시면 이전 강좌를 참고하시기 바랍니다.





[목차]


1. 프로젝트 생성하기


2. 타이틀 출력하기


3. 콘솔창 크기 조절하기


4. 기능별로 함수 분할하기


5. 커서 위치 이동하는 함수 구현하기


6. 메인메뉴 구현하기










[1 프로젝트 생성하기]


Dev C++을 실행하고 왼쪽상단의 메뉴바 중 파일을 선택합니다.


파일 > 새로만들기 > 프로젝트


위와같은 창이 뜨면

콘솔 어플리케이션을 선택하시고 C(또는 C++)체크,

프로젝트명은 여러분들이 원하는것으로 정해주시면 됩니다.


그리고 확인버튼을 눌러주세요






그러면 좌측 리스트에 아래와같이 main.c 소스코드가 생성됩니다.






메인 함수부분을 아래처럼 간단히 줄여줍니다.

이제 메인화면을 출력해볼건데요


printf 함수로 출력해보도록 하겠습니다.





[2 타이틀 출력하기]



출력하고싶은 글자 또는 모양을 직접 타이핑하여 출력합니다. 

공백도 출력되므로 적절히 조절하면서 원하는 방식으로 만들어주시면 됩니다.




F11을 눌러주시면 컴파일 후 실행이 됩니다 (Dev C++ 기준)


원하는대로 출력이 될것입니다.

하지만 메뉴글자가 너무 작거나 커서 콘솔창에 잘 맞지 않습니다.


콘솔창 크기를 조절해봅시다.






[3 콘솔창 크기 조절하기]





system("mode con cols=가로 lines=세로 | title 창 제목");

을 추가해줍시다.


가로길이, 세로길이, 제목을 적절히 설정하시고 다시 F11로 컴파일 후 실행시켜보면 변경된 내용을 확인하실 수 있습니다.



위 과정까지 마쳤으면 계속 진행해봅시다.




[4 기능별 함수 분할하기]


초보자들에게는 말이 어려워보일수도 있습니다.

하지만 어려운게 아니라 종류별로 정리한다고 생각하시면 됩니다.




처음의 소스코드는 모두 메인함수안에서 작성되었습니다.


메인함수에 모두 작성하는것보다는 기능별로 함수로 나누어서 작성하는것이 더욱 효율적이고 확인하기 쉽습니다.

위와같이 함수를 나누어서 작성해봅시다.



titleDraw 함수는 타이틀 글자를 출력하는 함수이고

init 함수는 프로그램 실행 직후 초기화작업을 진행할 함수입니다.


두 함수를 메인함수에서 호출하기만하면 간단하게 사용할 수 있습니다.



이런식으로 자주 사용되는 기능을 함수로 나누어서 코드를 작성하시면 됩니다.






이제 메인화면의 타이틀이 잘 출력되었으니

메뉴를 제작해보도록 하겠습니다.


게임시작

게임정보

종료


이 세가지를 메인화면에 추가할건데요

새로운 함수가 하나 필요합니다.


콘솔게임의 가장 핵심이라고 할 수 있는 함수입니다.

커서의 위치를 직접 원하는 위치로 옮길 수 있는 함수니다.


한번 선언해두고 호출해서 사용하면 되므로 초기 작업에 미리 선언하여 사용해보도록 하겠습니다.





[5 커서 위치 이동하는 함수 구현하기]



전체 강좌의 핵심 함수입니다

한번 선언해두고 이후로도 계속 사용할 함수입니다.





맨 위에 windows.h 헤더파일 인클루드 하시고

하단에 함수를 작성하시면 됩니다.

(함수이름은 마음대로 정하셔도 됩니다. 저는 편하게 gotoxy로 했습니다. 상단에 함수선언도 추가해주세요)



매개변수는 int x, int y 두개인데요


gotoxy(3, 7)로 호출하게되면

x위치가 3, y위치가 7인 지점으로 커서가 이동하게됩니다.

이동한 위치에서 출력하는 방식으로 사용될 함수입니다.




간단한 사용법을 익히기위해 아래 코드를 추가해봅시다.


위에서 구현한 gotoxy 함수를 호출하여 사용하는 모습입니다.


x, y의 위치값을 전달하면 해당 위치로 이동하는 모습을 알 수 있습니다.

(임시 테스트이므로 확인 후에 13~16행 코드는 지워주세요)




콘솔창의 좌표는 실제 수학의 좌표와 다릅니다.

x축은 수학과 같지만

y축은 정 반대입니다.



좌측 맨 위가 0, 0 원점입니다.


x는 오른쪽으로 갈수록 증가하고

y는 아래로 갈수록 증가합니다.


x, y 둘다 0미만인 음수로 가게되면 콘솔창 범위에서 벗어나 보이지 않게됩니다.


예를들어 gotoxy(20, 13)를 호출하면 위 사진의 점선이 만나는 지점쯤으로 이동하게될것입니다.

콘솔창 좌표의 최대 범위는 위에서 창크기 지정할때의 cols, lines의 길이와 동일합니다.

최소범위는 x, y 둘다 0으로 동일합니다.



[ 이동방향 ]

왼쪽: x감소

오른쪽: x증가

아래: y증가

위: y감소



어떤식으로 사용할지 이해하셨을거라 생각합니다.

잘 숙지하시길 바랍니다.


다음으로 진행해봅시다.





[6 메인메뉴 구현하기]




커서위치를 옮기는 함수를 사용하여 메인메뉴 기능을 구현해볼것입니다.

함수를 하나 더 추가해보도록 하겠습니다.



상단에 함수를 선언하고 그 아래에서 구현(31~38행)합니다.


적당한 위치로 커서를 이동하고 게임의 메뉴를 출력하면 됩니다.


저는 게임시작, 게임정보, 종료 이 세가지만 추가하도록 하겠습니다.

함수를 구현하셨으면 메인함수에서 호출하시면 됩니다.


저는 함수이름을 menuDraw 라는 이름으로 선언하였습니다.





이런식으로 메인화면을 마음대로 만들 수 있습니다.

위치가 마음에 안든다면 gotoxy 함수에서 x, y 좌표값을 조금씩 바꿔가면서 원하는 위치를 찾으시면 됩니다.




이번 강좌는 여기까지 진행하고

다음 강좌에서 키보드를 눌렀을 때 화살표가 움직이는 기능을 구현해보도록 하겠습니다.


감사합니다.


댓글
  • 프로필사진 Thanks for you 이렇게 알아듣기 쉽고 친절한 글은 찾기 어려운데 작성자분께 매우 감사드립니다 ㅎㅎ. 그런데 보던 중 궁금한 점이 생겼는데,
    void gotoxy(int x, int y)
    {
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(consoleHandle, pos);
    }
    글 작성자 분께서는 gotoxy함수의 코드를 이렇게 작성하셨는데,

    void gotoxy(int x, int y)
    {
    COORD Pos;
    Pos.X = x;
    Pos.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);
    }
    다른 글에서는 이런 식으로 코드를 작성하셨더라구요..
    님께서 작성하신 HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);이 정확히 어떤 역할을 하는 코드인지를 잘 모르겠습니다.

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);
    는 그냥 GetStdHandle 함수를 사용했구나 하면서 그러려니 하고 넘겼는데, 님 코드는 제 기본 배경지식이 부족한건지 이해를 도통할 수 없어서 댓글을
    남깁니다.
    괜찮으시다면 도와주시면 감사하겠습니다!!
    2018.08.04 01:54
  • 프로필사진 BlogIcon 이근둥 해당 코드는 어렵게 생각하지 않으셔도 됩니다. HANDLE 이라는 자료형의 consoleHandle 이라는 변수를 선언하고 핸들을 가져온 후 변수에 대입한 코드입니다!

    다른분 코드처럼 GetStdHandle 함수를 한 줄에 한꺼번에 적어도 되지만 복잡해보이고 어려워하실수도 있어서 일부러 다른 라인으로 뺐습니다.. ㅜㅜ

    동일한 의미이니 크게 어려워하지 않으셔도 됩니다!
    2018.08.07 21:26 신고
  • 프로필사진 아하 HANDLE 구조체라고 생각했는데, HANDLE 자료형 이었군요.. HANDLE 자료형에 변수를 선언하고 그 변수에 핸들을 대입한게 놀라웠습니다ㅋㅋㅋ. HANDLE이라는 것이 F12를 눌러서 일일이 확인해봐도 이해가 되질 않아서 질문을 남겼었는데 그냥 이런식으로 사용할 수 있구나 하고 시간나면 HANDLE에 대해 자세히 알아봐야겠네요. 감사합니다 ㅎㅎ 2018.08.08 12:45
  • 프로필사진 stawoo 설명이 정말정말 쉽네요. 정말 감사합니다 마음이 가벼워요!!! 2018.10.06 17:34
  • 프로필사진 BlogIcon 이근둥 감사합니다! 앞으로도 다양한 글 자주 올리도록 하겠습니다 2018.10.11 10:10 신고
  • 프로필사진 HJ 안녕하세요~방학맞아서 C언어로 게임개발하려고하는데 설망 친절하게 해주셔서 너무 감사합니다~~! 2019.07.04 22:23
  • 프로필사진 BlogIcon 이근둥 글 잘 봐주셔서 감사합니다~ 2019.11.03 15:25 신고
  • 프로필사진 토발즈 안녕하세요~ 게임 개발 공부를 하고 있어서 문의 드리는데 LINUX에서 window.h를 인클루드 한 것 처럼 구현 하려면 무엇을 사용해야 될까요? 2019.10.15 18:35
  • 프로필사진 BlogIcon 이근둥 리눅스의 경우 잘 모르겠네요..ㅜㅜ 죄송합니다 2019.11.03 15:26 신고
  • 프로필사진 오영웅 함수는 case (값):
    void (함수)();
    break;
    이렇게 케이스 안에 함수를 넣어
    사용자로부터 특정 값을 받았을때 함수실행은 안되나요?
    2019.11.03 15:16
  • 프로필사진 BlogIcon 이근둥 if문 대신switch로 대체하셔도 무방합니다 :) 2019.11.03 15:27 신고
  • 프로필사진 김기현 저 이 글 가지고 학교 과제가 쉬워졌어요ㅎㅎㅎㅎ
    항상 좋은 글 감사합니다~~^^
    2020.07.21 01:11
  • 프로필사진 BlogIcon 이근둥 도움이 되셨다니 다행입니다~ 2020.07.23 11:24 신고
  • 프로필사진 익명 비밀댓글입니다 2020.07.29 11:19
  • 프로필사진 BlogIcon 이근둥 stdlib 헤더파일을 인클루드 하셨나요? 2020.07.30 08:45 신고
댓글쓰기 폼