-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
해결됨
ProcessField()에서 엔터를 누르면 몬스터가 새로생성되는것을 막고싶습니다.
21.05.07 17:29 작성 조회수 80
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
Rookiss
지식공유자2021.05.07
FieldSelect()에서 또 FieldSelect()를 재귀적으로 호출하는 것은 살짝 위험합니다.
함수를 호출하려면 내부적으로 스택 프레임이라고
해당 함수 호출하기 위한 몇몇 정보가 스택 메모리에 추가되는데,
유저가 3을 무한정 누르다 보면, 스택 메모리가 터져서 크래시가 날 수 있습니다.
단순히 1, 2 입력을 강제하고 싶다면,
string input = "";
while (input == "1" || input == "2")
{
input = Console.ReadLine();
}
과 같이 input 단계에서 루프를 도는 등 다양한 방법으로 해결이 가능합니다.
조창훈
질문자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도 받아집니다. 혹시 이렇게 구현했을 때 발생할 수 있는 문제가 있을까요?
Rookiss
지식공유자2021.05.08
while (input != "1" && input != "2")
{
input = Console.ReadLine();
}
조건이 거꾸로 되어 있었네요 본의아닌 낚시 죄송합니다 ㅎㅎ
그리고 일단 코드가 잘 동작하면 넘어가도 상관없습니다.
수영을 처음 배울 때 중요한건 물에 뜨고 앞으로 나아가는 것이지,
동작의 우아함과 포즈는 아주 훗날 신경쓸 문제인 것과 마찬가지입니다.
답변 1