6 장. 방송하기와 난수



[학 습 비디오] 

  (비디오-1)  방송하기

  1. 방 송하기 - 서로 다른 스프라이트 사이의 메세지 전달
    간 단한 연극 만들기
    아 래와 같이 <이상한 나라의 앨리스>의 한 장면을 연극으로 만들고자 한다.

     
  2. 새로운 스프라이트 추가

    새 로운 스프라이트를 추가하고 싶을 때 캐릭터 모양의 아이콘을 사용한다.

  3. 스프라이트별 스크립트
    Alice 과 cat은 다른 스크립트 영역을 가지고 있고 각 스프라이트를 누르면 각각의 스크립트를 볼 수 있다.
    Alice 스크립트

    Cat 스크립트


  4. 메시지 전달에 따른 실행 순서
  5. "재생하기"와 "끝까지 재생하기"

    컴 퓨터는 매우 빠르기 때문에 연산과 같은 명령 블록 하나를 실행하는 데에는 우리가 인지할 수 없을 정도로 짧은 시간밖에 소요되지 않는다. 그런데 소리 파일 재생(play)과 같이 실행하는 데 일정한 시간이 걸리는 명령의 경우에는 바로 다음 명령이 실행되는 것이 의도하지 않은 문제를 초래하기도 한다. 소리 재생이 끝나기도 전에 같은 소리가 또 재생되면 먼저 시작한 소리는 들을 수 없게 되는 경우가 생긴다.
    스크래치에는 이러한 경우를 서로 다른 방식으로 처리하는 두 가지 명령 블록을 제공한다. 소리 재생이 끝날 때까지 기다린 후 다음 명령으로 넘어가는 방식과, 그렇게 하지 않고, 소리 재생을 시작만 한 후 바로 다음 명령을 실행하는 방식이다.
    "~ 재생하기"는 재생을 시작한 후 바로 다음 명령을 실행하는 반면, "~ 끝까지 재생하기"의 경우에는 소리 재생이 끝날 때까지 다음 명령 블록으로 넘어가지 않고 기다린다. 그래서  "~ 재생하기"블록이 3개 연속되어 있을 경우, 처음 소리가 재생되기 시작하자 마자 다음 소리가 또 시작되고, 바로 다음 소리가 또 시작되므로, 우리 귀에는 소리가 한번 밖에 들리지 않는다. 한편 "끝까지 재생하기"가 연속되어 있는 경우에는 실행이 모두 끝난 후 다음 명령 블록을 실행하므로 3번 반복되는 것을 모두 들을 수 있는데, 이것은 "재생하기" 이후에 "~초 기다리기" 명령을 실행하는 것과 같은 효과이다.

  6. " 방송하기"와 "방송하고 기다리기"

    " 방송하기"와 "방송하고 기다리기"의 차이도 같은 개념이다. "~ 방송하기"는 메시지를 보낸 후 바로 다음 명령을 수행한다. 그래서 다음 명령이 순식간에 이어서 실행된다. 한편 "~ 방송하고 기다리기"는 메시지를 받은 스크립트들이 실행하는 모든 명령블록들이 끝날 때까지 기다린다. 아래 스크립트에서 "~ 방송하고 기다리기"를 두 개 연결한 경우는 60번 음을 3번씩, 모두 6번 들을 수 있지만, "~ 방송하기"를 두 개 연결한 경우는 첫번째 메시지가 전달되자마자 다음 메시지가 또 전달되므로 60번 음을 3번밖에 들을 수 없다.

    unanswered 

  (비디오-2)  난수(random number)

  1. 난수
    프로그램에서 <가위 바위 보>나 <주사위 던기지> 등, 고정되지 않고 불규칙하게 변화하는 기능이 필요할 때가 있다. 즉, 매번 똑 같은 숫자로 실행되는 것이 아니라 무작위로 달라질 필요가 있을 때, 난수는 매우 유용하다. 다음 명령 블록은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 중 하나를 임의로 선택할 수 있게 한다.
                                        
    이 블록은 값을 받아들이는 타원형 위치 어느 곳에나 쓸 수 있다. 아래 블록은 스프라이트는 1에서 30도 사이에서 임의로 돌게 하고, 1에서 100 스탭 중 임의로 움직이게 한다.

                      
  2. 가위바위보 게임
    가위바위보 게임을 보면서 난수의 활용방법을 익혀보자.
    - 두 스프라이트가 먼저 가위바위보를 말한다.
    - 이후 심판이 비겼는지, 누가 이겼는지 말한다.

    - choice가 1일때 무엇이라 말하는가?
    - choice가 2일때 무엇이라 말하는가?
    - choice가 3일때 무엇이라 말하는가?

    - 이런 게임은 단계별로 기능을 추가해 나가며 개발하는 것이 바람직하다.
    - 1단계: 1~3 사이의 난수를 정하고 말하기부터 시작하자.
    - 2단계: 난수의 값에 따라 가위, 바위, 보를 말하게 하자.
    - 3단계: 심판을 정해 누가 이겼는지 판정하게 하자.
  3. 1단계: 난수 말하기
    - choice가 1~3 의 값을 가질 때, 가위, 바위, 보에 대응된다. 그러므로 우선 1~3을 말하게 하자.
  4. 2단계: 가위바위보 말하기
  5. 3단계: 심판 추가하기
    - 심판은 언제 판정을 해야할 지 어떻게 알 수 있을까? 고양이 또는 오리가 가위바위보를 말하고 판정하라는 메시지를 방송하면 된다. 심판은 이 메시지를 받고 판정을 진행한다.

[연 습]

  1. 연극 만들기
    다음과 같은 연극을 만들어 보자. 대사를 하기에 앞서 두 스프라이트가 마주 보게 하려면 어떻게 해야 될까?

     
  2. 스크래치 재미있다
    다음 스크립트를 만들고 위쪽 스크립트를 더블클릭하면  무슨 일이 일어날 지 예상해보자. 직접 실행하여 확인하자.

     
  3.  난수 연습
    난수를 이용하여 캐릭터가 랜덤 위치로 움직이되, 무대의 (x,y) 좌표를 기준으로 (-100,-100) ~ (100,100) 에는 머물도록 해 보자
    - y가 -100보다 작아지면 y = -100으로 하여 더 아래로 가지 않게 한다.
    - y가 100보다 커지면, y = 100으로 하여 더 위로 가지 않게 한다.
    - x가 -100보다 작아지면 x = -100으로 하여 더 왼쪽으로 가지 않게 한다.
    - x가 100보다 커지면, x = 100으로 하여 더 오른쪽으로 가지 않게 한다.
     
  4. <가위 바위 보> 게임 만들기 Step 1
    동영상을 참고하여, 초록 깃발을 누르면 고양이와 오리 스프라이트가 각각 1에서 3사이의 난수를 말하게 하자. 아래와 같은 모습으로 동작해야 할 것이다.
  5. <가위 바위 보> 게임 만들기 Step 2
    이제 Cat_choice 변수의 값을 이용하여 가위, 바위, 보를 말하게 하자.
    - 1이면 바위라고 한다.
    - 2면 보라고 한다.
    - 3이면 가위라고 한다.


    Hint: 만약 ~라면 블록과 녹색의 비교 연산 블록 중 = 표시된 블록을 통해 두 값이 같은지를 확인한다.

     
  6. <가위 바위 보> 게임 만들기 Step 3
    이제 3번째 스프라이트를 추가하여 심판이 되고, 누가 이겼는지 말하게 한다.
    - 언제 두 스프라이트가 동점이 되는가?
    - 고양이가 이기는 경우는 어떻게 표현되는가?
    - 심판은 언제 판정을 내려야 하는지 어떻게 알 수 있을까? (힌트: 방송하기를 활용한다)
    - 가위, 바위, 보를 말한 후, 고양이나 오리가 하나만 메시지를 방송해야 할까, 아니면 둘 다 방송을 해도 될까?
    - 누가 이겼는지에 따라 심판의 모양을 바꾸어 이긴 사람을 가리키게 할 수도 있다. 이 기능은 꼭 필요한 것은 아니나 관심있는 학생은 스프라이트의 모양을 여러 개 만들고 [형태] 탭의 "모양을 ~로 바꾸기" 블록을 이용해 보자.
  7. <가위 바위 보> 게임 만들기 Step 4
    이제 두 스프라이트가 게임을 할 때마다 점수가 누적되도록 해 보자.
    - 각 스프라이트의 점수를 기록하는 변수를 만든다.
    - 고양이가 이긴 경우 점수를 증가시키는 블록은 어떤 것을 사용할까?
    - 코드가 거의 완성되어 있으므로 심판의 스프라이트를 약간만 수정하면 된다.



  8. <가위 바위 보> 게임 만들기 Step 5
    또 다른 기능을 추가해 보자.
    - 예를 들면, 초록 깃발을 눌러 시작하면 게임 점수가 0으로 초기화 되고, Play 버튼을 누를 때마다 가위바위보를 한번씩 실행하게 한다.
    - 이 외에도 다양한 아이디어를 추가해 본다.




[Homework]  Up/Down 게임

Up/Down 게임은 다음과 같이 구성됩니다.
- A는 숫자의 최대값을 정한다.
- B는 1과 A가 정한 최대값 사이에서 숫자 하나를 고른다.
- A가 숫자 하나를 부르면 B는 정답이 그 수보다 큰지 작은지를 "너무 커!"와 "너무 작아!"로만 알려준다.
- 맞출 때까지 계속된다.

*** 링크 *** 를 따라가서 스크립트를 살펴봅니다.  몇 가지 버그가 있어서 잘 동작하지 않습니다. 부족한 부분을 수정하여 게임을 완성하고 어떤 부분을 수정했는지 보고합니다.

힌트:
1 부터 20사이의 숫자를 맞추는 게임을 하고 있습니다.
- 1에서 20사이에서 아무 숫자(난수)나 계속 말하는 것은 좋은 전략입니까?
-
7 이라고 말했는데, 너무 크다고 했습니다. 여기서 알 수 있는 정보는 무엇일까요?
- 7이라고 말했는데, 너무 작다고 했습니다. 여기서 알 수 있는 정보는 무엇일까요?
- 숫자를 한 번 추측할 때마다 문제 낸 사람이
알 려준 크다, 작다 정보에서 정답이 될 수 없는 것을 지워나가면서 정답의 범위를 좁혀 나갈 수 있습니다.
- 그러면 숫 자를 추측할 때, 가능한 많은 숫자를 지우도록 숫자를 결정하는 전략은 무엇일까요? 1~20 사이에서 숫자를 맞출 때, 처음에 어떤 숫자를 말해야 가장 많은 숫자를 지우고 정답 범위를 좁힐 수 있을까요?