미니게임 004
제목 : 반응속도 테스트

▲으악 내가 느림이라니 ㅠㅠ
플레이어의 반응속도를 세번 측정후 평균값을 계산후
플레이어의 반응속도의 등급을 출력하자
▼코드
public class Reaction : IGame
{
public string Id => "reaction_game";
public string Title => "반응속도 테스트";
public void Run()
{
Console.Clear();
Console.WriteLine("총 3번의 반응 속도를 측정합니다.\n");
Console.Write("잠시 후 ");
Effects.PrintColor("'지금!'", ConsoleColor.Yellow);
Console.WriteLine(" 이 뜨면 ");
Effects.PrintColor("엔터", ConsoleColor.Yellow);
Console.WriteLine("를 바로 누르세요!");
Console.WriteLine(" ( 3초 이내에 누르지 않으면 실패 )\n");
Console.WriteLine("준비 되셨으면 아무 키나 입력해주세요.");
Console.ReadKey();
List<double> result = new List<double>(); // 3번 측정 값을 담을 List
Random rnd = new Random();
for ( int round = 1; round <= 3; round++ )
{
Console.Clear();
Console.WriteLine($"Round {round} / 3");
Effects.PrintColor("준비...", ConsoleColor.Red);
Thread.Sleep(1000);
Thread.Sleep(rnd.Next(2000, 8000));
Effects.PrintColor("지금!", ConsoleColor.Yellow);
DateTime start = DateTime.Now;
Console.ReadLine();
double ms = (DateTime.Now - start).TotalMilliseconds;
result.Add(ms);
Console.WriteLine($"반응 속도 : {ms:F0}"); // 소수점 아래 표시 안함
Thread.Sleep(1500);
}
double average = 0;
foreach (double ms in result)
{
average += ms;
}
average = average / result.Count;
Console.Clear();
Console.WriteLine("=====결과=====");
for ( int i = 0; i < result.Count; i++ )
{
Console.WriteLine($"Round {i + 1}: {result[i]:F0}ms");
}
Console.WriteLine($"평균 반응속도: {average:F0}ms");
string rank = // 삼항 연산자
average < 200 ? "신급!" :
average < 300 ? "보통" :
average < 400 ? "느림" :
"거북이";
Console.Write("당신의 등급은 ");
Effects.PrintColor($"{rank}", ConsoleColor.Yellow);
Console.WriteLine(" 입니다.");
Console.WriteLine();
Console.WriteLine("엔터를 눌러주세요.");
Console.ReadLine();
}
}
▼Effects.PrintColor 는 ForegroundColor 를 변경해주는 메서드이다
public static void PrintColor(string text, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.Write(text);
Console.ResetColor();
}
이번 미니게임의 핵심코드
▼처음 써보는 코드
DateTime start = DateTime.Now;
DateTime 은 C# 에서 날짜와 시간을 다루는 구조체
DateTime start = DateTime.Now; 이 구문은 현재 시스템의 날짜와 시간을 가져와서 start 변수에 저장한다는 의미이다.
나중에 자세히 다뤄봐야겠다.
for ( int i = 0; i < result.Count; i++ )
{
Console.WriteLine($"Round {i + 1}: {result[i]:F0}ms");
}
Console.WriteLine($"평균 반응속도: {average:F0}ms");
F0 이라는 키워드도 처음 써보는데
F0 은 소수점 아래는 표시하지 않는다는 의미이다
F1 은 소수점 아래 한자리까지 표시
F2 는 소수점 아래 두자리까지 표시
string rank = // 삼항 연산자
average < 200 ? "신급!" :
average < 300 ? "보통" :
average < 400 ? "느림" :
"거북이";
삼항연산자는 쓰면 쓸수록 매력있다
average < 200 이 맞다면 ? "신급!" 아니라면 다음 줄
발생한 문제와 해결
코드 자체가 워낙 간단한 편이어서 발생한 문제가 없었.. 줄 알았지만,
Enter 키를 계속 연타하고 있으면 반응속도가 빠르게 측정되는 것을 테스트 플레이하면서 알게되었다.
예외처리를 해줘야 할것 같다.
▼코드 수정
for ( int round = 1; round <= 3; round++ )
{
while (true) // 조기 입력 시 재시도하기 위한 루프
{
Console.Clear();
Console.WriteLine($"Round {round} / 3");
Effects.PrintColor("준비...", ConsoleColor.Red);
Thread.Sleep(1000);
//Thread.Sleep(rnd.Next(2000, 8000));
int waitTime = rnd.Next(2000, 8000); // 기다리는 시간 값만 저장 ( Thread.Sleep 적용 x )
int elapsed = 0; // 경과 시간
int step = 50; // 50ms 단위로 검사
bool early = false;
while (elapsed < waitTime)
{
if(Console.KeyAvailable) // 키가 눌렸는지 검사
{
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
{
early = true;
break;
}
}
Thread.Sleep(step);
elapsed += step;
}
if (early)
{
Effects.PrintColor("\n너무 빠르게 입력하셨어요!\n", ConsoleColor.Red);
Console.WriteLine("다시 시도합니다.");
Thread.Sleep(1500);
continue; // while(true) 루프 처음으로 되돌아감
}
Effects.PrintColor("지금!", ConsoleColor.Yellow);
DateTime start = DateTime.Now;
Console.ReadLine();
double ms = (DateTime.Now - start).TotalMilliseconds;
result.Add(ms);
Console.WriteLine($"반응 속도 : {ms:F0}"); // 소수점 아래 표시 안함
Thread.Sleep(1500);
break; // 다음 라운드 진행
}
}
지금! 이 뜨기전 Enter 키 입력을 받으면 너무 일찍 눌렀다는 문구가 출력되게 예외처리를 했다.
그러나 테스트 플레이하면서 또 다른 문제를 발견.
지금! 문구가 뜨기 전 Enter 를 여러번 누르면 코드가 엄청나게 꼬인다..
또 수정해야한다 ㅠㅠ
'📖TIL > 🔥Projects' 카테고리의 다른 글
| 프로젝트 진행과정 008 (0) | 2025.10.06 |
|---|---|
| 프로젝트 진행과정 007 (0) | 2025.10.06 |
| 프로젝트 진행과정 005 (0) | 2025.10.04 |
| 프로젝트 진행과정 004 (0) | 2025.10.03 |
| 프로젝트 진행과정 003 (0) | 2025.10.02 |