지금까지의 글들에서 씨앗의 코드 조각들을 많이 보았기 때문이 여기에서는 씨앗으로 된 완전한 응용 프로그램 하나를 소개한다.
이 예제는 씨앗으로 만들어진 '뱀놀이'로, 2인용 게임이 가능하다. 모두 다섯 개의 단원으로 되어 있다.
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 . 전체뱀속도정하기 ( 속도 ) .
}
철수하나요 {
참이면
가상글쇠하나 값이 {
글쇠_위로 => 뱀방향정하기 ( 철수뱀, 위 ) .
글쇠_아래로 => 뱀방향정하기 ( 철수뱀, 아래 ) .
글쇠_왼쪽으로 => 뱀방향정하기 ( 철수뱀, 왼 ) .
글쇠_오른쪽으로 => 뱀방향정하기 ( 철수뱀, 오른 ) .
}
}
순이하나요 {
참이면
가상글쇠하나 값이 {
글쇠_받침ㄹ => 뱀방향정하기 ( 순이뱀, 위 ) .
글쇠_받침ㄴ => 뱀방향정하기 ( 순이뱀, 아래 ) .
글쇠_받침ㅇ => 뱀방향정하기 ( 순이뱀, 왼 ) .
글쇠_모음이 => 뱀방향정하기 ( 순이뱀, 오른 ) .
}
}
가상글쇠부호얻기 ( ~기다려라 ) .
}
// 예제 프로그램 : 뱀 경기에서 쓰이는 절차들중 독립적인 것들을 모아 놓았다.
// : 현 기본 묶음 단원들에서 제공하지 않는 절차들을
// : 간단하게 만들었다.
뱀일반 단원 .
사용 시간, 단말기 .
절차 시작점 ( ) .
절차 난수얻기 ( 정수 난수씨 ) => 실수 .
절차 초당똑딱수얻기 ( ) => 정수 .
절차 몇초간기다리기 ( 정수 천분의일초 ) .
상수 기다려라 = 참 .
절차 가상글쇠부호얻기 ( 부울 기다리까요 ) => 크기수 .
/* -------------------- */ 구현부 /* ----------------------- */
정수 초당똑딱수 .
큰정수 난수씨앗 .
상수 난수최대값 = 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 참인 동안 { . }
}
}
// 예제 프로그램 :
// 뱀 경기에서 사용자와의 대화를 위한 절차들을 정의한다.
뱀입력 단원 .
사용 뱀일반 .
사용 단말기, 단말흐름 .
절차 시작점 ( ) .
절차 소개화면보이기 ( ) .
절차 색설정하기 ( 부울 칼라화면인가 ) .
절차 또합니까 ( 정수 세로 ) => 부울 .
절차 말하고기다리기 ( &글자[] 말한마디, 정수 세로 ) .
절차 선택사항입력받기
(
&부울 철수하나요, &부울 순이하나요, &정수 장애물뱀수, &정수 속도,
&부울 속도증가하는가, &부울 칼라화면인가,
&정수 경기장단계
) .
절차 줄가운데출력하기 ( 정수 세로, &글자[] 말한마디 ) .
정수 배경색, 벽색, 뱀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 , 세로 ) .
단말기->글줄쓰기 ( 말한마디 ) .
}