전체 코드

namespace Algorithm
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.CursorVisible = false;

            const int WAIT_TICK = 1000 / 30;
            const char CIRCLE = '\u25cf';

            int lastTick = 0;

            while (true)
            {
                #region
                // 1/30분의 1초마다 
                int currentTick = System.Environment.TickCount;
               

                // 만약 경과한 시간이 1/30초보다 작다면
                if (currentTick - lastTick < WAIT_TICK)
                {
                    continue;
                }
                lastTick = currentTick;
                #endregion


                // 프레임 고정
                // FPS 프레임 (60 프레임 OK 30프레임 이하 NO)




                // 입력
                // - 사용자의 input 감지

                // 로직
                // 입력에 따라 로직 실행
                // 몬스터의 AI 로직등 기타 로직

                // 렌더링
                // 그려내는 곳

                Console.SetCursorPosition(0, 0);

                // 바둑판을 그림
                for (int i = 0; i < 25; i++)
                {
                    for (int j = 0; j < 25; j++)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkGreen;
                        Console.Write(CIRCLE);
                    }
                    Console.WriteLine();
                }


            }

            Console.WriteLine("Hello, World!");
        }
    }
}

이 코드의 핵심적인 개념을 분석하고 설명하겠습니다.


🔹 코드 분석

Console.CursorVisible = false;
  • 커서를 숨깁니다.
    • false로 설정하면 콘솔에서 커서 깜빡임이 사라짐.
    • 콘솔에서 커서가 깜빡이는 것은 화면을 깔끔하게 유지하는 데 방해될 수 있음.

1️⃣ 프레임 관리 (FPS 제한)

const int WAIT_TICK = 1000 / 30;
  • 30 FPS를 유지하기 위한 프레임 제한
    • 1000 / 301초(1000ms) 동안 30번 실행하려면 한 프레임당 약 33ms를 기다려야 함.
int lastTick = 0;
  • 이전 프레임을 기록할 변수.
    • 이전 프레임의 시간을 저장하여 경과 시간을 계산하는 데 사용.
int currentTick = System.Environment.TickCount;
  • 현재 시간을 밀리초 단위로 가져옴.
    • TickCount는 프로그램이 실행된 후 경과한 밀리초(ms) 단위의 시간을 반환.
if (currentTick - lastTick < WAIT_TICK)
{
    continue;
}
  • 현재 프레임이 충분히 지났는지 확인.
    • 만약 경과 시간 < 33ms라면, 이번 루프를 continue;건너뜀 (프레임 유지 목적).
lastTick = currentTick;
  • 이전 프레임 시간(lastTick)을 업데이트.
    • 다음 프레임에서 올바른 경과 시간을 계산할 수 있도록 함.

2️⃣ 입력 처리 (현재 비어 있음)

// 입력
// - 사용자의 input 감지
  • 현재 입력 처리가 없지만, 사용자의 키 입력을 감지하는 코드를 추가할 수 있음.
    • 예: Console.ReadKey(), Console.KeyAvailable 등을 사용할 수 있음.

3️⃣ 게임 로직 (현재 비어 있음)

// 로직
// 입력에 따라 로직 실행
// 몬스터의 AI 로직등 기타 로직
  • 여기에서는 게임의 상태를 갱신하는 역할을 수행해야 하지만 현재는 없음.
  • 예를 들어,
    • 몬스터의 AI를 업데이트하거나,
    • 플레이어의 위치를 변경하는 등의 로직이 들어갈 수 있음.

4️⃣ 렌더링 (콘솔 화면에 바둑판을 그림)

Console.SetCursorPosition(0, 0);
  • 커서를 콘솔의 왼쪽 상단(0,0) 위치로 이동.
    • 콘솔에서 화면을 깜빡이지 않도록 방지하고 깔끔하게 유지하는 역할.
const char CIRCLE = '\u25cf';
  • 유니코드 문자 '●' (검은색 동그라미)를 사용하여 바둑판을 그림.
for (int i = 0; i < 25; i++)
{
    for (int j = 0; j < 25; j++)
    {
        Console.ForegroundColor = ConsoleColor.DarkGreen;
        Console.Write(CIRCLE);
    }
    Console.WriteLine();
}
  • 25x25 바둑판을 출력.
    • Console.ForegroundColor = ConsoleColor.DarkGreen; → 초록색으로 출력.
    • Console.Write(CIRCLE); → ‘●’ 문자를 출력하여 바둑판을 그림.
    • Console.WriteLine(); → 한 줄을 출력한 후 개행하여 다음 줄로 이동.

5️⃣ 종료되지 않는 무한 루프

while (true)
  • 게임 루프를 무한 반복.
    • 게임은 계속 실행되며, 사용자가 종료하기 전까지 중단되지 않음.
    • break;exit 명령어가 없으면 프로그램은 끝나지 않음.

profile
李家네_공부방

0개의 댓글