comparison src/sim.tp @ 55:b2e9e5ad3ad8

fixed array out of bounds errors. Test maps to proove it.
author William Morgan <bill@mrgn.org>
date Sun, 15 Jul 2012 22:06:19 -0700
parents 186fce0c98ee
children ca86c88c2336
comparison
equal deleted inserted replaced
51:186fce0c98ee 55:b2e9e5ad3ad8
127 state <- #{ 127 state <- #{
128 new <- :in_grid in_width in_height { 128 new <- :in_grid in_width in_height {
129 _nextGrid <- #[] 129 _nextGrid <- #[]
130 _robot <- null 130 _robot <- null
131 _ended <- false 131 _ended <- false
132 132 getSafe <- :collection :index {
133 if: index >= 0 {
134 if: index < (collection length) {
135 collection get: index
136 } else: { (cellTypes wall) }
137 } else: { (cellTypes wall) }
138 }
133 _succeeded <- false 139 _succeeded <- false
134 ret <- #{ 140 ret <- #{
135 grid <- in_grid 141 grid <- in_grid
136 width <- in_width 142 width <- in_width
137 height <- in_height 143 height <- in_height
138 calcIndex <- :x y { x + y * width } 144 calcIndex <- :x y { x + y * width }
139 calcX <- :index {index % width} 145 calcX <- :index {index % width}
140 calcY <- :index {index / width} 146 calcY <- :index {index / width}
141 getCell <- :x y { 147 getCell <- :x y {
142 grid get: (calcIndex: x y) 148 grid getSafe: (calcIndex: x y)
143 } 149 }
144 setCell <- :x y val { 150 setCell <- :x y val {
145 grid set: (calcIndex: x y) val 151 grid set: (calcIndex: x y) val
146 } 152 }
147 getNextCell <- :x y { 153 getNextCell <- :x y {
148 _nextGrid get: (calcIndex: x y) 154 _nextGrid getSafe: (calcIndex: x y)
149 } 155 }
150 setNextCell <- :x y val { 156 setNextCell <- :x y val {
151 _nextGrid set: (calcIndex: x y) val 157 _nextGrid set: (calcIndex: x y) val
152 } 158 }
153 validDest?:from <- :index :fromIndex { 159 validDest?:from <- :index :fromIndex {
154 cell <- (grid get: index) 160 cell <- (grid getSafe: index)
155 if: (cell navigable) {true} else: { 161 if: (cell navigable) {true} else: {
156 if: (cell eq: (cellTypes rock)) { 162 if: (cell eq: (cellTypes rock)) {
157 diff <- index - fromIndex 163 diff <- index - fromIndex
158 //make sure movement was horizontal 164 //make sure movement was horizontal
159 if: (abs: diff) = 1 { 165 if: (abs: diff) = 1 {
160 rockdest <- index + diff 166 rockdest <- index + diff
161 if: ((grid get: rockdest) eq: (cellTypes empty)) { 167 if: ((grid getSafe: rockdest) eq: (cellTypes empty)) {
162 //make sure rock destination doesn't wrap 168 //make sure rock destination doesn't wrap
163 (calcY: rockdest) = (calcY: index) 169 (calcY: rockdest) = (calcY: index)
164 } 170 }
165 } 171 }
166 } 172 }
279 } 285 }
280 printGrid <- { 286 printGrid <- {
281 cur <- (grid length) - width 287 cur <- (grid length) - width
282 col <- 0 288 col <- 0
283 while: {cur >= 0} do: { 289 while: {cur >= 0} do: {
284 os write: 2 ((grid get: cur) string) 290 os write: 2 ((grid getSafe: cur) string)
285 cur <- cur + 1 291 cur <- cur + 1
286 col <- col + 1 292 col <- col + 1
287 if: col = width { 293 if: col = width {
288 col <- 0 294 col <- 0
289 cur <- cur - (width + width) 295 cur <- cur - (width + width)