A menos que você tenha feito o trabalho muitas vezes antes, você sempre terminará com código de espaguete. Na verdade, neste ponto, você apenas começou: o que você tem é o rascunho de uma especificação preliminar. Confira alguns dos outros conselhos aqui e faça uma reescrita séria. E depois mais algumas reescritas, e então ... Pessoalmente, nunca tenho certeza se coloco meu código em ótima forma ou fico cansado de reescrevê-lo, mas pareço acertar eventualmente.
Resolver o problema de duas extremidades. Tente fazer o design geral fazer sentido e escolher peças pequenas que lidam com tarefas simples e que as acertem. Em seguida, tente trabalhar o seu caminho de ambas as extremidades para o meio. E depois trabalhe do meio para as duas extremidades. Depois, de cima para baixo e de baixo para cima. Em seguida, repita todo o processo.
Essencialmente, o que você tem é uma coleção de classes. Considere a classe A. Se a classe A for bem construída, as classes que a utilizarão funcionarão automaticamente melhor, por melhores ou más que sejam. Se a classe A usar bem as classes, essas classes usadas farão mais, por melhores ou más que sejam. Portanto, organize suas aulas da melhor maneira possível e garanta que cada uma seja a melhor classe possível.
É importante acertar o máximo possível. O código incorreto o assombrará até o dia em que você o expulsar. Com o software, um pouco de polimento extra sempre compensa. (A menos que ninguém acabe usando o código ....)
Para resumir: confira as orientações reais fornecidas nas outras respostas e reescreva seu código até obter o que deseja.