Karel - 3번

필요한 기능

  1. beeper 놓기
  2. 앞으로 갈 수 있는지 check
  3. 만약 못가면 위를 바라보기(왼쪽, 오른쪽 다르게)
  4. 위를 바라봤는데 막혀있으면 멈추기

코드

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를 통해 반복문을 빠져나오게 했다.

좋은 웹페이지 즐겨찾기