Não sei se entendi exatamente, imagino que com "corrigir o codigo" você queira dizer se é possivel dar manutenção. E isso mesmo?

Se for isso: Sempre é possível, agora se é fácil ja é outra coisa haha. Tem varias coisas ai que você pode melhorar para facilitar a manutenção do seu codigo como:

  1. Criar funções: Ler códigos de pintura é complicado por que temos que interprestar sempre o que esta sendo desenhado, separe melhor suas funções. Como por exemplo a parte que desenha a seta em uma função "DesenhaSeta", "PreencheFundo", "DesenhaPista" etc. Além das partes de desenhos, a função inicia faz 3 coisas: Cria o Layout com a div e o canvas, inicia as variaveis, desenha o preview da pista. Cada coisa poderia estar em uma função.

  2. Generalizar seus calculos: A parte que desenha a seta esta repetido 4 vezes para as 4 direções, mas o desenho é o mesmo, poderia ser apenas um trecho de codigo. Voce pode generalizar isso calculando de acordo com a direção ou apenas dando um rotate antes de desenhar e um rotate para voltar a posição após desenhar.

  3. Melhorar estruturas de dados: Eu levei algum tempo para entender que as pistas eram matrizes com as direções, não é uma abordagem ruim mas uma forma diferente que gastaria menos dados para serem guardados seria armazenar apenas as coordenadas dos quadradinhos de pista ou, ainda mais simples, guardar apenas onde tem curvas, ja que entre uma curva e outra é sempre reto. Claro que essas abordagens podem alterar consideravelmente as funções de deseno, se não quiser isso considere apenas as outras dicas.

  4. Comentários: Execeço de comentarios para mim atrapalha a leitura do codigo, mas algumas variaveis ou calculos que não são intuitivos podem ser comentados para ajudar quem vai dar manutenção.