next up previous
Next: 14 オブジェクト指向機能の実現 Up: 13 オブジェクト指向プログラミングの例 Previous: 13.4 シミュレーションの例(1)

13.5 シミュレーションの例(2)

前節のシミュレーションを衝突チェックまでいれた 形で拡張した例を示す. 各時間単位の繰り返しごとに,衝突しているかどうかを確かめる部分が追加さ れたものが create-universe2 である.

(defun create-universe2 (&optional (cnt 5))
  (let
      ((p1 (make-something particle '(p1 4 3 2 5)))
       (p2 (make-something particle '(p2 0 0 0 1)))
       (p3 (make-something particle '(p3 1 1 9 4)))
       (r1 (make-something rocket '(r1 2 3 4 3)))
       (r2 (make-something rocket '(r2 7 5 2 1)))
       (r3 (make-something rocket '(r3 3 4 4 2))))
    (send r1 'set-motor '(2 1))
    (send r2 'set-motor '(7 6))
    (send r3 'set-motor '(2 3))
    (dotimes
     (i cnt)
     (format t "~%~%cnt=~s" i)
     (dolist
      (obj (list p1 p2 p3 r1 r2 r3))
      (send obj 'status)
      (cond ((send obj 'crashed?)
             (format t " -> ~a has crashed"
                       (send obj 'pname)))
            (t (send obj 'new-position)
               (send obj 'new-velocity)))))))
crashしたかどうかの判定は,すべてのパーティクル,ロケットに同じ メソッド crashed? を送ることで行なっています. crashed?のメソッドは,particleに定義されています.
(defmethod particle
  (crashed? ()
            (and (> (send self 'y-position)
                    *initial-height*)
                 (not (< (send self 'x-position) 0))
                 (< (send self 'x-position)
                    *asteroid-width*)))
  )
という具合に個別に定義してもかまいません. 実行結果は以下のようになります.

<cl> (create-universe2)
cnt=0
P1's Pos:(4 3) Vel:(2 5) Acc:(0 4)
P2's Pos:(0 0) Vel:(0 1) Acc:(0 4)
P3's Pos:(1 1) Vel:(9 4) Acc:(0 4)
R1's Pos:(2 3) Vel:(4 3) Acc:(2 5) Motor:(2 1)
R2's Pos:(7 5) Vel:(2 1) Acc:(7 10) Motor:(7 6)
R3's Pos:(3 4) Vel:(4 2) Acc:(2 7) Motor:(2 3)
cnt=1
P1's Pos:(6 8) Vel:(2 9) Acc:(0 4)
P2's Pos:(0 1) Vel:(0 5) Acc:(0 4)
P3's Pos:(10 5) Vel:(9 8) Acc:(0 4)
R1's Pos:(6 6) Vel:(6 8) Acc:(2 5) Motor:(2 1)
R2's Pos:(9 6) Vel:(9 11) Acc:(7 10) Motor:(7 6)
R3's Pos:(7 6) Vel:(6 9) Acc:(2 7) Motor:(2 3)
cnt=2
P1's Pos:(8 17) Vel:(2 13) Acc:(0 4)
P2's Pos:(0 6) Vel:(0 9) Acc:(0 4)
P3's Pos:(19 13) Vel:(9 12) Acc:(0 4)
R1's Pos:(12 14) Vel:(8 13) Acc:(2 5) Motor:(2 1)
R2's Pos:(18 17) Vel:(16 21) Acc:(7 10) Motor:(7 6)
R3's Pos:(13 15) Vel:(8 16) Acc:(2 7) Motor:(2 3)
cnt=3
P1's Pos:(10 30) Vel:(2 17) Acc:(0 4)
      -> P1 has crashed
P2's Pos:(0 15) Vel:(0 13) Acc:(0 4)
P3's Pos:(28 25) Vel:(9 16) Acc:(0 4)
R1's Pos:(20 27) Vel:(10 18) Acc:(2 5) Motor:(2 1)
      -> R1 has crashed
R2's Pos:(34 38) Vel:(23 31) Acc:(7 10) Motor:(7 6)
R3's Pos:(21 31) Vel:(10 23) Acc:(2 7) Motor:(2 3)
      -> R3 has crashed
NIL


generated through LaTeX2HTML. M.Inaba 平成18年5月7日