﻿##################

def dessinerTableau(tab):
    """
    permet de dessiner le labyrinthe passe en parametre
    - les cases avec un 1 sont des murs => '#'
    - les cases avec un 0 sont des espaces vides => ' '
    """

    for j in range(0,len(tab[0])):
        for i in range(0,len(tab)):
            if (tab[i][j]==1):
                print('#', end=' ')
            else:
                print(' ', end=' ')
        print()

###################

def transpose(laby):
    """
    permet d'inverser lignes et colonnes d'un labyrinthe
    (utile pour la creation simple)
    """
    # nouveau laby
    laby2=[]
    for i in range(0,len(laby[0])):
        ligne=[]
        for j in range(0,len(laby)):
            ligne+=[0]
        laby2+=[ligne]

    # transposition
    for i in range(0,len(laby[0])):
        for j in range(0,len(laby)):
            laby2[i][j]=laby[j][i]

    return laby2


###################

def getLabyrintheDefaut():
    """
    construit et retourne un labyrinthe par defaut a parcourir
    (de taille 8x8)
    """

    # labyrinthe vide
    laby = []
    laby +=[[1,1,1,1,1,1,1,1]]
    laby +=[[1,0,0,1,0,0,0,1]]
    laby +=[[1,0,0,1,0,1,0,1]]
    laby +=[[1,0,1,1,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,1]]
    laby +=[[1,1,0,1,1,0,1,1]]
    laby +=[[1,0,0,0,0,0,0,1]]
    laby +=[[1,1,1,1,1,1,1,1]]

    # nouveau laby
    return transpose(laby)


###################

def getLabyrintheMoyen():
    """
    construit et retourne un labyrinthe par defaut
    (de taille 10x10)
    """
    laby = []
    laby +=[[1,1,1,1,1,1,1,1,1,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,1,0,1,1,0,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,0,1,0,0,1,0,1,0,1]]
    laby +=[[1,0,1,0,1,1,0,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,0,1,1,0,1,1,0,1,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,1,1,1,1,1,1,1,1,1]]

    # nouveau laby
    return transpose(laby)

###################

def getLabyrintheGrand():
    """
    construit et retourne un labyrinthe par defaut a parcourir
    (de taille 15x15)
    """
    laby = []
    laby +=[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,0,1,0,0,0,1]]
    laby +=[[1,0,1,1,1,1,1,0,1,0,1,0,1,1,1]]
    laby +=[[1,0,0,1,0,1,0,0,1,0,1,0,0,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,1,0,0,0,1,0,1]]
    laby +=[[1,1,0,1,1,0,1,0,1,1,0,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,1,0,0,0,0,1,0,0,1]]
    laby +=[[1,0,1,1,1,1,1,1,1,1,1,1,1,0,1]]
    laby +=[[1,0,1,0,0,1,0,0,0,0,0,0,1,0,1]]
    laby +=[[1,0,1,0,0,0,0,1,1,1,1,0,1,0,1]]
    laby +=[[1,0,1,0,0,1,0,1,0,0,0,0,1,0,1]]
    laby +=[[1,0,1,0,0,1,0,1,0,0,0,0,1,0,1]]
    laby +=[[1,0,1,1,0,1,1,1,1,1,1,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]

    # nouveau laby
    return transpose(laby)

###################

def getLabyrintheTresGrand():
    """
    construit et retourne un labyrinthe par defaut a parcourir
    (de taille 13x18)
    """
    laby = []
    laby +=[[1,1,1,1,1,1,1,1,1,1,1,1,1]]
    laby +=[[1,0,0,0,1,0,0,0,0,0,0,0,1]]
    laby +=[[1,1,1,0,1,0,1,1,0,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,0,1,0,0,1,0,1,0,0,1,0,1]]
    laby +=[[1,0,1,0,1,1,0,1,0,1,1,0,1]]
    laby +=[[1,0,0,0,0,1,0,0,0,1,0,0,1]]
    laby +=[[1,0,1,1,0,1,1,0,1,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,1,0,0,0,0,0,1]]
    laby +=[[1,1,0,1,1,0,1,1,0,1,1,0,1]]
    laby +=[[1,0,0,1,0,0,0,0,0,1,0,0,1]]
    laby +=[[1,0,1,1,1,1,1,1,1,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,1,1,0,1,1,1,1,1,1,1,0,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,0,1,1,1,1,1,0,1,1,0,1,1]]
    laby +=[[1,0,0,0,0,0,0,0,0,0,0,0,1]]
    laby +=[[1,1,1,1,1,1,1,1,1,1,1,1,1]]

    # nouveau laby
    return transpose(laby)


###################

def getLabyrinthe(nom):
    """
    donne un labyrinthe en fonction du nom passe en parametre
    """
    # laby par defaut
    if nom == "default" or nom == "Default" :
        return getLabyrintheDefaut()

    if nom == "moyen" or nom == "Moyen" :
        return getLabyrintheMoyen()

    if nom == "grand" or nom == "Grand" :
        return getLabyrintheGrand()

    if nom == "tresgrand" or nom == "tresGrand" or nom == "TresGrand" :
        return getLabyrintheTresGrand()

    print ("**ERROR** Labyrinthe inexistant => par defaut")
    return getLabyrintheDefaut()


####################

def dessinerChemin(tab):
    """
    permet de dessiner une matrice de distance dans un labyrinthe
    """
    # dessine les lignes
    for j in range(0,len(tab)):

        # pour chaque colonnee
        for i in range(0,len(tab)):
            # recupere la valeur calculee
            val=tab[i][j]

            # si c'est 1000, c'est une case non visitee
            if val==1000:
                print("   ",end=' ')
            else:
                print(val,end=' ')
                if val<0:
                        val=-val*10
                if val==0:
                    val=1
                while (val<100):
                    val=val*10
                    print(' ',end='')
        print()

###################

def main(nameLaby):
    """
    code appele par le __main__
    creer et dessine un Labyrinthe
    """
    # creer un labyrinthe
    laby=getLabyrinthe(nameLaby)
    # affiche le labyrinthe dans la console
    dessinerTableau(laby)


################# Lancement ####################


import sys


if __name__ == "__main__":
    # labyrinthe a afficher
    nameLaby=""

    # si trop d'arguments, exit'
    if len(sys.argv) > 2 :
        print ("**ERROR** un seul argument max")
        print ("")
        print ("USAGE :")
        print ("'laby [name]'")
        print ("- avec name désignant le labyrinthe ('default' ou 'grand')")

    # si pas d'argument, labyrinthe defaut
    if len(sys.argv) == 1 :
        nameLaby = "default"
    # sinon arg 1 doit contenir le nom du labyrinthe
    else :
        nameLaby = sys.argv[1]

    main(nameLaby)
