• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

ProcessField()에서 엔터를 누르면 몬스터가 새로생성되는것을 막고싶습니다.

21.05.07 17:29 작성 조회수 79

1

ProcessField 실행중에  1과 2중 아무것도 선택하지 않고 엔터를 누르면 그냥 ProcessField가 다시 실행되어 다른 몬스터가 생성됩니다.

제가 해결한 방법은

        private void ProcessField()

        {

            Console.WriteLine("필드입장");

            CreateRandomMonster();

            

            FieldSelect();

            

        }

        private void FieldSelect()

        {

            Console.WriteLine("[1]싸운다.");

            Console.WriteLine("[2]일정 확률로 도망친다.");

            string input = Console.ReadLine();

            switch (input)

            {

                case "1":

                    ProcessFight();

                    break;

                case "2":

                    int randValue = rand.Next(0, 101);

                    if (randValue < 33)

                        mode = GameMode.Town;

                    else

                    {

                        ProcessFight();

                    }

                    break;

                default:

                    Console.WriteLine("선택지중 하나를 선택하십시오");

                    FieldSelect();

                    break;

            }

이렇게 함수로 따로 빼서 구현하니, 동작하긴 하는데, 뭔가 찝찝해서 여쭤봅니다.

이런식으로 함수로 따로 빼서 구현하는 방법 말고 다른 방법이 있을까요? 

답변 1

답변을 작성해보세요.

1

FieldSelect()에서 또 FieldSelect()를 재귀적으로 호출하는 것은 살짝 위험합니다.
함수를 호출하려면 내부적으로 스택 프레임이라고
해당 함수 호출하기 위한 몇몇 정보가 스택 메모리에 추가되는데,
유저가 3을 무한정 누르다 보면, 스택 메모리가 터져서 크래시가 날 수 있습니다.

단순히 1, 2 입력을 강제하고 싶다면,

string input = "";
while (input == "1" || input == "2")
{
 input = Console.ReadLine();
}

과 같이 input 단계에서 루프를 도는 등 다양한 방법으로 해결이 가능합니다.

조창훈님의 프로필

조창훈

질문자

2021.05.07

감사합니다. 찝찝하던 부분이 해결됐습니다!

조창훈님의 프로필

조창훈

질문자

2021.05.08

선생님 말대로 구현해본 결과 프로세스 필드에서 무한 루프가 일어나버리는 현상이 일어났습니다...

디버깅을 해본 결과 input 에 readLine이 먼저 할당되지 않아서 그냥 멈추지 않고 ProcessField가 계속 실행되고 있었습니다.

제 나름대로 다시 고민해서 코드를 짜봤는데

string input = Console.ReadLine();

            if (input == "1" || input == "2")

            {

                switch (input)

                {

                    case "1":

                        ProcessFight();

                        break;

                    case "2":

                        int randValue = rand.Next(0, 101);

                        if (randValue < 33)

                        {

                            mode = GameMode.Town;

                        }

                        else

                        {

                            ProcessFight();

                        }

                        break;

                }                

            }

            else

            {

                Console.WriteLine("정확한 수를 입력해주세요");

            }

 이렇게 짜니까 제대로 멈추고, Input도 받아집니다.  혹시 이렇게 구현했을 때 발생할 수 있는 문제가 있을까요?

while (input != "1" && input != "2")
{
 input = Console.ReadLine();
}

조건이 거꾸로 되어 있었네요 본의아닌 낚시 죄송합니다 ㅎㅎ
그리고 일단 코드가 잘 동작하면 넘어가도 상관없습니다.
수영을 처음 배울 때 중요한건 물에 뜨고 앞으로 나아가는 것이지,
동작의 우아함과 포즈는 아주 훗날 신경쓸 문제인 것과 마찬가지입니다.

조창훈님의 프로필

조창훈

질문자

2021.05.08

아 조건이 거꾸로였군요 ㅋㅋ 

답변 감사합니다!