La colisión funciona de manera inconsistente, tratando de que funcione siempre. El siguiente código hace referencia a la colisión de colores que se usa para verificar si la serpiente se está golpeando a sí misma. También hay otras funciones en uso, pero creo que aquí es donde está ocurriendo el problema.
function snakeCollide() { checkColour = ctx.getImageData(rx, ry, 1, 1).data; if (rdx > 0) { checkColour = ctx.getImageData(rx + rw + 1, ry + rh / 2, 1, 1).data; } else if (rdx < 0) { checkColour = ctx.getImageData(rx - 1, ry + rh / 2, 1, 1).data; } else if (rdy > 0) { checkColour = ctx.getImageData(rx + rw / 2, ry + rh + 1, 1, 1).data; } else if (rdy < 0) { checkColour = ctx.getImageData(rx + rw / 2, ry - 1, 1, 1).data; } else { console.log("TEST") } }