13. 제 말을 들으세요…그렇지 않다면

프로그램을 작성하는 것을 배우는 것이 재미있을지 모르지만, 컴퓨터 앞에서 많은 시간을 보내고 싶지는 않을 것입니다. 만약 비가 내린다면, 책을 읽고, 그렇지 않다면 밖으로 나가서 노세요. 예 심지어 할아버지도 말입니다.


1. 선택하기

if 로 시작하는 문장으로 재미있게 놀아봅시다.

If it rains,
... keep reading,
otherwise,
... go outside and play!

위 문장은 마치 작은 컴퓨터 프로그램처럼 보입니다. 파이썬 프로그램처럼 다시 작성을 해 봅시다.

if it_rains():
    keep_reading()
else:
    go_outside_and_play()

방금 전에 여러분은 파이썬의 else 키워드를 배웠습니다. 그래서, 만약 비가 온다면, 책을 읽고, 그렇지 않다면 여러분은 무엇을 해야 할지 알고 있습니다.


리보그가 “이제 보여요…” 라고 말합니다.

하나 혹은 그 이상의 비퍼 옆에 리보그가 서 있는지를 알 수 있는 것에 더해서, 리보그는 앞에 벽이 있는지도 알 수 있어요. 리보그는 머리를 왼쪽 혹은 오른쪽으로 돌려서 벽이 있는지를 알 수 있어요. 리보그에게 다음 테스트를 요청할 수 있습니다.

front_is_clear()  # 만약 전방(앞)에 벽이 없다면 참(True), 그렇지 않으면 거짓(False)
left_is_clear()
right_is_clear()

리보그가 월드를 탐색하는데 첫 번째 명령문을 사용합시다. 만약 벽이 없다면 계속 전진하고, 벽이 있다면 왼쪽으로 회전을 합으로서 리보그가 월드의 경계를 따라 움직이게 할 수 있습니다. 간단한 다음 프로그램이 필요한 기초입니다.

if front_is_clear():
    move()
else:
    turn_left()
      
turn_off()

아래는 두 가지 다른 상황에서 간단한 프로그램을 실행시킨 결과입니다.

start if lead to end if

start if lead to end if

이제 간단한 조건 명령문을 많이 반복 실행해서 리보그가 월드를 돌아다니게 해봅시다.

def move_or_turn():
    if front_is_clear():
        move()
    else:
        turn_left()

repeat(move_or_turn, 20)      
turn_off()

작은 월드에서 프로그램을 실행하면 다음의 결과를 줄 것입니다.

around

리보그가 앞으로 이동하고 방향을 바꾸면 비퍼를 내려 놓는다면, 리보그가 춤을 추게 함으로써 벽을 따라 이동하는 것을 좀더 흥미롭게 만들 수 있습니다.

def dance():
    repeat(turn_left, 4)
def move_or_turn():
    if front_is_clear():
        dance()
        move()
    else:
        turn_left()
        put_beeper()

repeat(move_or_turn, 18)      
turn_off()

이 작업을 수행할 수 있도록 충분한 비퍼를 리보그가 가지고 다니도록 확인하세요. 다음 프로그램은 리보그가 월드의 일부를 돌아다니며 작업을 수행하는 일부입니다.
beepers button beepers button.

dance()와 move()명령문이 if 문에 들여쓰기가 되어 있어서, 동일한 명령문 블록에 속해서 정렬되어 있는 것을 주목하세요. else 문에 속해서 들여쓰기 되어 있는 turn_left()와 put_beeper() 명령문도 비슷하게 정렬되어 있습니다. 프로그램 실행 결과는 아래 표시되어 있습니다.

around

이제 put_beeper()와 turn_left()가 정렬되어 있지 않고, 아래와 같이 대신에 else문과 같이 정렬한다면 무슨 일이 생길까요?

def dance():
    repeat(turn_left, 4)
def move_or_turn():
    if front_is_clear():
        dance()
        move()
    else:
        turn_left()
    put_beeper()

repeat(move_or_turn, 18)      
turn_off()

이제 move_or_turn() 명령 함수는 매번 put_beeper() 명령문을 실행하고, 춤을 추고 앞으로 가든지 왼쪽으로 회전하는 if/else 선택을 포함합니다. 이 프로그램의 실행 결과는 아래 나타나 있습니다.

around

보시면, 매번 앞으로 리보그가 전진할 때, 비퍼를 자리에 놓습니다. 각 모퉁이에는 두 개의 비퍼가 있습니다. 하나는 모퉁이에 도달하는 앞선 이동에서 나온 비퍼고, 다른 하나는 모퉁이에 도착한 후에 왼쪽으로 회전하면서 나온 비퍼입니다.

이제 put_beeper() 명령문을 아래에 나타나 있듯이 def 문과 정렬하면 어떻게 될까요?

def dance():
    repeat(turn_left, 4)
def move_or_turn():
    if front_is_clear():
        dance()
        move()
    else:
        turn_left()
put_beeper()

repeat(move_or_turn, 18)      
turn_off()

이제 put_beepr()는 정의 명령 함수문에 포함되어 있지 않아서 다른 정의 명령문과 정렬되어 들여쓰기가 되어 있지 않습니다. Put_beeper()는 단일 명령문입니다. move_or_turn() 명령 함수문을 18번 실행하기 전에 리보그가 수행해야 하는 첫 번째 명령문입니다. 실행 결과는 다음과 같습니다./p>

around

지금까지 보시다시피, 빈 공백(즉, 블록 안에 명령문 들여쓰기)을 통해서 많은 정보가 리보그에게 전해집니다. 연습을 통해서, 빈 공백 들여쓰기를 잘 활용하는 방법을 배울 것이고, 명령문을 들여쓰기 함으로써 파이썬에서 메우 읽기 좋은 코드를 작성할 수 있다는 것도 학습할 것입니다.


장애물 넘기

리보그는 장애물 넘기를 잘 합니다. 리보그가 다른 길이의 경주(짧은 스프린트, 장거리 레이스)에 참가합니다. 리보그는 비퍼가 옆에 있을 때 결승선에 도착했다는 것을 인지합니다. 아래, 두 개의 경기 코스가 있습니다. 월드 파일은 hurdles1.wld, hurdles2.wld입니다.

hurdles start

hurdles start

20 단위보다 더 긴 경주는 없다고 가정합시다. 아래와 같은 명령문 함수를 정의합시다.

def move_jump_or_finish():
    if on_beeper(): # end of race
        turn_off()
    else:
        if front_is_clear(): # not finished, and no hurdle to jump
            move()
        else:
            jump_one_hurdle()

jump_one_hurdle() 명령 함수문으로, 다른 함수 정의문없이, 리보그가 수행할 필요가 있는 하나의 명령문은 다음과 같습니다.
repeat(move_jump_or_finish, 20).

위의 정의에서, 코드는 테스트를 추가함에 따라 점점 더 들여 쓰게 됩니다.

previous 리보그 스스로 결정할 수 있다면 - home - If, else, if, else, ....next