Как обновить значение структуры в 2D-векторе? Clojure
Это в 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 является неизменяемой переменной, она не будет изменять значение... И также не будет возвращать двумерный вектор новых данных... Затем я попытался использовать карту... но я действительно новичок в clojure... не работал после нескольких попыток...
Может кто-нибудь сказать мне, как это сделать? Большое спасибо...
добавить: структура цели выглядит следующим образом:
[ 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...
1 ответ
С картами нормалей можно сказать:
(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}
Если вы хотите их в 2-мерной сетке, то вы можете сделать:
(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)