ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다시한번 개발자도전! 5일차 (이중반복문 , 콘솔 좌표이동)
    다시한번 개발자도전! 2026. 1. 8. 17:11

    오늘은 아침부터 치과를 가야 해서 오전 수업은 들을 수 없었다ㅜㅜ

    오후부터 참여하였는데 다행히도 진도가 많이 나가지 않아 수업을 잘 들을 수 있었다

    다음 주에도 치과를 가야 하는데 수업을 못 들으니 너무 걱정이다😿😿

    못 듣는 만큼 더 열심히 해보자! 아자자!

     

     


    🎮 C# 기초: 반복문 심화 & 흐름 제어

    1. 흐름 제어 키워드 (Continue, Break, Goto)

    루프의 흐름을 내 마음대로 조절하는 삼대장임.

    키워드 역할
    continue 이번 턴만 건너뛰고 다음 반복으로 넘어감
    break 반복문을 즉시 종료하고 탈출함
    goto 지정한 레이블(지점)로 강제 점프함
    static void Main(string[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            if (i== 1) // i가 1이 될 시 현재 반복문을 종료 하고 다음 반복문을 실행
                continue;
            else if (i== 3) // i가 3이 될 시 바로 반복문이 종료
                break;
    
            Console.WriteLine(i); //0,2가 출력 됨
        }
    }

    💡goto 사용법!

    더보기
    static void Main(string[] args)
    {
        for (int i = 1; i < 5; i++)
        {
            for (int j = 1; j < 5; j++)
            {
                if (i == 3 && j == 2)
                    goto EndLoop; // i가 3이고 j가 2일 때 모든 루프 즉시 종료
    
                Console.Write($"{i} x {j} = {i * j}\t");
            }
            Console.WriteLine();
        }
    
    EndLoop: // 여기로 바로 날아옴
        Console.WriteLine("\n루프를 완전히 빠져나옴.");
    }

     ⚠️ Goto 사용 주의점

    • 특징: 원하는 지점으로 바로 날아갈 수 있음.
    • 정말 복잡한 이중 루프 탈출이나 공통 에러 처리 아니면 가급적 안 쓰는 게 좋음.

    2. 이중 반복문 (Nested Loop)

    • 반복문 안에 반복문이 들어간 형태. 게임의 **2D 좌표계(x, y)**나 맵 생성에 필수.
    • 안쪽 루프가 '완전히' 다 돌아야 바깥쪽 루프가 비로소 한 번 바뀜.
    static void Main(string[] args)
    {
        for (int y = 0; y < 3; y++)
        {
            for (int x = 0; x < 3; x++) //안쪽 반복문이 끝나면 바깥쪽 반복문이 돌아감
            {
                Console.Write($"({x},{y}) ");
            }
            Console.WriteLine();
        }
    }

     

    🔥실습예제🔥

    더보기
    • 별찍기
    • ⭐ ⭐
    • ⭐ ⭐ ⭐
    • ⭐ ⭐ ⭐ ⭐
    • ⭐ ⭐ ⭐ ⭐ ⭐
    static void Main(string[] args)
    {
        for(int i = 0; i < 5; i++)
        {
            for(int j = 0; j < 5; j++)
            {
                if (j <= i)
                    Console.Write("*");
            }
            Console.WriteLine();
        }
    }

     

    • 미니게임 맵
    • 🏠🟩🟩🟩
    • 🟩 🟩 🟩 🟩
    • 🟩 🟩 🟩 🟩
    • 🟩 🟩 🟩⭐
    static void Main(string[] args)
    {
        for (int y = 0; y < 4; y++)
        {
            for (int x = 0; x < 4; x++)
            {
                if (x == 0 && y == 0)
                    Console.Write("🏠 ");  // 시작점
                else if (x == 3 && y == 3)
                    Console.Write("🎯 ");  // 목표
                else
                    Console.Write("🟩 ");  // 길
            }
            Console.WriteLine();
        }
    }

    3. 콘솔 좌표 이동 (while & switch)

     

    • Console.CursorVisible : 콘솔창에서 커서를 보이거나 감출 수 있음.
    • Console.Clear() : 콘솔창에 기록된 모든 메시지를 지움.
    • Console.SetCursorPosition(); 글자가 출력될 **'커서의 위치'**를 지정.
    • ConsoleKeyInfo: 사용자가 키를 눌렀을 때, 어떤키 인지 **정보를 저장해 두는 변수 타입(자료형)**임.
    • Console.ReadKey(true) :  프로그램이 실행되다가 이 줄을 만나면 멈춤. 그리고 사용자가 키를 누르는 순간, 그 정보를 가지고 다음 줄로 넘어감. / true로 설정 시 키를 눌러도 화면에 표시되지 않음.

     

     static void Main(string[] args)
     {
         int x = 10, y = 10;
    
         ConsoleKeyInfo keyInfo; //키관련된 정보
    
         Console.CursorVisible = false;
    
         while (true) //유니티에 update 기능을 해줌
         {
             Console.Clear();  //화면지우기
    
             Console.SetCursorPosition(x, y); //좌표
    
             Console.Write("●"); //현재 위치 출력
    
             keyInfo = Console.ReadKey(true); //키 입력 받기 (화면 출력 x)
    
             //방향키 입력에 따른 좌표 변경
             switch (keyInfo.Key)
             {
                 case ConsoleKey.UpArrow: if (y > 0) y--; break;
                 case ConsoleKey.DownArrow: if (y < Console.WindowHeight - 1) y++; break;
                 case ConsoleKey.LeftArrow: if (x > 0) x--; break;
                 case ConsoleKey.RightArrow: if (x < Console.WindowWidth - 1) x++; break;
                 case ConsoleKey.Spacebar: Console.Write("미사일키"); break;
                 case ConsoleKey.Escape: break; //ESC키로 탈출
    
             }
         }

    🔥실습해보기🔥

    더보기

    리스트를 이용하여 이전 좌표를 저장 후 따라가게 해 보았다!

      static void Main(string[] args)
     {
         Console.OutputEncoding = Encoding.UTF8;
         Console.CursorVisible = false;
    
         Random rand = new Random();
         int width = Console.WindowWidth;
         int height = Console.WindowHeight;
    
         int targetX = rand.Next(0, width);
         int targetY = rand.Next(0, height);
    
         List<(int x, int y)> snakeBody = new List<(int x, int y)> { (10, 10) };
    
         Console.SetCursorPosition(targetX, targetY);
         Console.Write("☆");
    
         while (true)
         {
    
             Console.SetCursorPosition(snakeBody[0].x, snakeBody[0].y);
             Console.Write("★");
    
             ConsoleKeyInfo keyInfo = Console.ReadKey(true);
             int nextX = snakeBody[0].x;
             int nextY = snakeBody[0].y;
    
             switch (keyInfo.Key)
             {
                 case ConsoleKey.UpArrow: nextY--; break;
                 case ConsoleKey.DownArrow: nextY++; break;
                 case ConsoleKey.LeftArrow: nextX--; break;
                 case ConsoleKey.RightArrow: nextX++; break;
                 case ConsoleKey.Escape: return;
             }
    
             snakeBody.Insert(0, (nextX, nextY));
    
             if (nextX == targetX && nextY == targetY)
             {
                 targetX = rand.Next(0, width);
                 targetY = rand.Next(0, height);
                 Console.SetCursorPosition(targetX, targetY);
                 Console.Write("☆");
             }
             else
             {
                 var tail = snakeBody[snakeBody.Count - 1];
                 Console.SetCursorPosition(tail.x, tail.y);
                 Console.Write("  "); 
                 snakeBody.RemoveAt(snakeBody.Count - 1);
             }
         }
     }

     

     

    이제 좀 비주얼적인 게 보이는 것 같다!

    앞으로도 열심히 해서 바루 취업 가보자고!

     

Designed by Tistory.