1

这是在 CLojure 中,首先是我的代码:

;cell structure
(defstruct cell :x :y :highland :lowland :obstacle :ammo :tank)

;demension
(def dim 0)

(defn setdim [num]
  (def dim num))

;create world
(defn creatworld []
  (apply vector
         (map (fn [_]
                (apply vector (map (fn [_] (struct cell))
                                   (range dim))))
              (range dim)))) 

;initiate coordinate for structure in vector of vector
;this is not working
(defn inicoor [world]
  (map
   #(assoc % :x i :y j)
   world))

(defn inicoor [world]
  (dorun (for [i (range 0 dim)]
           (dorun (for [j (range 0 dim)] 
                    (map  
                    # (assoc (nth (nth world i) j) :x i :y j)))))))

所以,我正在做的是尝试使用二维结构向量创建一个二维世界。创建世界后,我希望启动 xy 坐标作为实际坐标,就像我在最后一个函数中尝试的那样。但是,由于 clojure 是可变的不可变的,它不会改变值......而且它也不会返回新数据的 2d 向量......然后我尝试使用 map ......但我对 clojure 真的很陌生。 ..几次尝试后没有工作...

谁能告诉我该怎么做?非常感谢...

add:目标结构是这样的:

[  00 10 20 30 40 50   ]  (this is the first vector)
   01 11 21 31 41 51
   02 12 22 32 42 52
   03 13 23 33 43 53
   04 14 24 34 44 54
   05 15 25 35 45 55

这就是我一开始使用嵌套循环的原因......在java中最常见的方法......

4

1 回答 1

3

使用法线贴图,您可以说:

(for [y (range 8) x (range 8)] {:x x :y y})

在一个大列表中获取具有坐标的单元格

更新它们(假设你有一个 fn update-cell [cell]:

 (map update-cell cells)

或者如果您有一些数据可以更新它们:

(map update-cell cells (repeat data))
  • 该数据可能是 {:t the-time :dt ms-since-;last-update :etc other-stuff}

如果您希望它们在 2d 网格中,那么您可以这样做:

(partition  8 (for [y (range 8) x (range 8)] {:x x :y y}))

或者,假设您有一个(defn make-cell [x y] {:x x :y y}),您可以制作它们:

(map (fn [y] (map (fn [x] (make-cell x y)) (range width))) (range height))

然后更新它们:

(map (partial map update-cell) cells)
于 2013-08-01T04:10:24.367 回答