Mercurial > repos > icfp2012
comparison src/sim.tp @ 47:ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
author | William Morgan <bill@mrgn.org> |
---|---|
date | Sun, 15 Jul 2012 18:16:50 -0700 |
parents | 1f583d85c8ed |
children | 365c83ea7658 |
comparison
equal
deleted
inserted
replaced
43:1f583d85c8ed | 47:ccaecf1d6425 |
---|---|
115 | 115 |
116 cellTypes <- makeCellTypes: | 116 cellTypes <- makeCellTypes: |
117 | 117 |
118 state <- #{ | 118 state <- #{ |
119 new <- :in_grid in_width in_height { | 119 new <- :in_grid in_width in_height { |
120 nextGrid <- #[] | 120 _nextGrid <- #[] |
121 _robot <- null | 121 _robot <- null |
122 endreached <- false | 122 _ended <- false |
123 _lambdaCount <- 0 | 123 _lambdaCount <- 0 |
124 _succeeded <- false | 124 _succeeded <- false |
125 ret <- #{ | 125 ret <- #{ |
126 grid <- in_grid | 126 grid <- in_grid |
127 width <- in_width | 127 width <- in_width |
128 height <- in_height | 128 height <- in_height |
129 calcIndex <- :x y { x + y * width } | 129 calcIndex <- :x y { x + y * width } |
130 calcX <- :index {index % width} | 130 calcX <- :index {index % width} |
131 calcY <- :index {index / width} | 131 calcY <- :index {index / width} |
132 getCell <- :x y { | |
133 grid get: (calcIndex: x y) | |
134 } | |
132 setCell <- :x y val { | 135 setCell <- :x y val { |
133 grid set: (calcIndex: x y) val | 136 grid set: (calcIndex: x y) val |
134 } | 137 } |
135 getCell <- :x y { | 138 setNextCell <- :x y val { |
136 grid get: (calcIndex: x y) | 139 _nextGrid set: (calcIndex: x y) val |
137 } | 140 } |
138 validDest?:from <- :index :fromIndex { | 141 validDest?:from <- :index :fromIndex { |
139 cell <- (grid get: index) | 142 cell <- (grid get: index) |
140 if: (cell navigable) {true} else: { | 143 if: (cell navigable) {true} else: { |
141 if: (cell eq: (cellTypes rock)) { | 144 if: (cell eq: (cellTypes rock)) { |
142 diff <- index - fromIndex | 145 diff <- index - fromIndex |
183 lambdaCount <- {_lambdaCount} | 186 lambdaCount <- {_lambdaCount} |
184 water <- 0 | 187 water <- 0 |
185 flooding <- 0 | 188 flooding <- 0 |
186 waterproof <- 10 | 189 waterproof <- 10 |
187 moves <- 0 | 190 moves <- 0 |
188 ended <- {endreached} | 191 ended <- {_ended} |
189 succeeded <- {_succeeded} | 192 succeeded <- {_succeeded} |
190 succeeded! <- :newval { | 193 succeeded! <- :newval { |
191 endreached <- newval | 194 _ended <- newval |
192 _succeeded <- newval | 195 _succeeded <- newval |
193 } | 196 } |
194 doUpdate <- { | 197 doUpdate <- { |
195 foreach: grid :index value { | 198 foreach: grid :index value { |
199 nextValue <- value | |
196 if: (value eq: (cellTypes rock)) { | 200 if: (value eq: (cellTypes rock)) { |
197 x <- calcX: index | 201 x <- calcX: index |
198 y <- calcY: index | 202 y <- calcY: index |
199 below <- getCell: x (y - 1) | 203 below <- getCell: x (y - 1) |
200 fallToSide <- :delta { | 204 fallToSide <- :delta { |
201 side <- getCell: (x + delta) y | 205 side <- getCell: (x + delta) y |
202 belowSide <- getCell: (x + delta) (y - 1) | 206 belowSide <- getCell: (x + delta) (y - 1) |
203 if: (side eq: (cellTypes empty)) { | 207 if: (side eq: (cellTypes empty)) { |
204 if: (belowSide eq: (cellTypes empty)) { | 208 if: (belowSide eq: (cellTypes empty)) { |
205 setCell: (x + delta) (y - 1) value | 209 setNextCell: (x + delta) (y - 1) value |
206 setCell: x y (cellTypes empty) | 210 nextValue <- (cellTypes empty) |
207 true | 211 true |
208 } else: { false } | 212 } else: { false } |
209 } else: { false } | 213 } else: { false } |
210 } | 214 } |
211 if: (below eq: (cellTypes empty)) { | 215 if: (below eq: (cellTypes empty)) { |
212 setCell: x y (cellTypes empty) | 216 nextValue <- (cellTypes empty) |
213 setCell: x (y - 1) value | 217 setNextCell: x (y - 1) value |
214 } else: { if: (below eq: (cellTypes rock)) { | 218 } else: { if: (below eq: (cellTypes rock)) { |
215 if: (not: (fallToSide: 1)) {fallToSide: -1} | 219 if: (not: (fallToSide: 1)) {fallToSide: -1} |
216 } else: { if: (below eq: (cellTypes lambda)) { | 220 } else: { if: (below eq: (cellTypes lambda)) { |
217 fallToSide: 1 | 221 fallToSide: 1 |
218 }}} // end if | 222 }}} // end if |
219 } else: { | 223 } else: { |
220 if: (value eq: (cellTypes closedLift)) { | 224 if: (value eq: (cellTypes closedLift)) { |
221 if: (_robot collected) = _lambdaCount { | 225 if: (_robot collected) = _lambdaCount { |
222 grid set: index (cellTypes openLift) | 226 nextValue <- (cellTypes openLift) |
223 } | 227 } |
224 } | 228 } |
225 } | 229 } |
226 } | 230 _nextGrid set: index nextValue |
231 } | |
232 swapGrids <- { | |
233 tmp <- grid | |
234 grid <- _nextGrid | |
235 _nextGrid <- tmp | |
236 } | |
237 swapGrids: | |
227 } | 238 } |
228 advance <- :roboCmd { | 239 advance <- :roboCmd { |
229 endreached <- roboCmd = "A" | 240 _ended <- roboCmd = "A" |
230 if: (not: endreached) { | 241 if: (not: _ended) { |
231 _robot doCmd: roboCmd | 242 _robot doCmd: roboCmd |
232 moves <- moves + 1 | 243 moves <- moves + 1 |
233 doUpdate: | 244 doUpdate: |
234 } | 245 } |
235 self | 246 self |
264 myclone moves!: moves | 275 myclone moves!: moves |
265 myclone | 276 myclone |
266 } | 277 } |
267 } | 278 } |
268 foreach: in_grid :index el{ | 279 foreach: in_grid :index el{ |
269 nextGrid append: el | 280 _nextGrid append: el |
270 if: (el isrobot) { | 281 if: (el isrobot) { |
271 _robot <- el | 282 _robot <- el |
272 _robot mine!: ret | 283 _robot mine!: ret |
273 ret updatePos: _robot index | 284 ret updatePos: _robot index |
274 } else: { | 285 } else: { |