Part 1의 마지막에 우리가 직면한 문제의 원인이 여기 있습니다. 비퍼를 내려놓습니다. 앞으로 이동하기 전에 비퍼가 옆에 있지 않은지를 확인하는 테스트를 합니다. while 반복 명령문에 들어갈 기회가 전혀 없습니다. 반복 명령문을 실행하기 전에 move() 명령문을 아래와 같이 추가하여 수정합니다.
put_beeper() move() while not on_beeper(): if front_is_clear(): move() else: turn_left() turn_off()
성공! 시도해 보세요.
작성한 프로그램을 조금 더 복잡한 월드에서 실행해 봅시다. 아래 월드는 쉽게 다시 만들 수 있는 월드입니다.
결과는 우리가 원하는 것은 정확히 아닙니다. 리보그가 지름길을 택해서, 벽을 따라 움직이지는 않았습니다.
문제는 리보그가 벽을 따라 움직일 때 단지 앞으로 전진만 하거나, 왼쪽으로만 회전하는 것을 가정했습니다. 리보그가 오른쪽으로 회전하는 상황에 대해서는 고려를 전혀 하지 않았습니다. 리보그에게 필요한 것은 첫째 오른쪽에 여전히 벽이 있는지를 확인하는 것입니다. 만약 벽이 없다면, 리보그가 오른쪽으로 회전을 해야만 합니다. 오른쪽으로 회전하는 수정한 버전의 프로그램이 있습니다.
def turn_right(): repeat(turn_left, 3) put_beeper() move() while not on_beeper(): if right_is_clear(): turn_right() elif front_is_clear(): move() else: turn_left() turn_off()
정상적으로 잘 동작합니까? 결정을 내리기 위해서 주의 깊게 읽어보세요. 여러분의 의견을 확인하기 위해 직접 시도해 보세요.