C#/Study

[C#] TextRpg 팀 프로젝트 중, 특정한곳 입장 시 아이템 충전

Jee-U 2025. 2. 12. 20:16

 

이번 팀 프로젝트 TextRpg엔 휴식하기라는 곳이 있다.

5. 휴식하기

휴식하기를 선택하여 입장 시 500G을 내면 즉시 체력(hp), 마력(mp)을 풀로 회복시켜주고 힐 포션이 3개 미만일경우 3개까지 충전해준다. (힐 포션이 3개 이상일경우 충전은 없다)

이 중 나는 힐 포션 충전 로직을 작성하였다.

SleepScene 클래스로 휴식하기 공간에 대해 따로 관리하고 있었으며 해당 코드는 그곳에 작성해주었다.

다만 포션 자체는 포션 클래스로 따로 관리하고 있었고, 포션은 여러 종류가 있어 그곳에서 힐 포션에 대하여 확인한다.

위 코드의 내용은 아래와 같다.

  1. 현재 보유한 힐 포션의 개수를 확인한다
  2. 3개 미만이면 포션을 지급하고, "포션이 지급되었습니다!" 메세지 출력
  3. 3개 이상이면 지급하지 않고, "포션은 이미 3개 이상 보유중입니다." 메세지 출력
        public void GiftPotion()
        {
            int potionCount = 0;

            potionCount = GameManager.Instance.player.inventory.potion.potionCount[0];
            if (potionCount < 3)
            {
                GameManager.Instance.player.inventory.potion.GetPotion(PotionType.Health, 0);
                potionCount++;
                for (int i = 1; 1 <= 3; i++) 
                Console.WriteLine("포션이 지급되었습니다!");
            }
            else
            {
                Console.WriteLine("포션은 이미 3개 이상 보유 중입니다.");
            }
        }

근데 작동이 안된다.. 내가 분명 힐포션의 초기 값인 3개에서 0~1개까지 깎고왔는데 왜 내 돈은 가져가고 포션은 안주냐..

문제는 뭐였나면....

  • if문 안에 GetPotion(PotionType.Health, 0); 이부분이 문제였다, 0으로 적어놔서 포션카운트가 늘어나지 않는 것이었다.. 1로 수정 후 해결완료
    - potionCount < 3일 경우, 부족한 포션의 개수를 계산하여 3개까지 지급하도록 처리하는 구조
  • for (int i = 1; 1 <= 3; i++), 이거 사실 중간에 1 <= 3 이 아닌 i <= 3이어야 했는데 내가 오타냈다..

그 외에 수정사항은

  • if문 안에 int givePotions = 3 - potionCount;를 넣어 지급할 포션의 갯수가 몇개인지를 확인시켜주었다.
  • potionCount = 0는 초기값 설정 후 실제 내 포션 개수로 덮어씌워지게 하려고 작성햇던 것인데 대신 실제 보유 포션을 가져오게 하여 이를 기준으로 조건을 검사하게 해주었다.
    - 초기화가 사실 필요 없엇던것임 (초기화를 하더라도 그 뒤에 포션 개수로 덮어씌워지게 하기때문)
  • for문에 i는 0으로 시작, i는 givePotions보다 작을 때만 반복문이 실행되도록 바꿔주었다.

아래는 최종 완성 코드이다.

        public void GiftPotion()
        {
            int potionCount = GameManager.Instance.player.inventory.potion.potionCount[(int)PotionType.Health];

            if (potionCount < 3)
            {
                int givePotions = 3 - potionCount;

                for (int i = 0; i < givePotions; i++)
                {
                    GameManager.Instance.player.inventory.potion.GetPotion(PotionType.Health, 1);
                    Console.WriteLine("포션이 지급되었습니다!");
                }
            }
            else
            {
                Console.WriteLine("포션은 이미 3개 이상 보유 중입니다.");
            }
        }

 

이렇게 해서 정상적으로 포션 충전이 가능하게 되었다!

 

 

 

+ 프로젝트의 코드를 완성하고 나서 각자 본인의 방식대로 이렇게도 가능하다 라고 얘기해주신게 있는데

        public void GiftPotion()
		{
		    int potionCount = GameManager.Instance.player.inventory.potion.potionCount[0];

			if (potionCount < 3)
			{
                int givePotions = 3 - potionCount;
				GameManager.Instance.player.inventory.potion.GetPotion(PotionType.Health, givePotions);
		}

1) for 문 없이 부족한 갯수를 바로 채워주는 형식

 

        public void GiftPotion()
        {
            int[] potionCount = GameManager.Instance.player.inventory.potion.potionCount;
            potionCount[(int)PotionType.Health] = 3;
        }

2) 정말 간단하게 힐 포션 갯수를 3으로 만들어주게 함

- 다만 3개보다 많을 경우 3개가 될수있음

 

 

 

 

- 여기서부턴 잡담 아닌 잡담

 

이미 내가 완성했으니 코드는 그대로 가되, 저런식으로도 가능하다 라는 예시를 보여주신건데

진짜 나는 이 코드 작성하는데에도 오랜 시간이 걸렸는데..

코드를 설명하는 나
설명을 들은 나

너무 대단해보였다...

 

이 글에 작성한 코드는 구글링 및 다른 도움보다는 거의 조원분들의 도움만 받았는데,

다른 코드를 배끼거나 비슷한걸 가져와서 수정하기보다는 정말 개념에 대해서 하나하나 짚고 그걸 스스로 풀수있게 조원분들이 이론을 알려주시면 스스로 풀어보고, 막히면 힌트를 던져주시고 다시 풀어보고 이런식으로 진행하였는데 그로인해 알게된것들이 많았다.

 

 

1. 모든 참조 찾기 등

- 이 메서드, 이 변수가 어느 곳에서 사용되고 있는지 나는 Ctrl+F > 모든 문서 찾기로 하나하나 찾고다녔는데 모든 참조 찾기라는 기능이 있다는걸 알았다.. 그 뒤로 메서드나 변수 수정이 필요할 때 이거 어디서 사용하나 하고 쉽게 찾아다니고 있다.

 

2. 정의로 이동, 경로 등

- GameManager.Instance.player.inventory.potion.potionCount 일단 이게 경로라는걸 알게되었고, 우리의 경우 포션은 게임 매니저 > 플레이어 > 인벤토리 > 포션 순으로 접근하고 있었다.

- 경로는 다른분들이 작성한 경로를 그대로 가져오는 식으로 많이 진행했는데 그렇게 하니 오류가 나는게 많았다. 그래서 이 경로를 어떻게 찾아가는지에 대해 완벽히 아르고스! (조원분들이 열심히 이건 어디있을까요, 그 위에는 어디있을까요 라고 질문을 많이 던져주셨다)

- 이것은 어디에서 정해진 것이지..? 라는 생각이 들 때 정의로 이동하는 방법을 알게되었다.

 

 

그 외

- for와 if, switch/case에 대해 어느 상황에 써야할지도 잘 알려주셔서 for를 통해 위와 같이 작성하게 되었는데 아무 검색없이 작성하는데에 정말 오랜 시간이 걸렸다...

 

그냥 정답을 알려주시는게 아닌 어떤식으로 검색해야하는지, 무엇을 찾아야하는지나 어떤식으로 접근해야하는지를 퇴근시간보다 오래동안 남아서 지켜봐주시고 힌트 주셔서 이해해가면서 혼자 풀수있게 해주신 우리 조원님들.. 너무너무 감사함니다......(´▽`ʃ♡ƪ)

 

덕분에 저 부분에 대해선 완벽히 아르고스!

 

며칠 지나고 전혀 모르둠이 되지 않길 바란다.