프로젝트 진행과정 006

2025. 10. 5. 15:52·📖TIL/🔥Projects

미니게임 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
'📖TIL/🔥Projects' 카테고리의 다른 글
  • 프로젝트 진행과정 008
  • 프로젝트 진행과정 007
  • 프로젝트 진행과정 005
  • 프로젝트 진행과정 004
DevHoChan
DevHoChan
맨땅에서 시작하는 코딩 도전
  • DevHoChan
    Debugging Life
    DevHoChan
  • 전체
    오늘
    어제
    • 분류 전체보기 (374)
      • 🕹️Game Life (1)
      • 🖥️Computer Science (5)
      • 📖TIL (141)
        • 🔥Projects (16)
        • 💡DevTips (5)
        • 🤔발생한 문제와 해결 (5)
        • 🔮Unity Graphics (5)
        • 🎤Interview (3)
        • ✅CodingTest (9)
      • 🚀Game Release (4)
      • 🧊Unity Basic (58)
        • 📌용어 사전 (1)
        • 에디터&인터페이스 (3)
        • 디버그 (1)
        • 라이프사이클 (4)
        • 게임오브젝트 (4)
        • 프리팹 (1)
        • 오브젝트풀링 (4)
        • 애트리뷰트 (2)
        • 트랜스폼 (4)
        • 물리&충돌 (1)
        • 프레임&델타타임 (4)
        • 코루틴&이벤트 (7)
        • 수학&보정함수 (3)
        • 디자인패턴 (9)
        • UGUI (3)
        • 벡터 ( Vector ) (3)
        • 씬 ( Scene ) (2)
        • 데이터 관리 (2)
      • ⭐C Sharp (99)
        • 📌용어 사전 (1)
        • 📌문법 사전 (6)
        • 메모리 관리 (3)
        • 00. 문법 (17)
        • 01. 변수 (3)
        • 02. 자료형 (2)
        • 03. 연산자 (6)
        • 04. 조건문 (2)
        • 05. 반복문 (2)
        • 06. 배열 (3)
        • 07. 메서드(함수) (7)
        • 08. 열거형 (3)
        • 09. 구조체 (2)
        • 10. 참조 (2)
        • 11. 객체 지향 (11)
        • 12. 델리게이트 (3)
        • 13. 디자인 패턴 (7)
        • 14. LINQ (1)
        • 📂▼자료구조 (2)
        • 15-1. 제네릭 (3)
        • 15-2. 배열 (4)
        • 15-3. 리스트 (2)
        • 15-4. 스택과 큐 (2)
        • 15-5. 딕셔너리 해시테이블 (2)
        • 15-6. 트리와 그래프 (3)
      • 📊Algorithm (16)
        • BigO (2)
        • 정렬 (4)
        • 셔플 (2)
        • 탐색 (6)
        • 최적화 (1)
      • 📝Game Design (16)
      • 🤖​AI Tools (12)
        • AI 리뷰 분석 (6)
        • Player2 (0)
        • 3D 모델링 (1)
        • 2D 스프라이트 (0)
        • 이미지 (2)
        • 사운드 (1)
        • 동영상 (1)
        • 문서 (1)
      • 🌍Network (6)
      • 🌱Github (11)
        • 기본 개념 (7)
        • 명령어 (1)
        • 도구 활용 (1)
      • ⚙️Visual Studio (5)
        • 🔧설치 및 환경설정 (2)
        • ⌨️HotKey (1)
        • 🚨디버깅 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    게임기획
    디자인패턴
    OOP
    algorithm
    부트캠프
    메모리관리
    gamedesign
    c#
    자료구조
    문법
    유니티
    GitHub
    csharp
    unity
    자료형
    CodingTest
    기획
    게임디자인
    til
    객체지향
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
DevHoChan
프로젝트 진행과정 006
상단으로

티스토리툴바