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로 설정하면 콘솔에서 커서 깜빡임이 사라짐.const int WAIT_TICK = 1000 / 30;
1000 / 30 → 1초(1000ms) 동안 30번 실행하려면 한 프레임당 약 33ms를 기다려야 함.int lastTick = 0;
int currentTick = System.Environment.TickCount;
TickCount는 프로그램이 실행된 후 경과한 밀리초(ms) 단위의 시간을 반환.if (currentTick - lastTick < WAIT_TICK)
{
continue;
}
경과 시간 < 33ms라면, 이번 루프를 continue;로 건너뜀 (프레임 유지 목적).lastTick = currentTick;
lastTick)을 업데이트. // 입력
// - 사용자의 input 감지
Console.ReadKey(), Console.KeyAvailable 등을 사용할 수 있음.// 로직
// 입력에 따라 로직 실행
// 몬스터의 AI 로직등 기타 로직
Console.SetCursorPosition(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();
}
Console.ForegroundColor = ConsoleColor.DarkGreen; → 초록색으로 출력.Console.Write(CIRCLE); → ‘●’ 문자를 출력하여 바둑판을 그림.Console.WriteLine(); → 한 줄을 출력한 후 개행하여 다음 줄로 이동.while (true)
break;나 exit 명령어가 없으면 프로그램은 끝나지 않음.