C# 문법 팀과제 - 1

이준호·2023년 11월 17일
0

C#문법 팀과제 1일차



📌 게임 스토리

c#문법을 시작하고 개인과제가 끝난 이후 이제 팀과제가 시작되었다.

팀과제는 개인과제와 주제는 같은 Text Rpg이며 개인과제에서 했던것 보다 규모가 좀 더 커지고

사소한 부분에서 좀 더 퀄리티있게 챙기는 형태이다.

우리 14조는 전원 군필인 점을 기반으로 하여 각각의 군시절 경험에서 우러나온 스토리를 이용하였고

주요 메인 스토리를 진행함으로써 이등병~병장까지 레벨 업하여 최종 전역이 엔딩인 게임이다.

스토리는 메인을 통해 진행하며 계급을 올리고 스토리를 볼 수 있도록 하였고, 각 계급의 마지막 호봉

에서는 보스와 전투를 하여 이겨야 계급이 올라가게 하도록 생각해놨다.

상시 이벤트인 "일과" ( 작업, 체력단력, 주특기 ) 등을 진행하면 스탯을 올리고 돈을 얻어 px 및 군장점

에서 아이템으로 캐릭터를 강화시켜 메인 스토리 전투에 도전하는 형식이다.

📌 내가 구현한 코드(로직)

Cursor 기능

  • 번호를 입력하여 고르는게 아닌 방향키를 움직여 선택할 수 있도록 하였다.
  • 캡슐화 하여 필요할 때 마다 불러와서 사용할 수 있게 하였다.
#region Cursor선택 메서드
// e = Input Key, _cursor =  현재 player가 가리키는 선택지 index
// _text = 선택지 text를 담아둔 배열, _onScene = 반복문 종료 bool값
// 이미 return값이 있는 상황에 onScene값도 필요하여 ref를 이용해 참조값도 바꾸었다.
static int CursorChoice(ConsoleKeyInfo e, int _cursor, string[] _text, ref bool _onScene)
{
	switch (e.Key)
	{
		case ConsoleKey.UpArrow:
			cursor--;
			if (_cursor < 0) cursor = _text.Length - 1;
			break;
		case ConsoleKey.DownArrow:
			cursor++;
			if (_cursor > _text.Length - 1) cursor = 0;
			break;
		case ConsoleKey.Enter:
			onScene = false;
			break;
		default:
			break;
	}
}
#endregion
// _cursor = 위와 같은 cursor값, _text = 위와 같은 text값
#region Text 출력 캡슐화
static void TextChoice(int _cursor, string[] _text)
{
	for (int i = 0; i < _text.Length; i++)
	{
		if (_cursor == i) Console.ForegroundColor = ConsoleColor.Red;
		Console.WriteLine(_text[i]);
		Console.ResetColor();
	}	
}
#endregion

상시 이벤트( 삽질 ) - 미니게임

#region 삽질
static void Work_Shoveling()
{
    // 성공 횟수
    int hitCount = 0;
    // 화면 초기화
    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);

        // 대기시간
        Console.WriteLine("현재 라운드 {0} / {1}   성공 횟수 : {2} ", i, 5, hitCount);
        Console.WriteLine("잠시후 다시 시작합니다!");
        Thread.Sleep(1000);
    }

    // hitCount 횟수에 맞는 보상 지급
}

// 실제 동작 로직 메서드
static int ShovelingEvent(int _hitCount)
{
    // 초기 좌표 설정 값
    int x = 60;
    int y = 1;
    // 화살표
    char obj = '<';
    // Random 객체 생성 및 random값
    Random random = new Random();
    int randomNumber = random.Next(20, 80);


    while (!Console.KeyAvailable && x > 0)
    {
        // 화면 초기화
        Console.Clear();

        Console.WriteLine("===========================ㅣ   ㅣ===========================");
        Console.SetCursorPosition(x, y);
        Console.Write(obj);
        Console.SetCursorPosition(0, 2);
        Console.WriteLine("===========================ㅣ   ㅣ===========================");
        Console.WriteLine("");
        Console.WriteLine("               Press Enter at the right time                ");

        // 좌표 이동
        x--;
        // 대기시간
        Thread.Sleep(randomNumber);
    }
    // 삽질 성공or실패
    if (x >= 28 && x <= 32)
    {
        Console.WriteLine("");
        Console.WriteLine("                         삽질 성공 !                ");
        Thread.Sleep(1000);
        _hitCount++;
    }
    else
    {
        Console.WriteLine("");
        Console.WriteLine("                         삽질 실패 . . .              ");
        Thread.Sleep(1000);
    }
    // 화면 초기화
    Console.Clear();

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

    return _hitCount;
}
#endregion

반복문이 돌아가는 도중 Key값을 받아야 반복문을 탈출하는 기능을 한참 찾다가 "Console.KeyAvailable"이라는 기능을 알았다. 키 값이 입력이 눌린다면! 그 때 true가 되는 읽기전용 프로퍼티 이다. 저 기능을 이용하여 한번은 진행이 됐지만 이중반복문의 밖에서 한번 더 돌게되면 Console.KeyAvailable의 값이 true가 된 상태에서 돌아오지가 않는 문제가 있었다. 그걸 해결한 것이 "Console.ReadKey();"로 한번 입력을 받아 Console.KeyAvailable값이 다시 true로 돌아오게 하는것 이었다.
Console.KeyAvailable가 입력을 받아 true상태가 된다면 Console.ReadKey()로 한번 받아 주면 자동으로 아까 받았던 입력이 들어가며 Console.KeyAvailable가 true로 돌아온다. 구글에서 검색해도 나오지 않던 내용이라 고생을 해서 글로 자세히 적어둔다.

상시 이벤트( 주특기 ) - 미니게임

#region 주특기(방향키 맞추기)
static void Specialty_InputArrow()
{
    // Random 객체 및 randomNumber 초기화
    Random random = new Random();
    int randomNumber = 0;

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

    // 성공 횟수
    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();
    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("");

    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);
    // 맞춘 횟수에 맞는 보상 지급 로직 추가
}
#endregion

📌 앞으로 할 것

상시이벤트는 메인 스토리를 진행하기위해 필수적으로 진행하며 플레이어를 강화시켜야하는 요소이다.

마음 같아서는 10개 이상의 다양한 미니게임을 넣어 지루한 노가다 부분도 재밌게 하고싶지만 일단

전체적인 게임의 완성이 우선이기에 최소 3가지가 필요하니 한가지를 더 만들고 다른 급한 부분을 먼저

해결하고 하려고 한다.

마지막 남은 하나는 달리기 형식의 미니게임으로 아무 키보드나 입력을 받아 빠르게 누르어 도착한 시간

이 짧으면 짧을수록 좋은 보상(스탯, 돈)등을 얻게 하려고 한다.

profile
No Easy Day

0개의 댓글