Vous appréhendez le logiciel comme s'il avait une pensée humaine. Ce n'est pas le cas 
Il est bête et méchant et ne fait que ce que vous lui demandez, rien de plus et rien de moins.
Sans connaître le code ou l'architecture, il est difficile de réellement conseiller, mais là, j'ai l'impression que :
- vous créez manuellement chacune des cases
- vous les placez manuellement en valeur absolu
- vous les dessinez
Une fois le dessin fait, vous "passez" sur le plateau de jeu pour savoir si, selon la couleur, la case est un mur, le départ ou l'arrivée.
Dans ma tête, il devrait y avoir un plateau constitué de X cases. Chacune de ces cases connaît son type et son emplacement et sait comment se dessiner.
Sur ce plateau existe une entité spéciale, qui est le "joueur". Lorsque celui-ci veut se déplacer, il demande au plateau "sur quelle case arriverai-je si je vais par là ?", le plateau constate la position du joueur puis regarde dans cette direction. Il interroge la case cible pour savoir si elle est praticable. Si elle l'est, le plateau déplace le joueur dessus. Ensuite, le joueur demande au plateau de vérifier si la case est une arrivée.
Pour l'affichage, à chaque déplacement (et au début), il est demandé au plateau de se redessiner. Celui-ci parcours donc chacune des cases et leur demande gentiment "peux-tu te dessiner s'il te plaît ?" pour que celle-ci s'exécute.
Pour l'initialisation, le plateau pose l'entité "joueur" sur la case spéciale "départ".
L'ordinateur ne connaît que des données. Celles-ci n'ont pour représentation graphique que ce que nous définissons en tant que développeur.
De mon point de vue, votre projet est ambitieux si vous partez sur une génération automatique de labyrinthe (parfait ou imparfait) avec système de jeu et prise en compte de dimensions multiples, voire un système de création de labyrinthe via fichiers.