Array Based Collision Cells
((
d = document,
b = d.body,
canvas = b.appendChild(
d.createElement('canvas')
),
c = canvas.getContext('2d'),
r = _ => Math.random(),
map = [
[0, 0, 0, 0, 0, 2],
[1, 1, 0, 0, 0, 1],
[1, 1, 2, 0, 0, 0],
[2, 2, 0, 0, 0, 1],
[0, 1, 0, 0, 2, 0],
[2, 0, 0, 0, 2, 1],
],
mapW = map[0].length,
mapH = map.length,
cols = [, 'red', 'black'],
cell = (
x, y, idx,
col = cols[idx],
size = 30,
xp = x * size,
yp = y * size,
dir,
mv = f => {
map[y][x] = 0
f()
map[y][x] = idx
}
) => (move) => {
if (move) {
dir = ~~(r() * 4)
if (dir == 0 &&
x != 0 &&
map[y][x - 1] == 0) {
mv(_ => x--)
} else if (dir == 1 &&
x != mapW - 1 &&
map[y][x + 1] == 0) {
mv(_ => x++)
} else if (dir == 2 &&
y != 0 &&
map[y - 1][x] == 0) {
mv(_ => y--)
} else if (dir == 3 &&
y != mapH - 1 &&
map[y + 1][x] == 0
) {
mv(_ => y++)
}
}
xp += (x * size - xp) / 4
yp += (y * size - yp) / 4
c.fillStyle = col
c.fillRect(xp, yp, size, size)
c.strokeStyle = 'gray'
c.strokeRect(xp, yp, size, size)
},
cells = [],
w, h, idx, val, i, j,
draw = () => {
c.fillStyle = 'gray'
c.fillRect(0, 0, w, h)
idx = ~~(r() * mapH * mapW)
cells.forEach((cell, i) =>
cell(idx == i && r() < .3))
}
) => {
b.style.margin = 0
onresize = () => {
w = canvas.width = innerWidth
h = canvas.height = innerHeight
draw()
}
onresize()
for (i = 0; i < mapH; i++) {
for (j = 0; j < mapW; j++) {
val = map[i][j]
if (val != 0) cells.push(cell(j, i, val))
}
}
setInterval(draw, 16)
})()
Array based avoid. I was about to port an old thing that was similar to this and then thought it would be more fun to speedcode it instead. The result is a slightly golfed version of this old thing.