C# 문법 팀과제 - 2

이준호·2023년 11월 20일
0

C#문법 팀과제 2일차



📌 추가된 코드

일과(체력단련) - 미니게임

    static void PhysicalTraining_Run()
    {
        // Start Point
        int x = 0;

        double time = 30;

        Console.Clear();

        // Explanation
        Console.WriteLine("아무 키나 연타해서 Goal 지점에 도착하세요!");
        Console.WriteLine("");
        Console.WriteLine("빨리 도착할수록 좋은 보상을 얻습니다!");
        Console.WriteLine("");
        Console.WriteLine("움직이지 않고 가만히 있으면 시간이 더 빠르게 흘러갑니다.");
        Console.WriteLine("");
        Console.WriteLine(">> Press the Any key to proceed <<");
        Console.ReadKey();

        // 화면 초기화
        Console.Clear();

        // 라인 좌표 설정 및 텍스트
        Console.SetCursorPosition(0, 0);
        Console.WriteLine("================================================================================@\n" +
            "                                                                                @\n" +
            "================================================================================@");

        // Game Start
        while (true)
        {
            string space = "";

            // 타이머 차감 및 남은 시간 텍스트
            time -= 0.1f;
            Console.SetCursorPosition(30, 5);
            Console.Write($"남은 시간 : {time.ToString("F")}");

            // player 위치 표시
            Console.SetCursorPosition(0, 1);
            for (int i = 0; i < x; i++)
            {
                space += " ";
            }
            Console.WriteLine(space + "O");

            // 이동 로직
            if (Console.KeyAvailable)
            {
                x++;
                Console.ReadKey(true);
            }
            // 완주시 반복문 정지
            if (x >= 80) break;
            // 타임 오버시
            if (time <= 0)
            {
                Console.Clear();
                Console.WriteLine("완주 실패....");
                Thread.Sleep(2000);
                Home();
            }
            Thread.Sleep(10);
        }
        Console.Clear();
        Console.WriteLine("완주 완료!!");
        Console.WriteLine("보상 계산중.... 잠시만 기다려주십시오.");
        Thread.Sleep(2000);

        Console.WriteLine("남은 시간 : {0}", time.ToString("F"));
        Console.WriteLine("");
        Console.WriteLine(">> Press the Any key to proceed <<");
        Console.ReadKey(true);

        // 남은 시간에 따른 보상 및 씬이동 로직 추가예정
        // Home Scene이동
        Home();
    }

아무 키나 입력하여 O를 움직여 결승선에 도달하는 미니게임
아무 키나 입력하면 O뒷쪽에 공백이 늘어나며 앞으로 이동하는 것 처럼 보인다.
타이머를 만들어서 시간 내에 못들어오면 실패 조건을 만들었다.

📌 수정된 코드

일과(주특기) - 미니게임

    static void Speciality_Common()
    {
        // Random 객체 및 randomNumber 초기화
        Random random = new Random();
        int randomNumber = 0;

        // 방향키 입력 순서
        int sequence = 0;

        // 타이머
        double time = 10f;

        // 성공 횟수
        int hitCount = 0;

        // 방향키[]
        char[] text = { '↑', '↓', '←', '→' };

        // 랜덤 방향키를 담을 리스트
        List<char> numberBox = new List<char>();

        // 화면 초기화
        Console.Clear();

        Console.WriteLine("표시되는 방향키를 순서대로 누르세요!");
        Console.WriteLine("");
        Console.WriteLine("총 10개가 나오며 성공한 수대로 보상을 받습니다.");
        Console.WriteLine("");
        Console.WriteLine(">> Press the Any key to proceed <<");

        // 아무 Key나 누를시 진행
        Console.ReadKey(true);

        // 화면 초기화
        Console.Clear();
        Console.WriteLine("========================================");
        for (int i = 0; i < 10; i++)
        {
            randomNumber = random.Next(0, 3);
            Console.Write($" {text[randomNumber]} ");
            numberBox.Add(text[randomNumber]);
        }
        Console.WriteLine("");
        Console.WriteLine("========================================");
        Console.WriteLine("");
        Console.WriteLine("보기를 외워서 알맞은 키를 순서대로 누십시오!");
        Console.WriteLine("");
        Console.WriteLine("남은 시간이 끝나면 시작되며 보기가 사라집니다.");

        // 타이머 표시
        while (time >= 0)
        {
            Console.SetCursorPosition(0, 8);
            Console.WriteLine($"남은 시간 : {time:F}");
            time -= 0.01f;
            Thread.Sleep(10);
        }

        // 화면 초기화
        Console.Clear();

        // 입력 로직
        Console.WriteLine("알맞는 키를 입력하시오.");
        while (sequence < 10)
        {
            e = Console.ReadKey(true);
            switch (e.Key)
            {
                case ConsoleKey.UpArrow:
                    if (numberBox[sequence] == '↑') hitCount++;
                    Console.Write(" ↑ ");
                    break;
                case ConsoleKey.DownArrow:
                    if (numberBox[sequence] == '↓') hitCount++;
                    Console.Write(" ↓ ");
                    break;
                case ConsoleKey.LeftArrow:
                    if (numberBox[sequence] == '←') hitCount++;
                    Console.Write(" ← ");
                    break;
                case ConsoleKey.RightArrow:
                    if (numberBox[sequence] == '→') hitCount++;
                    Console.Write(" → ");
                    break;
                default:
                    break;
            }
            sequence++;
        }

        Console.WriteLine("");
        Console.WriteLine("총 맞춘 횟수 : {0}", hitCount);

        Console.ReadKey();
        // 맞춘 횟수에 맞는 보상 지급 로직 추가
        // 메인화면 이동
        Home();
    }

원래는 보기를 보면서 따라입력하는 형식으로 하였는데 타이머를 두고 그 시간동안 외운뒤 타이머가 끝나면 보기가 사라지고 외운걸로 입력하여 맞춘만큼 보상을 얻는 형식으로 바꾸었다.

추가 기능 : 타이머

일과(작업) - 미니게임

    static void Work_Shoveling()
    {
        // 성공 횟수
        int hitCount = 0;
        // 화살표 속도
        int arrowSpeed = 25;
        // 화면 초기화
        Console.Clear();

        Console.WriteLine("화살표가 가운데 왔을 때 아무 키나 누르세요!");
        Console.WriteLine("");
        Console.WriteLine("총 5번 진행되며 성공한 수대로 보상을 받습니다.");
        Console.WriteLine("");
        Console.WriteLine(">> Press the Any key to proceed <<");

        // 아무 Key나 누를시 진행
        Console.ReadKey(true);

        for (int i = 1; i <= 5; i++)
        {
            hitCount = ShovelingEvent(hitCount, arrowSpeed);
            // 웨이브별 속도 업 ( 난이도 상승 )
            arrowSpeed -= 5;

            if (i == 5)
            {
                Console.WriteLine("총 성공 횟수 : {0} ", hitCount);
                Console.WriteLine("횟수에 맞게 보상을 지급합니다!");
            }
            else
            {
                // 대기시간
                Console.WriteLine("현재 라운드 {0} / {1}   성공 횟수 : {2} ", i, 5, hitCount);
                Console.WriteLine("잠시후 다시 시작합니다!");
                Thread.Sleep(1000);
            }
        }

        Console.ReadKey();
        // hitCount 횟수에 맞는 보상 지급
        // 메인화면 이동
        Home();
    }

    // 삽질_로직
    static int ShovelingEvent(int _hitCount, int _arrowSpeed)
    {
        // 초기 좌표 설정 값
        int xfront = 60;
        int xback = 0;

        Console.Clear();

        Console.WriteLine("===========================ㅣ   ㅣ===========================\n\n" +
            "===========================ㅣ   ㅣ===========================\n\n" +
            "               Press Enter at the right time                ");

        while (!Console.KeyAvailable && xfront > 0)
        {
            // 앞 뒤 공백변수 선언
            string space = "";
            string spaceback = "";

            // 화살표 이동 로직
            Console.SetCursorPosition(0, 1);
            for (int i = 0; i < xfront; i++)
            {
                space += " ";
            }
            for (int j = 0; j < xback; j++)
            {
                spaceback += " ";
            }
            Console.Write(space + "<" + spaceback);

            // space수량 조절
            xfront--;
            xback++;
            // 대기시간
            Thread.Sleep(_arrowSpeed);
        }
        // 삽질 성공or실패
        if (xfront >= 28 && xfront <= 32)
        {
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("                         삽질 성공 !                ");
            Thread.Sleep(1000);
            _hitCount++;
        }
        else
        {
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("                         삽질 실패 . . .              ");
            Thread.Sleep(1000);
        }
        // 화면 초기화
        Console.Clear();

        // KeyAvailable 초기화
        Console.ReadKey();

        return _hitCount;
    }

원래는 Console.SetCursorPosition를 이용하여 중구난방으로 왔다갔다 하며 찍게 하였다.
그 커서 좌표를 이용하여 x좌표를 1씩 빼고 Console.Clear();를 이용하여 이동하는 것 처럼 보이게 하였다.
하지만 그렇게 하니 Console이 지워지고 다시 써지며 너무 깜빡이는 현상이 심해서 방법을 위에 체력단련 미니게임처럼 바꾸어보았다.
지우고 다시 그리는 방식이 아닌 그 위에 다시 공백(스페이스바)로 채워주며 마치 지워지고 다시 그려지는 것 처럼 보이게 하여 화면이 깜빡거리지도 않고 자연스럽게 이동하는걸 구현했다.

추가된 기능 : 웨이브별 랜덤 속도 - > 웨이브가 올라갈수록 빨라지는 속도, 이동하는 < 에 앞뒤로 공백(스페이스바) 채워줘서 이동현상 구현

📌 앞으로 할 것

마감이 수요일 저녁이므로 얼마 남지 않았다. 이제 남은 구현은 저장, 음식, 전투 확장 정도이다.
나는 텍스트 부분을 내가 캡슐화 시켜놨던 방식으로 바꾸고 음식의 체력회복 기능을 구현해보려고 한다. 그리고 시간이 남으면 콘솔창도 꾸며보도록 하겠다.

profile
No Easy Day

0개의 댓글