이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
김진영_
가입: 2009년 12월 9일 올린 글: 337
|
올려짐: 2010년10월4일 22:26 주제: 숙제3: maze-pp를 제공해 드립니다. |
|
|
많이 테스트해 보지 못했습니다. 숙제 듀가 며칠 남지 않아 먼저 올려 드립니다. 이상한 점이 있으면 이 글에 댓글로 달아 주세요. 바로 수정하겠습니다.
maze-pp 함수는 maze 타입의 미로를 인자로 받습니다. 이 미로는 init-maze와 open 함수들을 이용해 만들어진 미로입니다.
maze-pp 함수를 실행시키면 프로그램 코드와 같은 디렉토리에 maze.ps라는 파일로 미로를 출력해 줍니다. 이 ps 형식의 파일은 맥에서는 바로 pdf로 변환해 주고, 윈도의 경우 적절한 ps-pdf변환기나 Ghostview 등을 설치하시면 pdf 형식으로 보실 수 있습니다.
주의하실 것은, maze.ps라는 파일이 이미 존재하면 에러가 납니다. 파일 이름은 maze-pp 함수 안에서 여러분들이 바꾸실 수 있으니, 적당히 바꾸어 가며 실행시켜 보시기 바랍니다.
혹시나 몰라서 말씀드립니다만, mazeGen을 작성하실 때, init-maze와 open 함수들을 호출하실 때는 여러분의 mazeGen이 책임지고 에러 처리를 해야 합니다. 정수 범위를 벗어나는 인자가 주어진다거나, 한번 연 곳을 또 연다거나 하는 동작을 하시면 곤란합니다. 제공된 경우에는 아마 무시하겠지만 실제 채점에서는 그렇지 않을 수도 있습니다.
크기는 33 by 33 정도까지면 적당히 짤리지 않고 출력될 것입니다. 채점할 때에도 이 크기를 벗어나는 데이터는 넣지 않겠습니다.
http://ropas.snu.ac.kr/~ta/4190.210/10/docs/hw/maze.scm
코드: | ; maze (example)
; Jin
(define (init-maze n m)
(define (make-list elem cnt)
(if (= cnt 0)
()
(cons elem (make-list elem (- cnt 1)))))
(cons (cons n m) (make-list (make-list (make-list #f 6) m) n)))
(define (change-list3 x y z lst elem)
(define (change-list2 x y lst elem)
(define (change-list1 x lst elem)
(if (= x 0)
(cons elem (cdr lst))
(cons (car lst) (change-list1 (- x 1) (cdr lst) elem))))
(if (= x 0)
(cons (change-list1 y (car lst) elem) (cdr lst))
(cons (car lst) (change-list2 (- x 1) y (cdr lst) elem))))
(if (= x 0)
(cons (change-list2 y z (car lst) elem) (cdr lst))
(cons (car lst) (change-list3 (- x 1) y z (cdr lst) elem))))
(define (open x y z maze)
(define n (caar maze))
(define m (cdar maze))
(define lst (cdr maze))
(if (and (<= 0 x) (< x n) (<= 0 y) (< y m) (<= 0 z) (< z 6))
(cons (cons n m) (change-list3 x y z lst #t))
maze))
(define (open-n x y maze) (open x (- y 1) 3 (open x y 0 maze)))
(define (open-s x y maze) (open x (+ y 1) 0 (open x y 3 maze)))
(define (open-ne x y maze)
(if (odd? x)
(open (+ x 1) (- y 1) 4 (open x y 1 maze))
(open (+ x 1) y 4 (open x y 1 maze))))
(define (open-nw x y maze)
(if (odd? x)
(open (- x 1) (- y 1) 2 (open x y 5 maze))
(open (- x 1) y 2 (open x y 5 maze))))
(define (open-se x y maze)
(if (odd? x)
(open (+ x 1) y 5 (open x y 2 maze))
(open (+ x 1) (+ y 1) 5 (open x y 2 maze))))
(define (all2 n m)
(define (all n)
(if (= n 0)
()
(cons (- n 1) (all (- n 1)))))
(define (product l1 l2)
(if (null? l1)
()
(append (map (lambda (x) (cons (car l1) x)) l2) (product (cdr l1) l2))))
(product (all n) (all m)))
(define (open-sw x y maze)
(if (odd? x)
(open (- x 1) y 1 (open x y 4 maze))
(open (- x 1) (+ y 1) 1 (open x y 4 maze))))
(define (maze-pp maze)
(define n (caar maze))
(define m (cdar maze))
(define lst (cdr maze))
(define file (open-output-file "maze.ps"))
(define (draw co)
(define x (car co))
(define y (cdr co))
(define elem (list-ref (list-ref lst x) y))
(define (draw-line x y x1 y1 x2 y2)
(define X (* 2.4 x))
(define Y (- (* 2.8 y) (* (modulo x 2) 1.4)))
(begin (display (+ X x1) file) (display " " file) (display (+ Y y1) file) (display " moveto " file)
(display (+ X x2) file) (display " " file) (display (+ Y y2) file) (display " lineto\n" file)))
(begin
(if (list-ref elem 0) (void) (draw-line x y 1 0 2.4 0))
(if (list-ref elem 1) (void) (draw-line x y 2.4 0 3.4 1.4))
(if (list-ref elem 2) (void) (draw-line x y 3.4 1.4 2.4 2.8))
(if (list-ref elem 3) (void) (draw-line x y 2.4 2.8 1 2.8))
(if (list-ref elem 4) (void) (draw-line x y 1 2.8 0 1.4))
(if (list-ref elem 5) (void) (draw-line x y 0 1.4 1 0))
))
(begin
(display "%!PS\n" file)
(display "%%Creator: Jin Yung Kim\n" file)
(display "[7 0 0 -7 20 700] concat\n" file)
(display "0.05 setlinewidth\n" file)
(for-each draw (all2 n m))
(display "stroke\n" file)
(close-output-port file)
(void)
))
(maze-pp (init-maze 33 33)) |
김진영_ 가 2010년10월13일 10:51에 수정함, 총 2 번 수정됨 |
|
위로 |
|
|
유재성
가입: 2010년 9월 14일 올린 글: 15
|
|
위로 |
|
|
김진영_
가입: 2009년 12월 9일 올린 글: 337
|
올려짐: 2010년10월4일 23:09 주제: |
|
|
올려 주시면 아주 좋습니다. |
|
위로 |
|
|
이승중
가입: 2010년 6월 22일 올린 글: 561
|
올려짐: 2010년10월6일 17:53 주제: |
|
|
코드: | (define file (open-output-file "maze.ps")) | 을
코드: | (define file (open-output-file "maze.ps" 'replace)) | 로 바꾸시면 ps파일 직접 지우지 않아도 덮어씌워집니다. |
|
위로 |
|
|
|