Code viewer for World: Snake randomly crawling on...
const leftCornerX = -200;
const leftCornerY = -200;

const rectSize = 10;
const nrFields = 40;

const snakeLen = 5;
var snake = Array(snakeLen);
for(var i = 0; i < snakeLen; i++) {
    snake[i] = [i, 0];
}

function isSnakeField(x, y) {
    for(var i = 0; i < snakeLen; i++) {
        const snakeField = snake[i];
        
        if(snakeField[0] === x && snakeField[1] === y) {
            return true;
        }
    }
    
    return false;
}

function availableMoves(headX, headY) {
    var moves = [];
    
    if(headX > 0) {
        const move = [headX - 1, headY];
        if(!isSnakeField(move[0], move[1])) {
            moves.push(move);
        }
    }
    if(headX < nrFields - 1) {
        const move = [headX + 1, headY];
        if(!isSnakeField(move[0], move[1])) {
            moves.push(move);
        }
    }
    if(headY > 0) {
        const move = [headX, headY - 1];
        if(!isSnakeField(move[0], move[1])) {
            moves.push(move);
        }
    }
    if(headY < nrFields - 1) {
        const move = [headX, headY + 1];
        if(!isSnakeField(move[0], move[1])) {
            moves.push(move);
        }
    }
    
    return moves;
}

function moveSnake() {
    const snakeHead = snake[snakeLen - 1];
    const headX = snakeHead[0];
    const headY = snakeHead[1];
    const moves = availableMoves(headX, headY);
    const selected = moves[Math.floor(Math.random() * moves.length)];

    snake[snakeLen - 1] = selected;
    
    var nextX = headX;
    var nextY = headY;
    for(var i = snakeLen - 2; i >= 0; i--) {
        var movedField = [nextX, nextY];
        nextX = snake[i][0];
        nextY = snake[i][1];
        snake[i] = movedField;
    }
}

function setup()        // "setup" is called once at start of run 
{
  createCanvas ( ABWorld.fullwidth(), ABWorld.fullheight(),  WEBGL );
}

function draw()         // "draw" is called every timestep during run 
{
    background("lightblue");
    
    for(var i = 0; i < nrFields; i++) {
        for(var j = 0; j < nrFields; j++) {
            var color = isSnakeField(i, j) ? "black" : "white";
            fill(color);
            rect(leftCornerX + rectSize * i, leftCornerY + rectSize * j, rectSize, rectSize);
        }
    }
    
    moveSnake();
}