都市全体図を作るところまで読みました。
全体図見ながらにやにやしましたよw
ツチボタルという名前だったかな?(漢字は忘れましたw)の配置はランダムなので同じノードになってしまう事がよくあります。
nodes-with-glow-worm 関数のようなものを用意してみました。
(defun nodes-with-glow-worm () (let ((nodes (loop for i below *worm-num* collect (random-node)))) (if (< (length (remove-duplicates nodes :test #'equal)) *worm-num*) (nodes-with-glow-worm) nodes)))
ノードが被っていた場合は位置決めをやり直します。
ランダムで永遠にノードの箇所が被り続ける事はまず無いと思われるので、
こんな感じで良いでしょう。
ツチボタルが極端に多い場合やノードの数が極端に少ない場合は位置決めに時間がかかるかも知れませんw
呼び出し側の make-city-nodes では、glow-worms の設定に nodes-with-glow-worm 関数を使います。
(defun make-city-nodes (edge-alist) (let ((wumpus (random-node)) (glow-worms (nodes-with-glow-worm))) (loop for n from 1 to *node-num* collect (append (list n) (cond ((eql n wumpus) '(wumpus)) ((within-two n wumpus edge-alist) '(blood!))) (cond ((member n glow-worms) '(glow-worm)) ((some (lambda (worm) (within-one n worm edge-alist)) glow-worms) '(lights!))) (when (some #'cdr (cdr (assoc n edge-alist))) '(sirens!))))))
これでツチボタルは、*worm-num* 匹がどこかの別々のノードに必ず配置されるようになります。