inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

TextRPG2 게임 진행

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

해결된 질문

159

조창훈

작성한 질문수 3

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;

            }

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

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

C#

답변 1

1

Rookiss

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

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

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

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

0

조창훈

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

0

조창훈

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

디버깅을 해본 결과 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도 받아집니다.  혹시 이렇게 구현했을 때 발생할 수 있는 문제가 있을까요?

0

Rookiss

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

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

0

조창훈

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

답변 감사합니다! 

Generic에 대한 질문 있습니다.

0

113

2

2022 버전에 커뮤니티 버전이 없는데 2026 버전으로 해도 무관?

0

226

2

다형성 캐시 문제

0

136

3

.

0

77

1

프로퍼티 강의 질문 있습니다.

0

85

1

이후 커리 질문

0

92

1

static

0

103

2

강의에는 새로운 클래스 파일을 생성하면...

0

81

1

생성자의 이름 선언

0

70

1

9:03 Divide(10 , 3) 부분 질문입니다

0

93

1

깃허브 관련 질문 있습니다.

0

249

1

비쥬얼 스튜디오 업데이트가 된건가요..? 매개변수 오류 관련 질문

0

258

1

C# 시리즈 || C++ 시리즈 자료구조 강의에 대한 질문입니다!

0

311

2

Activator 질문있습니다

0

343

1

이넘 타임 선언 질문

0

359

1

Sort 오름차순, 내림차순

0

333

1

질문 있습니다.

0

254

1

팩토리얼 문제

0

277

1

Sort함수 질문있습니다.

0

272

1

다형성 함수 질문 있습니다.

0

231

1

질문이 있습니다.

0

236

1

섹션2 연습문제 질문입니다.

0

223

1

안녕하세요~서버에 대해 질문이 있습니다.

1

289

1

텍스트 색깔이 제 편집기와 달라서 수강에 어려움이 있습니다ㅜㅜ

0

401

1