还是那句话,经典不妨一看再看
compound这章的视频可以在edx上看,也可以点开youtube的公开课链接看
这里的总结是假设你都看过视频了( ̄<  ̄)>
我们目标是一头牛跑来跑去,而且按空格会掉头...
跑题了, 老规矩,先画domain analysis
如果只是跑来跑去,不掉头的话, 那就跟htdw那只喵是一样的,可以用simple atomic data 来表示。
但这里牛会掉头, 只是x轴的pixel坐标还不够用, 还需要一个表示表示方向的信息。
到现在为止,atomic,interval, enum和itemaization都是一对一的定义。
(enum和itemaization看起来有几种情况,但是也是one of,其实还是一对一的)
这时候, 引入了一个叫compound 的数据类型
compound 并不是一对一的,而是包括了两个或以上数据的组合
可以想成是一个盒子,里面装了两种或以上的东西
;; Data definitions:
(define-struct cow (x dx))
当racket见到(define-struct cow (x dx)), 它自动生成关于cow这个struct 的一些function:
make-cow: 创建一个cow
cow? ; 检查是否是一个cow 的struct
cow-x : 读取cow x的信息
cow-dx: 读取cow dx的信息
有了这些function, 就可以写下compound的htdd了
;; Data definitions:
(define-struct cow (x dx))
;; Cow is (make-cow Naturla[0, WIDTH], Integer)
;; interp. (make-cow x dx) is a cow with x coordinates a and velocity dx
;; the x is the center of the cow
;; x is in secreen coordinates (pixels)
;; dx is in pixels per tick
(define C1 (make-cow 10 3)) ;; at 10, moving left -> right
(define C2 (make-cow 20 -4)) ;; at 20, moving right -> left
(@dd-template-rules compound) ;2 fields
(define (fn-for-cow c)
(... (cow-x c) ;; Naturla[0, WIDTH]
(cow-dx c))) ;; Integer
完整的code,点击这里javaIsTheBest
关于compound 的 function, 可以想成一个人收到一个盒子以后,先打开,
然后根据里面的内容做一些事情(例如,创建一个新的盒子, 一个image。。。)
以next-cow 的一个check-expect为例,
(check-expect (next-cow (make-cow 20 -3)) (make-cow (- 20 3) -3))
....
(define (next-cow c)
(cond [(> (+ (cow-x c) (cow-dx c)) WIDTH)
(make-cow WIDTH (- (cow-dx c)))]
[(< (+ (cow-x c) (cow-dx c)) 0)
(make-cow 0 (- (cow-dx c)))]
[else
(make-cow (+ (cow-x c) (cow-dx c))
(cow-dx c))]))