자료구조와 알고리즘/Data Structure

[게임 프로그래머 입문 올인원] 선형 자료구조 실습 1 : 미로 맵 만들기(50강)

순정법사 2024.02.14

A. 미로 맵 만들기

1. 기본 틀 생성하기

플레이어가 길찾기 하는 맵을 실습

(자료구조 알고리즘에 대한 기초 쌓기)

 

a. types.h 생성

📁 Main  > 📄 types.h

 

변수 사용하기 편리하려고 작성하는 것

 

 

b. pch class 구현

1) 생성

 

📁 Main > 📄 pch.h

 

🌟 "프리 컴파일 헤더" 라는 뜻

 

자주 사용하는 헤더 파일을 모아두는 곳

 

미리 컴파일 해야 하는것들

 

모두 작성했다면 설정해주기

 

2) 설정

 

먼저 Maze 프로젝트 속성 변경

 

Maze 우클릭 > 속성 / 미리 컴파일된 헤더 : 사용 , 헤더파일 : pch.h로 변경

 

다음으로 pch.cpp 파일 속성 변경

 

pch.cpp  우클릭 > 속성 /  꼭 만들기로 설정

 

💥 pch.h 파일 만들기 전에 생성한 파일들은 따로 #include "pch.h" 추가해줘야 함

(이후에 만든 파일들은 없어도 되지만 가끔 오류가 나는 경우가 있음)

 

🧡 소스 코드를 미리 컴파일 해야 하는 경우

 

3) 구현

 

  • 좌표 pos 구조체 생성 

(내용이 작아서 여기다 작성, 원래는 다른 곳에 만들고 pch.h에 추가해야 함)

 

x, y값을 따로 작성할 수 있지만 자주 사용되니 한번 만들어주자

 

 

  • 방향이동 열거체 생성

 

열거체로 생성한 이유 : 이동 계산하기 편하게 하기 위해 (별것 없음)

총 개수 가지고 있으면 편해서 총 개수도 구현해줌

 

 

c. 맵 폴더 및 파일 생성하기 

1) Board 폴더 생성

 

📁 Maze > 📁 Board 

 

 

2) 클래스 생성하기

 

Board, ConsoleHelper, Player 클래스들을 생성

 

 

d. ConsoleHelper 작성

1) 📄 Consolehelper.h

 

ConsoleColor란 이름으로 색상을 정해주는 enum 생성

 

 

 

커서의 위치, 색상, 유무등을 구현

➡ 객체없이 생성하기 위해 static으로 생성

 

 

2) 📄 ConsoleHelper.cpp

 

내용 구현하기

 

예전에 썼던 코드 복붙하기

 

◽◽◽ ConsoleHelper.cpp

#include "pch.h"
#include "ConsoleHelper.h"

void ConsoleHelper::SetCursorPosition(int32 x, int32 y)
{
	HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
	::SetConsoleCursorPosition(output, pos);
}

void ConsoleHelper::SetCursorColor(ConsoleColor color)
{
	HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);
	::SetConsoleTextAttribute(output, static_cast<int16>(color));
}

void ConsoleHelper::ShowConsoleCursor(bool flag)
{
	HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cursorInfo;
	::GetConsoleCursorInfo(output, &cursorInfo);
	cursorInfo.bVisible = flag;
	::SetConsoleCursorInfo(output, &cursorInfo);
}

 

e. maze.cpp 기초 작성

📁 Main> 📄 maze.cpp

 

  1. 맵과 플레이어를 전역으로 생성
  2. 랜덤 시드값 생성
  3. 기초 틀 while문 생성

 

맵을 렌더링하기 위해 Board로 가기

 

 

2. 미로 맵 생성하기

a. 맵사이즈, 타일 타입 enum 생성

📁 Main > 📄 board.h

 

enum안에 상수를 넣어서 사용하는것도 좋음

 

b. class 작성

📁 Main > 📄 board.h

 

  1. 생성자 소멸자
  2. 함수들
  3. 사용할 맵 정보 구현하기

 

 

☁ 함수 순서

Init으로 맵 사이즈를 초기화 해주고 바로

GenerateMap()으로 미로를 생성해주고

생성된 미로 2차배열을 Render()로 렌더링 해주는데

GetTileType과 GetTileColor을 사용해서 꾸며준다

 


 

여기까지 만들고 빌드하면

 

이런 오류가 생기는데

 

이건 Maze.cpp파일에서 생성한 Board가

 

생성자부분에서 제대로된 구현 없이 만들어지기 때문에 오류가 남

 

그래서 잠시만 비활성화 하기

 


 

c. 함수들 구현하기

📁 Main > 📄 board.cpp

 

0) 생성, 소멸자 구현

 

먼저 간단하게만 구현

 

1) Init() : 초기화하며 맵사이즈를 만들어주는 함수 로직

 

보드를 생성하자마자 사이즈에 따라 맵을 생성할것임

 

 

2) render() : 실제 렌더링, 콘솔기능 추가

 

이렇게 생긴 타일을 사용해서

 

구현해주기

 

3) GetTileType() : 갈수있는 타일인지 판단

 

 

4) GetTileColor() : 타일 컬러색상 가져오기

 

 

로직을 제외한 미로 구현부만 재현한다면 이렇게 완성됨

 

여기까지 했다면 이렇게 구현됨

 

5) GenerateMap() : 미로 생성

 

Binary Tree 미로 생성 알고리즘을 사용해서 미로를 구현할 예정

 

💙 Binary Tree

시작지점에서 오른쪽,아래 둘중 하나를 선택해 길을 뚫고, 마지막에 도달하면 (오른쪽 끝이나 아래 끝) 무조건 미로 맵 안쪽에서 끝나는 지점쪽으로 길을 뚫어줌 

 

  • 기본 Base 맵 생성하기

 

먼저 간단하게 짝수일때에만 벽으로 만드는 코드를 작성해주고

 

GenerateMap을 실행하기 위해&nbsp; Maze.cpp에서 초기화 코드 실행

 

기본 베이스 생성

 

👉 여기서 길을 오른쪽 아님 아래로 뚫어줄것임 (GenerateMap() 계속)

 

  • 미로 생성하기

 

 

이렇게 생성된다!!

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com