1
1
let tiles = [ ] ;
2
2
const tileImages = [ ] ;
3
-
4
3
let grid = [ ] ;
5
4
6
5
const DIM = 25 ;
@@ -20,7 +19,7 @@ function preload() {
20
19
function removeDuplicatedTiles ( tiles ) {
21
20
const uniqueTilesMap = { } ;
22
21
for ( const tile of tiles ) {
23
- const key = tile . edges . join ( ',' ) ; // ex: " ABB,BCB,BBA,AAA"
22
+ const key = tile . edges . join ( ',' ) ; // ex: ' ABB,BCB,BBA,AAA'
24
23
uniqueTilesMap [ key ] = tile ;
25
24
}
26
25
return Object . values ( uniqueTilesMap ) ;
@@ -80,7 +79,7 @@ function setup() {
80
79
function startOver ( ) {
81
80
// Create cell for each spot on the grid
82
81
for ( let i = 0 ; i < DIM * DIM ; i ++ ) {
83
- grid [ i ] = new Cell ( tiles . length ) ;
82
+ grid [ i ] = new Cell ( i % DIM , floor ( i / DIM ) , tiles . length ) ;
84
83
}
85
84
}
86
85
@@ -92,7 +91,7 @@ function checkValid(arr, valid) {
92
91
// result in removing UP, DOWN, LEFT
93
92
let element = arr [ i ] ;
94
93
// console.log(element, valid.includes(element));
95
- if ( ! valid . includes ( element ) ) {
94
+ if ( ! valid . has ( element ) ) {
96
95
arr . splice ( i , 1 ) ;
97
96
}
98
97
}
@@ -111,15 +110,7 @@ function draw() {
111
110
const h = height / DIM ;
112
111
for ( let j = 0 ; j < DIM ; j ++ ) {
113
112
for ( let i = 0 ; i < DIM ; i ++ ) {
114
- let cell = grid [ i + j * DIM ] ;
115
- if ( cell . collapsed ) {
116
- let index = cell . options [ 0 ] ;
117
- image ( tiles [ index ] . img , i * w , j * h , w , h ) ;
118
- } else {
119
- noFill ( ) ;
120
- stroke ( 51 ) ;
121
- rect ( i * w , j * h , w , h ) ;
122
- }
113
+ grid [ posIdx ( i , j ) ] . draw ( w , h ) ;
123
114
}
124
115
}
125
116
@@ -155,60 +146,50 @@ function draw() {
155
146
}
156
147
cell . options = [ pick ] ;
157
148
158
- const nextGrid = [ ] ;
159
- for ( let j = 0 ; j < DIM ; j ++ ) {
160
- for ( let i = 0 ; i < DIM ; i ++ ) {
161
- let index = i + j * DIM ;
162
- if ( grid [ index ] . collapsed ) {
163
- nextGrid [ index ] = grid [ index ] ;
164
- } else {
165
- let options = new Array ( tiles . length ) . fill ( 0 ) . map ( ( x , i ) => i ) ;
166
- // Look up
167
- if ( j > 0 ) {
168
- let up = grid [ i + ( j - 1 ) * DIM ] ;
169
- let validOptions = [ ] ;
170
- for ( let option of up . options ) {
171
- let valid = tiles [ option ] . down ;
172
- validOptions = validOptions . concat ( valid ) ;
173
- }
174
- checkValid ( options , validOptions ) ;
175
- }
176
- // Look right
177
- if ( i < DIM - 1 ) {
178
- let right = grid [ i + 1 + j * DIM ] ;
179
- let validOptions = [ ] ;
180
- for ( let option of right . options ) {
181
- let valid = tiles [ option ] . left ;
182
- validOptions = validOptions . concat ( valid ) ;
183
- }
184
- checkValid ( options , validOptions ) ;
185
- }
186
- // Look down
187
- if ( j < DIM - 1 ) {
188
- let down = grid [ i + ( j + 1 ) * DIM ] ;
189
- let validOptions = [ ] ;
190
- for ( let option of down . options ) {
191
- let valid = tiles [ option ] . up ;
192
- validOptions = validOptions . concat ( valid ) ;
193
- }
194
- checkValid ( options , validOptions ) ;
195
- }
196
- // Look left
197
- if ( i > 0 ) {
198
- let left = grid [ i - 1 + j * DIM ] ;
199
- let validOptions = [ ] ;
200
- for ( let option of left . options ) {
201
- let valid = tiles [ option ] . right ;
202
- validOptions = validOptions . concat ( valid ) ;
203
- }
204
- checkValid ( options , validOptions ) ;
205
- }
149
+ grid = optimizedNextGrid ( cell ) ;
150
+ }
151
+
152
+ // propagate options from src to dest. If dest is above src, dir == UP.
153
+ function propagate ( src , dest , dir ) {
154
+ let oldLen = dest . options . length ;
155
+ checkValid ( dest . options , src . validOptions ( dir ) ) ;
156
+ return oldLen != dest . options . length ;
157
+ }
206
158
207
- // I could immediately collapse if only one option left?
208
- nextGrid [ index ] = new Cell ( options ) ;
159
+ function optimizedNextGrid ( pick ) {
160
+ let touched = [ posIdx ( pick . i , pick . j ) ] ;
161
+
162
+ while ( touched . length > 0 ) {
163
+ let cell = grid [ touched . pop ( ) ] ;
164
+
165
+ let check = function ( i , j , dir ) {
166
+ const idx = posIdx ( i , j ) ;
167
+ if ( propagate ( cell , grid [ idx ] , dir ) ) {
168
+ if ( ! touched . includes ( idx ) ) {
169
+ touched . push ( idx ) ;
170
+ }
209
171
}
172
+ } ;
173
+
174
+ if ( cell . i > 0 ) {
175
+ check ( cell . i - 1 , cell . j , LEFT ) ;
176
+ }
177
+
178
+ if ( cell . i < DIM - 1 ) {
179
+ check ( cell . i + 1 , cell . j , RIGHT ) ;
180
+ }
181
+
182
+ if ( cell . j > 0 ) {
183
+ check ( cell . i , cell . j - 1 , UP ) ;
184
+ }
185
+
186
+ if ( cell . j < DIM - 1 ) {
187
+ check ( cell . i , cell . j + 1 , DOWN ) ;
210
188
}
211
189
}
190
+ return grid ;
191
+ }
212
192
213
- grid = nextGrid ;
193
+ function posIdx ( i , j ) {
194
+ return i + j * DIM ;
214
195
}
0 commit comments