-
C#콘솔 플레이어와 몬스터 맵 만들기 (1) - 몬스터맵 만들기C#콘솔프로젝트(BFS,DFS,A*알고리즘을 이용한 몬스터 경로) 2024. 3. 29. 17:24반응형
미로로 구성되어 있는 몬스터맵을 만들고, 몬스터가 시작점에서 끝점까지 BFS, DFS, ASTAR알고리즘을 이용하여 미로를 탈출하는 경로를 만들어 보겠습니다 .
이번 글에서는 몬스터맵을 만들어 보겠습니다나중에 몬스터와 플레이어 둘다 맵에 띄어주어야 하므로 Map이라는 부모 클래스를 만들고 기본적인 틀을 만들어보겠습니다. (나중에 코드는 바뀔수도 있습니다)
nternal class Map { public enum BoardType // 보드 타입 { EAST, WEST, NORTH, SOUTH, NONE, WALL, } public BoardType[,] board { get; protected set; } // 보드 타입을 넣을 배열 protected const char RECTANGLE = '■'; // 보드 출력시 사각형으로 출력 public int Size { get; protected set; } // 보드 사이즈 protected ConsoleColor MAPcolor(BoardType type) // 보드 타입에 따른 출력색깔 { switch (type) { case BoardType.WALL: return ConsoleColor.Red; case BoardType.EAST: case BoardType.WEST: case BoardType.NORTH: case BoardType.SOUTH: return ConsoleColor.Yellow; default: return ConsoleColor.Green; } } }
맵을 상속받는 MonsterMap입니다 주석처리에 코드 설명 써두었습니다
internal class MonsterMap : Map { public void Initialize(int size, int y, int x) { if (size % 2 == 0) return; board = new BoardType[size, size]; Size = size; GenerateBySideWinder(); } void GenerateBySideWinder() { // 길을 다 막아버리는 작업 for (int y = 0; y < Size; y++) { for (int x = 0; x < Size; x++) { if (x % 2 == 0 || y % 2 == 0) board[y, x] = BoardType.WALL; else board[y, x] = BoardType.NONE; } } //랜덤으로 우측 혹은 아래로 길을 뚫는 작업 Random rand = new Random(); for (int y = 0; y < Size; y++) { int count = 1; for (int x = 0; x < Size; x++) { // 막힌 부분 if (x % 2 == 0 || y % 2 == 0) continue; // 가장자리 부분 if (y == Size - 2 && x == Size - 2) continue; // y축 맨끝 부분은 다 뚫어둠 (외각에서 보드를 뚫을수도 있음) if (y == Size - 2) { board[y, x + 1] = BoardType.NONE; continue; } // x축 맨끝부분은 다 뚫어둠 if (x == Size - 2) { board[y + 1, x] = BoardType.NONE; continue; } // 1/2확률로 우측길을 뚫음 if (rand.Next(0, 2) == 0) { board[y, x + 1] = BoardType.NONE; count++; } // 아래로 길을 뚫음 else { int randomIndex = rand.Next(0, count); // 벽 빈공간 막힌공간 이런식으로 이어지기 때문에 인덱스를 *2 // 빈 공간에서 뚫어야 하기 때문 board[y + 1, x - randomIndex * 2] = BoardType.NONE; count = 1; } } } } public void Render() { // 원래의 콘솔 색깔을 저장해둡니다 ConsoleColor prevColor = Console.ForegroundColor; for (int y = 0; y < Size; y++) { // 커서 위치 지정 Console.SetCursorPosition(15, y + 5); for (int x = 0; x < Size; x++) { Console.ForegroundColor = MAPcolor(board[y, x]); Console.Write(RECTANGLE); } Console.WriteLine(); } // 원래 콘솔 색깔로 다시 설정 Console.ForegroundColor = prevColor; } }
출력 과정을 보여줄 Main함수입니다
internal class Program { static void Main(string[] args) { MonsterMap map = new MonsterMap(); map.Initialize(15, 1,1); map.Render(); } }
출력 결과를 보여드리겠습니다
일단 GenerateBySideWinder()에서 랜덤으로 우측 혹은 아래로 길을 뚫는 작업이 아닌 길을 다 막아버리는 작업의 출력화면입니다Console.SetCursorPosition(15, y + 5); 을 해둬서 0,0에서 출력이 아닌 임의의 값으로 출력 위치를 지정할수 있습니다
출력 for문을 돌고 console.WriteLine()을 해둬야 y값이 변하기전에 한줄 내려가서 출력이 가능합니다얘는 랜덤으로 우측 혹은 아래로 길을 뚫는 작업을 한 경우입니다
y축과 x 축 맨 끝부분을 다 뚫어두어서 한줄씩은 다 초록색으로 출력되었습니다
뚫어두지 않으면 이린식으로 출력이됩니다
다음 글에서는 몬스터가 경로를 갖는 방법을 올려보겠습니다
저도 공부하면서 올리는거라 가장 좋은 방법은 아닐수도 있으며 혹시 오류나 개선사항등이 있을시 댓글 부탁드립니다 감사합니다반응형'C#콘솔프로젝트(BFS,DFS,A*알고리즘을 이용한 몬스터 경로)' 카테고리의 다른 글
C#콘솔 플레이어와 몬스터 맵 만들기 (2) - 몬스터 경로 만들기(BFS) (0) 2024.04.01