지금까지의 글들에서 씨앗의 코드 조각들을 많이 보았기 때문이 여기에서는 씨앗으로 된 완전한 응용 프로그램 하나를 소개한다.

이 예제는 씨앗으로 만들어진 '뱀놀이'로, 2인용 게임이 가능하다. 모두 다섯 개의 단원으로 되어 있다.

뱀놀이.sd

Copyright © 1994 by 나눔기술. All rights reserved.

뱀놀이 단원 .
사용 뱀일반, 뱀입력, 뱀화면, 뱀조절 .
사용 바탕, 단말기, 단말흐름 .
 
절차 시작점 ( ) .
 
/* -------------------- */ 구현부 /* ----------------------- */
절차 철수뱀순이뱀만들기 ( ) .
절차 경기하기 ( ) .
절차 단계정하기 ( 정수 어떻게 ) .
절차 글쇠받아처리하기 ( ) .
 
상수 시작단계=1, 다음단계=2, 현단계그대로=3 .
정수 현단계 .
 
큰정수 속도 .
정수   장애물뱀수, 경기장단계 .
부울   철수하나요, 순이하나요, 칼라화면인가, 속도증가하는가 .
정수   철수뱀, 순이뱀 .
 
절차 시작점 ( )
  정수 속도단계 .
{
  선택사항입력받기 ( 철수하나요, 순이하나요, 장애물뱀수,
    속도단계, 속도증가하는가, 칼라화면인가, 경기장단계 ) .
  ~철수하나요 그리고 ~순이하나요 그리고 장애물뱀수=0 {
     참이면 마치기(0) .
  }
  색설정하기 ( 칼라화면인가 ) .  속도 := 200-속도단계 .
  모아쓰기끄기() .
 
  철수뱀순이뱀만들기 ( ) .
  현단계 := --경기장단계 .
  단계정하기 ( 다음단계 ) .
  자동뱀만들기 ( 장애물뱀수, 벽색 ) .
 
  전체뱀속도정하기 ( 속도 ) .
  경기시작 ( 547 ) .
 
  되풀이 {
    경기하기 ( ) .
    모아쓰기켜기 ( ) .
    또합니까 ( 최대세로 ) {
    참이면   모아쓰기끄기 ( ) .
      철수하나요 { 참이면
        뱀초기화 ( 철수뱀, 뱀1색, 5, 0, 수동동작 ) .
      }
      순이하나요 { 참이면
        뱀초기화 ( 순이뱀, 뱀2색, 5, 0, 수동동작 ) .
      }
      단계정하기 ( 현단계그대로 ) .
    거짓이면
      나간다 .
    }
  }
 
  철수하나요 { 참이면  뱀없애기 ( 철수뱀 ) . }
  순이하나요 { 참이면  뱀없애기 ( 순이뱀 ) . }
  자동뱀없애기 ( ) .
  모아쓰기켜기() .
  글자색정하기 ( 15 ) .  배경색정하기 ( 0 ) .  화면지우기 ( ) .
}
 
절차 경기하기 ( )
  정수 경기장상태 .
  정수 뱀번호 .
{
  되풀이 {
    글쇠받아처리하기 ( ) .
    경기장상태 := 모든뱀움직이기 ( 뱀번호 ) .
    경기장상태 값이 {
      뱀다죽었다   => 나간다.
      먹이다먹었다 => 자동뱀없애기 ( ) .  단계정하기 ( 다음단계 ) .
        자동뱀만들기 ( 장애물뱀수, 벽색 ) . 경기시작 ( 547 ) .
        조건 {
          철수하나요 참이면
            뱀이름붙여점수산놈수출력하기 ( 철수뱀, 우상, "철수뱀" ) .
          순이하나요 참이면  .
            뱀이름붙여점수산놈수출력하기 ( 순이뱀, 좌상, "순이뱀" ) .
          아니면  .
        }
      먹이먹었다 =>
        조건 {
          뱀번호=철수뱀 참이면
            뱀이름붙여점수산놈수출력하기 ( 철수뱀, 우상, "철수뱀" ) .
          뱀번호=순이뱀 참이면  .
            뱀이름붙여점수산놈수출력하기 ( 순이뱀, 좌상, "순이뱀" ) .
          아니면  .
        }
    }
  }
}
 
절차 철수뱀순이뱀만들기 ( )
{
  철수하나요 {
  참이면
    철수뱀:=뱀만들기(뱀1색) .
    뱀초기화 ( 철수뱀, 뱀1색, 5, 0, 수동동작 ) .
    뱀위치방향초기화 ( 철수뱀, 1, 3, 45, 34, 위, 80, 참 ) .
  }
  순이하나요 {
  참이면
    순이뱀 := 뱀만들기 ( 뱀2색 ) .
    뱀초기화 ( 순이뱀, 뱀2색, 5, 0, 수동동작 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 3, 45, 34, 위, 80, 참 ) .
  }
}
 
절차 단계정하기 ( 정수 어떻게 )
{
  화면공간초기화 ( 배경색 ) .  경기장경계그리기 ( 벽색 ) .
  어떻게 값이 {
    시작단계 => 현단계 := 1 .
    다음단계 => 현단계 ++   .
    그밖     => .
  }
  장애물그리기 ( 현단계 ) .
  현단계 값이 {
  1 => .  뱀위치방향초기화 ( 철수뱀, 1, 2, 50, 25, 오른, 80, 참 ) .
          뱀위치방향초기화 ( 순이뱀, 1, 2, 30, 25,   왼, 80, 참 ) .
  2 =>
    뱀위치방향초기화 ( 철수뱀, 1, 2, 60,  7,   왼, 80, 참 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 2, 20, 43, 오른, 80, 참 ) .
  3 =>
    뱀위치방향초기화 ( 철수뱀, 1, 2, 50, 25,   위, 80, 참 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 2, 30, 25, 아래, 80, 참 ) .
  4 =>
    뱀위치방향초기화 ( 철수뱀, 1, 2, 60,  7,   왼, 80, 참 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 2, 20, 43, 오른, 80, 참 ) .
  5 =>
    뱀위치방향초기화 ( 철수뱀, 1, 2, 50, 25,   위, 80, 참 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 2, 30, 25, 아래, 80, 참 ) .
  9 =>
    뱀위치방향초기화 ( 철수뱀, 1, 2, 75, 40,   위, 80, 참 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 2,  5, 15, 아래, 80, 참 ) .
  6 => . | 7 => . | 8 => . | 그밖 =>
    뱀위치방향초기화 ( 철수뱀, 1, 2, 65,  7, 아래, 80, 참 ) .
    뱀위치방향초기화 ( 순이뱀, 1, 2, 15, 43,   위, 80, 참 ) .
  }
}
 
절차 글쇠받아처리하기 ( )
  크기수 가상글쇠하나 .
{
  가상글쇠하나 := 가상글쇠부호얻기 ( ~기다려라 ) .
  가상글쇠하나 값이 {
    글쇠_처음       => 가상글쇠부호얻기 ( 기다려라 ) .
    글쇠_끝         => 마치기 ( 0 ) .
    글쇠_쪽위로     => 속도 -= 10 . 전체뱀속도정하기 ( 속도 ) .
    글쇠_쪽아래로   => 속도 += 10 . 전체뱀속도정하기 ( 속도 ) .
  }
  철수하나요 {
  참이면
    가상글쇠하나 값이 {
      글쇠_위로       => 뱀방향정하기 ( 철수뱀, 위   ) .
      글쇠_아래로     => 뱀방향정하기 ( 철수뱀, 아래 ) .
      글쇠_왼쪽으로   => 뱀방향정하기 ( 철수뱀, 왼   ) .
      글쇠_오른쪽으로 => 뱀방향정하기 ( 철수뱀, 오른 ) .
    }
  }
  순이하나요 {
  참이면
    가상글쇠하나 값이 {
      글쇠_받침ㄹ     => 뱀방향정하기 ( 순이뱀, 위   ) .
      글쇠_받침ㄴ     => 뱀방향정하기 ( 순이뱀, 아래 ) .
      글쇠_받침ㅇ     => 뱀방향정하기 ( 순이뱀, 왼   ) .
      글쇠_모음이     => 뱀방향정하기 ( 순이뱀, 오른 ) .
    }
  }
  가상글쇠부호얻기 ( ~기다려라 ) .
}

뱀일반.sd

// 예제 프로그램 : 뱀 경기에서 쓰이는 절차들중 독립적인 것들을 모아 놓았다.
//               : 현 기본 묶음 단원들에서 제공하지 않는 절차들을
//               : 간단하게 만들었다.
뱀일반 단원 .
사용 시간, 단말기 .
 
절차 시작점 ( ) .
 
절차 난수얻기   ( 정수 난수씨 ) => 실수 .
 
절차 초당똑딱수얻기 ( ) => 정수 .
절차 몇초간기다리기 ( 정수 천분의일초 ) .
 
상수 기다려라 = 참 .
절차 가상글쇠부호얻기     ( 부울 기다리까요 ) => 크기수 .
 
/* -------------------- */ 구현부 /* ----------------------- */
정수 초당똑딱수 .
큰정수 난수씨앗 .
상수   난수최대값 = 0#7바바바 .
 
절차 시작점 ( )
{
  난수씨앗 := 큰크기수 ( 시간얻기 ( ) ) .
 
  커서위치정하기 ( 20, 15 ) .
  글줄쓰기 ( "시스템속도를 측정하고 있습니다." ) .
  초당똑딱수 := 초당똑딱수얻기 ( ) .
}
 
절차 난수얻기 ( 정수 난수씨 ) => 실수
  실수 실수하나, 실수둘, 실수넘김 .
  정수 정수하나 .
{
  난수씨 = -1 {
    참이면   난수씨앗 := 난수씨앗 * 1103515245 + 12345 .
    거짓이면 난수씨앗 := 난수씨   * 1103515245 + 12345 .
  }
  정수하나 := 크기수(난수씨앗>>16)&난수최대값 .
  실수하나 := 정수하나 .
 
  정수하나 := 난수최대값 .
  실수둘   := 정수하나 .
 
  실수넘김 := 실수하나/실수둘 .
  확인 { 0 <= 실수넘김 그리고 실수넘김 <= 1 . }
  ( 실수하나/실수둘 ) 넘긴다.
}
 
절차 가상글쇠부호얻기 ( 부울 기다리까요 ) => 크기수
  글자입력형 글자입력 .
{
  기다리까요 {
  참이면
    글자입력얻기 ( 글자입력 ) .
    글자입력->글쇠부호&0#00바바 넘긴다.
  거짓이면
    다음입력있는가 () {
    참이면
      글자입력얻기 ( 글자입력 ) .
      글자입력->글쇠부호&0#00바바 넘긴다.
    거짓이면
      0 넘긴다 .
    }
  }
}
 
절차 초당똑딱수얻기 ( ) => 정수
  시간형 시작시간 .
  큰정수 몇번 .
  정수 그냥 .
{
  시작시간 := 시간얻기 ( ) .
  되풀이 시간차이얻기 ( 시작시간, 시간얻기() ) <= 1.0 참인 동안 {
    .
  }
  준비 몇번 := 0 . 조절 몇번 ++ .
  되풀이 시간차이얻기 ( 시작시간, 시간얻기() ) <= 2.0 참인 동안 {
    준비 그냥 := 0 . 조절 그냥 ++ .
    되풀이 그냥 < 1000 참인 동안 { . }
  }
  몇번 넘긴다.
}
 
절차 몇초간기다리기 ( 정수 천분의일초 )
  정수 번수, 몇번, 그냥 .
{
  번수 := 정수 ( 실수(초당똑딱수)*실수(천분의일초) / 1000.0 ) .
  준비 몇번 := 0 . 조절 몇번 ++ .
  되풀이 몇번 < 번수 참인 동안 {
    준비 그냥 := 0 . 조절 그냥 ++ .
    되풀이 그냥 < 1000 참인 동안 { . }
  }
}

뱀입력.sd

// 예제 프로그램 :
// 뱀 경기에서 사용자와의 대화를 위한 절차들을 정의한다.
뱀입력 단원 .
사용 뱀일반 .
사용 단말기, 단말흐름 .
 
절차 시작점 ( ) .
 
절차 소개화면보이기 ( ) .
절차 색설정하기 ( 부울 칼라화면인가 ) .
 
절차 또합니까 ( 정수 세로 ) => 부울 .
절차 말하고기다리기 ( &글자[] 말한마디, 정수 세로 ) .
절차 선택사항입력받기
(
&부울 철수하나요, &부울 순이하나요, &정수 장애물뱀수, &정수 속도,
&부울 속도증가하는가, &부울 칼라화면인가,
&정수 경기장단계
) .
절차 줄가운데출력하기 ( 정수 세로, &글자[] 말한마디 ) .
 
정수 배경색, 벽색, 뱀1색, 뱀2색, 대화글자색, 대화배경색 .
 
/* -------------------- */ 구현부 /* ----------------------- */
절차 시작점 ( )
{
  소개화면보이기 ( ) .
  색깊이얻기 ( ) 값이 {
    1    => 색설정하기 ( 거짓 ) .
    그밖 => 색설정하기 ( 참   ) .
  }
}
 
절차 소개화면보이기 ( )
{
  글자색정하기 ( 15 ) . 배경색정하기 ( 0 ) . 화면지우기 ( ) .
  글자속성정하기 ( 윤곽속성 ) .
  줄가운데출력하기 (  5, "씨앗으로 만든 뱀 뱀 뱀   ! ! ! " ) .
 
  글자속성정하기 ( 보통속성 ) .  글자색정하기 ( 7 ) .
  줄가운데출력하기 (  8, "이 오락은 뱀이 정해진 공간을 왔다 갔다 하면서 " ) .
  줄가운데출력하기 (  9, "화면에 있는 숫자를 먹는 경기이다.             " ) .
  줄가운데출력하기 ( 10, "뱀이 좌, 우, 상, 하 벽에 부딛히거나,      " ) .
  줄가운데출력하기 ( 11, "뱀머리가 자기몸에 부딪히거나,             " ) .
  줄가운데출력하기 ( 12, "뱀머리가 다른 뱀머리에 부딪히면 죽는다.   " ) .
  줄가운데출력하기 ( 15, " 사용 글쇠 " ) .
  줄가운데출력하기 ( 16, "  [ 순이  ]       [ 철수  ]    " ) .
  줄가운데출력하기 ( 17, "     W              위로       " ) .
  줄가운데출력하기 ( 18, "     S              아래로     " ) .
  줄가운데출력하기 ( 19, "     A              왼쪽으로   " ) .
  줄가운데출력하기 ( 20, "     D              오른쪽으로 " ) .
  줄가운데출력하기 ( 22, " [ Home  :잠시멈춤, End     :마치기   ] " ) .
  줄가운데출력하기 ( 23, " [ PageUp:속도증가, PageDown:속도감소 ] " ) .
  줄가운데출력하기 ( 24, "       아무 글쇠나 치세요 .    " ) .
  기다리기 ( ) .
}
 
절차 색설정하기 ( 부울 칼라화면인가 )
{
  칼라화면인가 {
  참이면   뱀1색  := 14 .  뱀2색 := 13.  벽색 := 12.
           배경색 := 1  .  대화배경색 := 15.  대화글자색 := 4 .
  거짓이면 뱀1색  := 15 .  뱀2색 := 7 .  벽색 := 7 .
           배경색 := 0  .  대화글자색 := 15.  대화배경색 := 0 .
  }
}
 
절차 또합니까 ( 정수 세로 ) => 부울
  정수 또하나요 .
{
  글자색정하기 ( 대화글자색 ) .  배경색정하기 ( 대화배경색 ) .
  줄가운데출력하기 ( 세로 , "끝났습니다.  또 할까요? (예=1, 아니오=2) :    " ) .
  되풀이 {
    커서위치정하기 ( 61, 세로 ) .  단말기->글줄쓰기 ( "    " ) .
    커서위치정하기 ( 61, 세로 ) .
    틀짜기("%십") .  정수읽기 ( 또하나요 ) .
    틀짜기("%십"). 정수쓰기(또하나요).
    또하나요=1 또는 또하나요=2 {
      참이면 나간다.
    }
  }
  글자색정하기 ( 15 ) .  배경색정하기 ( 배경색 ) .
  커서위치정하기 ( 0, 세로 ) .  줄끝까지지우기 ( ) .
  또하나요 = 1 {
  참이면   참 넘긴다.
  거짓이면 글자색정하기(7) . 배경색정하기 (0) . 화면지우기 () .
    거짓 넘긴다.
  }
}
 
절차 말하고기다리기 ( &글자[] 말한마디, 정수 세로 )
{
  글자색정하기 ( 대화글자색 ) .  배경색정하기 ( 대화배경색 ) .
  줄가운데출력하기 ( 세로, 말한마디 ) .  단말흐름->기다리기 .
  글자색정하기 ( 15 ) .  배경색정하기 ( 배경색 ) .
  커서위치정하기 ( 0, 세로 ) .  줄끝까지지우기 ( ) .
}
 
절차 선택사항입력받기
(
&부울 철수하나요, &부울 순이하나요, &정수 장애물뱀수, &정수 속도,
&부울 속도증가하는가, &부울 칼라화면인가, &정수 경기장단계
)
  정수 선택 .
{
  글자색정하기 ( 7 ) .  배경색정하기 ( 0 ) .  화면지우기 ( ) .
 
  되풀이 {
    커서위치정하기 ( 10, 6 ) . 줄끝까지지우기 ( ) .
      단말흐름->글줄쓰기
        ( "철수가 경기를 합니까 ? ( 예=1, 아니오=2 ) : ") .
      정수읽기 ( 선택 ) .
    ( 1=선택 또는 선택=2 )   {  참이면 나간다.  }
  }
  철수하나요 := (선택=1) .
 
  되풀이 {
    커서위치정하기 ( 10, 7 ) . 줄끝까지지우기 ( ) .
      단말흐름->글줄쓰기
        ( "순이가 경기를 합니까 ? ( 예=1, 아니오=2 ) : ") .
      정수읽기 ( 선택 ) .
    ( 1=선택 또는 선택=2 )   {  참이면 나간다.  }
  }
  순이하나요 := (선택=1) .
 
  되풀이 {
    커서위치정하기 ( 10, 9 ) .  줄끝까지지우기 ( ) .
    단말흐름->글줄쓰기 ( "장애물 뱀수는? ( 0-3 명) : " ) .
    단말흐름->정수읽기 ( 장애물뱀수 ) .
    (0<=장애물뱀수) 그리고 (장애물뱀수<=3) {  참이면 나간다.  }
  }
 
  되풀이 {
    커서위치정하기 ( 10, 12 ) .  줄끝까지지우기 ( ) .
    단말흐름->글줄쓰기 ( "속도를 얼마로 할까요 ? ( 1 - 100 ) : " ) .
    정수읽기 ( 속도 ) .
    ( 1<=속도 그리고 속도<100 )  {  참이면 나간다.  }
  }
 
  되풀이 {
    커서위치정하기 ( 10, 15 ) . 줄끝까지지우기 ( ) .
      단말흐름->글줄쓰기
        ( "경기도중 속도를 증가시킬까요? ( 예=1, 아니오=2 ) : ") .
      정수읽기 ( 선택 ) .
    ( 1=선택 또는 선택=2 )   {  참이면 나간다.  }
  }
  속도증가하는가 := ( 선택=1 ) .
 
  되풀이 {
    커서위치정하기 ( 10, 18 ) . 줄끝까지지우기 ( ) .
    단말흐름->글줄쓰기 ( "칼라모니터입니까 ? ( 예=1, 아니오=2 ) : " ) .
    정수읽기 ( 선택 ) .
    ( 1=선택 또는 선택=2 )   { 참이면 나간다.  }
  }
  칼라화면인가 := ( 선택=1 ) .
 
  되풀이 {
    커서위치정하기 ( 10, 21 ) .  줄끝까지지우기 ( ) .
    단말흐름->글줄쓰기 ( "경기장 단계는 얼마로 ? ( 1 - 10  ) : " ) .
    (정수읽기 ( 경기장단계 )) {
        거짓이면 단말흐름->글줄쓰기("\\줄읽지를 못했습니다.\\줄").
    }
    단말흐름->틀짜기("\\줄읽은단계는 %십입니다.\\줄").
    단말흐름->정수쓰기(경기장단계).
    ( 1<=경기장단계 그리고 경기장단계<=10 )  {  참이면 나간다.  }
  }
}
 
절차 줄가운데출력하기 ( 정수 세로, &글자[] 말한마디 )
{
  커서위치정하기 ( 41-글줄폭얻기(말한마디)/2 , 세로 ) .
  단말기->글줄쓰기 ( 말한마디 ) .
}