ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 축 맨 끝부분을 다 뚫어두어서 한줄씩은 다 초록색으로 출력되었습니다

     

     

     

     

     

     

     

     

     

    뚫어두지 않으면 이린식으로 출력이됩니다

     

     

     

     

     

     

     

     

     

     

     

     

    다음 글에서는 몬스터가 경로를  갖는 방법을 올려보겠습니다
    저도 공부하면서 올리는거라 가장 좋은 방법은 아닐수도 있으며 혹시 오류나 개선사항등이 있을시 댓글 부탁드립니다 감사합니다

    반응형
Designed by Tistory.