Karel - 3번
필요한 기능
- beeper 놓기
- 앞으로 갈 수 있는지 check
- 만약 못가면 위를 바라보기(왼쪽, 오른쪽 다르게)
- 위를 바라봤는데 막혀있으면 멈추기
코드
private boolean end;
public void run() {
end = false;
while (true) {
putBeeper();
// 기능
// 1. 오른쪽 벽을 마주쳤을 때 위로 돌아서 움직이기
// 2. 왼쪽 벽을 마주쳤을 때 위로 돌아서 움직이기
// 3. 만약 위로 돌아서 움직일 곳이 없다면 end = true로 바꿔주기
checkAndMove();
// 만약 end== true이면 while문 빠져나오기
if (end == true) break;
checkAndMove();
if (end == true) break;
}
}
private void checkAndMove() {
// 1. 오른쪽 벽을 마주쳤을 때 위로 돌아서 움직이기
if (facingEast() && frontIsBlocked()) {
turnLeft();
// 위로 돌았는데 막혀있을 수 있다. 이럴 떄는 end = true로 바꾸어 준다.
checkCanGo();
// 막혀 있다면 바로 return;을 해주어서 밑에 식은 사용되지 않게 한다.
if (end == true) {
return;
}
move();
turnLeft();
// 2. 왼쪽 벽을 마주쳤을 때 위로 돌아서 움직이기
} else if (facingWest() && frontIsBlocked()) {
turnRight();
// 위로 돌았는데 막혀있을 수 있다. 이럴 떄는 end = true로 바꾸어 준다.
checkCanGo();
// 막혀 있다면 바로 return;을 해주어서 밑에 식은 사용되지 않게 한다.
if (end == true) {
return;
}
move();
turnRight();
// 막혀있지 않다면 앞으로 한 칸 움직인다.
} else {
move();
}
}
// 앞으로 갈 수 있는지 확인. 못가면 end = true로 바꾼다.
private void checkCanGo() {
if (frontIsBlocked()) {
end = true;
return;
}
}
}
느낀점
위가 막혀있을 때 즉 끝이 났을 때를 어떻게 표현해야 될 지 고민을 많이 했다. 막혀 있으면 checkAndMove에 밑에 코드를 실행하지 않게 해야되고 run()에 있는 while문도 빠져나오게 해야했다. 그래서 end라는 boolean 변수를 두고 앞이 막혀있으면 end = true를 집어넣고 checkAndGo 에서 end == true이면 return;을 통해 함수의 실행이 끝나게 했다. while문 에서도 end == true이면 break를 통해 반복문을 빠져나오게 했다.
Author And Source
이 문제에 관하여(Karel - 3번), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wnsgur9701/Karel-3번저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)