티스토리 뷰
2021.09.07 - [코딩 공부/C++로 게임 만들기] - C++) 오목 게임 만들기 1
이전 글에서 이어지는 오목 게임 만들기 2입니다.
저번 포스트에서 소스.cpp와 Mecro.h를 만들었어요.
그럼 이제 본격적으로 게임을 만들어볼텐데,
처음에 모작할 때엔 타이틀부터 만드는 것이 좋습니다.
눈에 보이는게 확실해야 진도가 잘 나가거든요.
그래서 오늘은 타이틀부터 만들게요~
시작 전에 타이틀을 다시 봅시다.
바둑판을 그려야 하고 그 위에 메뉴를 출력해줘야 해요.
그리고 사용자가 선택한 메뉴를 입력받을 칸도 그려줘야 합니다.
제 앞 글에서 움짤을 보고 오시면 알겠지만 타이틀에서 그린 바둑판은 게임을 할 때에도 그대로 쓸 거에요.
바둑판을 그리는 함수를 매번 쓰려면 귀찮으니까 바둑판을 그리는 함수를 먼저 만든 후 필요할 때마다 불러오도록 합시다.
새로운 클래스를 만들것입니다.
소스파일을 만들때와 똑같이 하는데 이번에는 클래스를 선택해주세요.
클래스 이름란에 새로 만들 클래스의 이름을 쓰면 헤더 파일 이름은 자동으로 써집니다.
DrawMap이라 쓰고 확인
그러면 새로운 cpp파일과 헤더파일이 만들어진 것을 볼 수 있습니다.
이름에서 알 수 있으시겠지만 이 클래스는 그리기에 관련된 데이터들을 가지고 있게 할 것입니다.
처음 클래스 파일이 만들어지면 이렇게 되어있죠?
//in DrawMap.h
#pragma once
#include "Mecro.h"
class DrawMap
{
public:
DrawMap();
~DrawMap();
};
이렇게 내용을 채워주세요.
생성자와 소멸자는 public으로 선언합니다.
클래스 파일을 만들면 해당 클래스에서 필요한 헤더파일을 인클루드하고 생성자와 소멸자부터 쓰는 것이 좋습니다.
왜냐구요?
그냥 제가 그렇게 하면 다음 코드부터 잘 써지더라고요...ㅎ
시작하는 길을 닦는 느낌이라...
* 생성자: 클래스를 이용한 인스턴스가 만들어질 때 가장 먼저 호출되는 함수로 주로 각종 멤버변수들을 초기화하는 용도로 사용
* 소멸자: 인스턴스가 소멸되기 직전 호출되는 함수로 주로 동적할당한 데이터를 해제하는 용도로 사용
생성자와 소멸자에 대해 더 자세히 알고 싶으시면 구글 검색하고 오세용~
이제 DrawMap.cpp 파일로 가 보면 클래스 헤더만 인클루드 된 채로 비어있는 것을 볼 수 있습니다.
헤더파일에서 함수 선언을 하셨으면 cpp 파일에서 함수의 본문을 적어줘야 합니다.
c++에서 클래스 파일을 이용해서 클래스를 만들 때엔
주로 헤더파일에선 함수의 전방선언을 하고 cpp파일에서 본문을 쓴다고 생각하시면 됩니다.
분류해서 보기가 좋거든요.
//in DrawMap.cpp
DrawMap::DrawMap()
{
}
DrawMap::~DrawMap()
{
}
cpp 파일에 아까 헤더파일에서 썼던 생성자와 소멸자의 본문을 적어주세요.
아직 채울 내용은 없으니까 중괄호까지만 씁니다.
다 쓰셨으면 다시 헤더파일로 돌아옵니다.
이번엔 바둑판을 그리는 함수를 작성할거에요.
//in DrawMap.h
#pragma once
#include "Mecro.h"
class DrawMap
{
public:
DrawMap();
void GridDraw(int Start_x, int Start_y, int Width, int Height);
~DrawMap();
};
생성자와 소멸자 사이에 GridDraw라는 이름으로 함수를 선언합니다.
그리기 함수는 이 클래스에서만 쓰는 것이 아니라 다른 클래스에서 쓸 것이기 때문에 public으로 선언해주세요.
순서는 꼭 이렇게 하지 않으셔도 됩니다.
저는 어지간하면 헤더파일의 함수 선언 순서와 cpp 파일의 함수 선언 순서를 맞춰주려고 해서 이렇게 쓰는 편이에요.
그래야 찾아보기가 쉬워서...
각자 편한 방식대로 쓰시면 됩니다.
헤더파일에서 함수 선언하셨으면 cpp파일로 가서 본문을 마저 적읍시다.
//in DrawMap.cpp
DrawMap::DrawMap()
{
}
void DrawMap::GridDraw(int Start_x, int Start_y, int Width, int Height)
{
for (int y = 0; y < Height; y++)
{
gotoxy(Start_x, Start_y + y);//windows에서 제공하는 함수로 콘솔창의 커서를 원하는 위치로 보내주는 함수
if (y == 0)
{
cout << "┌";
for (int x = 1; x < Width - 1; x++)
cout << "┬";
cout << "┐";
}
else if (y == Height - 1)
{
cout << "└";
for (int x = 1; x < Width - 1; x++)
cout << "┴";
cout << "┘";
}
else
{
cout << "├";
for (int x = 1; x < Width - 1; x++)
cout << "┼";
cout << "┤";
}
}
return;
}
DrawMap::~DrawMap()
{
}
반복문을 사용해서 커서가 특정 위치에 왔을 때 특정 특수문자를 그리게 하면 바둑판을 그릴 수 있습니다.
C 언어를 공부할 때 별 그리기를 해 보셨으면 이 코드도 금방 이해하실거라 생각합니다.
사실 그리기 함수들은 저도 선생님한테 공유받은 것이고 엄청 중요한 알고리즘은 아니기 때문에 복붙하셔도 됩니다.
심심하시면 하나하나 따라 쓰셔도 되구...ㅎㅎ
그런데... gotoxy함수를 쓰면 빨간줄이 뜰 거에요.
아직 어디에도 선언한 적이 없으니까요.
gotoxy는 콘솔창의 커서를 매개변수에 넣은 위치로 보내주는 함수인데 윈도우즈에서 제공하는 함수입니다.
이걸 쓰면 보다 쉽게 커서를 내가 원하는 위치에 보낼 수 있습니다.
gotoxy를 쓰기 위해서는 Windows.h 헤더파일이 필요합니다.
system("cls"); 같은 함수 쓸 때 쓰셨을거에요.
저번 시간에 만들었던 Mecro.h로 와서 Windows.h를 추가해줍시다.
//in Mecro.h
#pragma once
#include <iostream>
#include <Windows.h>
using namespace std;
이렇게 되도록 #include <Windows.h>를 추가해주세요.
//in DrawMap.h
#pragma once
#include "Mecro.h"
class DrawMap
{
public:
DrawMap();
inline void gotoxy(int x, int y)
{
COORD Pos = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
void GridDraw(int Start_x, int Start_y, int Width, int Height);
~DrawMap();
};
다시 DrawMap.h로 돌아와서 gotoxy 함수를 추가해주세요.
이 함수는 inline 함수로 만들 것이라서 헤더 파일에 본문까지 다 적었어요.
* inline : 함수를 바로 쓸 수 있도록 메모리에 올려놓아서 호출 위치에 해당 코드를 바로 적용해 함수를 호출하는 과정을 생략하는 키워드로 일반적으로 함수를 호출하는 속도보다 훨씬 빠르게 코드를 적용할 수 있어요.
하지만 너무 긴 코드를 가진 함수를 인라인 함수로 만들면 그만큼 메모리에서 차지하는 용량이 많아지기 때문에 과부하가 생기게 됩니다.
그러면 성능이 저하되겠죠.
그래서 인라인은 클래스의 특정 멤버변수 값을 리턴하는 함수 등 주로 내용이 짧은 함수에 적용합니다.
한줄짜리 함수는 금방 보고 올 수 있으니까요~
gotoxy까지 쓰셨으면 아까 생겼던 빨간줄이 사라진 것을 보실 수 있을 것입니다.
//in DrawMap.h
void BoxDraw(int Start_x, int Start_y, int Width, int Height);
이번에는 빈 박스를 그리는 함수를 추가합시다.
타이틀에서 메뉴 입력을 받는 박스를 이 함수를 이용해서 그릴거에요.
//in DrawMap.cpp
void MapDraw::BoxDraw(int Start_x, int Start_y, int Width, int Height)
{
for (int y = 0; y < Height; y++)
{
gotoxy(Start_x, Start_y + y);
if (y == 0)
{
cout << "┌";
for (int x = 1; x < Width - 1; x++)
cout << "─";
cout << "┐";
}
else if (y == Height - 1)
{
cout << "└";
for (int x = 1; x < Width - 1; x++)
cout << "─";
cout << "┘";
}
else
{
cout << "│";
for (int x = 1; x < Width - 1; x++)
cout << " ";
cout << "│";
}
}
return;
}
이렇게 추가해주세요.
//in DrawMap.h
void DrawPoint(string str, int x, int y);
void DrawMidText(string str, int x, int y);
void TextDraw(string str, int x, int y);
void ErasePoint(int x, int y);
다시 DrawMap.h로 돌아와서 위 네가지 함수를 선언합니다.
이름 보면 대충 기능 추측 가능하시죠?
//in DrawMap.cpp
void DrawMap::DrawPoint(string str, int x, int y)
{
gotoxy(x, y);
cout << str;
gotoxy(-1, -1);
return;
}
void DrawMap::DrawMidText(string str, int x, int y)
{
if (x > str.size() / 2) x -= str.size() / 2;
gotoxy(x, y);
cout << str;
return;
}
void DrawMap::TextDraw(string str, int x, int y)
{
gotoxy(x, y);
cout << str;
}
void DrawMap::ErasePoint(int x, int y)
{
gotoxy(x, y);
cout << " ";
gotoxy(-1, -1);
return;
}
cpp파일로 가서 본문도 적어줍니다.
여기까지 쓰면 바둑판을 그리기 위한 DrawMap class가 모두 준비되었습니다.
오늘은 여기까지하고
다음 포스트에서 타이틀 화면을 만들어보겠습니다.
그럼 예습복습 열심히 하시고 잊지말고 돌아와주세요~~!!
다음 글
2021.09.15 - [C++로 게임 만들기/오목 게임 만들기] - [C++] 오목 게임 만들기 3 - GameManager Class를 만들고 타이틀 화면 그리기
'C++로 게임 만들기 > 오목 게임 만들기' 카테고리의 다른 글
[C++] 오목 게임 만들기 4 - 타이틀 메뉴 만들기 (1) | 2021.09.20 |
---|---|
[C++] 오목 게임 만들기 3 - GameManager Class를 만들고 타이틀 화면 그리기 (0) | 2021.09.15 |
C++) 오목 게임 만들기 1 (0) | 2021.09.07 |
- Total
- Today
- Yesterday
- 기초
- c++
- 컴퓨터공부
- 해커랭크
- 하드웨어
- 깊이우선탐색
- 알고리즘
- 캐나다
- greedy
- 다이나믹프로그래밍
- 너비우선탐색
- 애플
- 프로그래밍
- 컴퓨터사이언스
- 문제풀이
- 캐나다생활
- dp
- DFS
- 스위프트플레이그라운드
- hackerrank
- 아이패드
- 백준
- 영어공부
- 그리디
- 프로그래머스
- C언어기초
- 컴퓨터
- c언어
- 코딩공부
- BFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |