""" Ce programme permet de lire le fichier "ma_rue.txt" et de le convertir de façon à pouvoir afficher une rue correspondant aux informations écrites (si les règles du "README.txt" sont respectées) """ # Importation from rue import couleur_aleatoire,couleur_aleatoire_fonce,dessiner_rue_decrite import random as rd obj_rue = open('ma_rue.txt', 'r', encoding="utf-8") # Constantes LIGNE = [] for a in obj_rue: LIGNE.append(a) NB = int(LIGNE[0][0]) COULEURS = ('yellow', 'magenta', 'green', 'cyan') obj_rue.close() # Fonction privées def lire_ligne_liste(l) -> list : """ Transforme une ligne de description d'un immeuble en une liste formatée pour générer ses attributs. Cette fonction prend en entrée une chaîne représentant les caractéristiques d'un immeuble, séparées par ' - ', et retourne une liste contenant ces attributs. Les valeurs incorrectes ou non spécifiées sont remplacées par "aléatoire". Paramètres: l (str): La ligne de description de l'immeuble sous forme de chaîne. Retourne: list: Une liste contenant les attributs de l'immeuble dans l'ordre suivant : - Couleur de la façade - Nombre d'étages - Position de la porte (0 = gauche, 1 = milieu, 2 = droite) - Type de toit (False = rectangle, True = triangle) - Type de fenêtre (0 = simple, 1 = balcon, 2 = carreaux) Les valeurs non spécifiées ou incorrectes sont remplacées par "aléatoire". """ l = l.split(' - ') if l[0] not in COULEURS : l[0] = 'aléatoire' if type(int(l[1])) != int : l[1] = 'aléatoire' else : l[1] = int(l[1]) if l[2] == "gauche" : l[2] = 0 elif l[2] == "mileu" : l[2] = 1 elif l[2] == 'droite' : l[2] = 2 else : l[2] = 'aléatoire' if l[3] == 'lisse' : l[3] = False elif l[3] == 'pointu' : l[3] = True else : l[3] = 'aléatoire' if l[4] == 'careaux\n' or l[4] == 'careaux' : l[4] = 2 elif l[4] == 'balcon\n' or l[4] == 'balcon' : l[4] = 1 elif l[4] == 'simple\n' or l[4] == 'simple' : l[4] = 0 else : l[4] = 'aléatoire' return l #Fonctions Publiques def lire_rue() -> list : """ Génère la description complète d'une rue en créant une liste de dictionnaires, chaque dictionnaire représentant un immeuble. Cette fonction utilise les données de la liste LIGNE pour lire les attributs de chaque immeuble. Lorsqu'une valeur n'est pas définie, elle est remplacée par une valeur par défaut ou générée aléatoirement. Retourne: list: Une liste de dictionnaires, chaque dictionnaire contient les informations de l'immeuble suivant : - 'couleur_facade' (str) : couleur de la façade - 'numero' (int) : numéro de l'immeuble dans la rue - 'nb_etage' (int) : nombre d'étages (entre 1 et 5 par défaut) - 'pos_porte' (int) : position de la porte (0 = gauche, 1 = milieu, 2 = droite) - 'couleur_porte' (str) : couleur de la porte - 'type_fenetre' (list) : type de chaque fenêtre (0 = normal, 1 = balcon, 2 = carreaux) - 'type_toit' (bool) : forme du toit (False = rectangle, True = triangle) """ rue = [] for i in range(NB) : informations = {} liste = lire_ligne_liste(LIGNE[i+1]) #info immeuble if liste[0] != 'aléatoire' : informations['couleur_facade'] = liste[0] else : informations['couleur_facade'] = couleur_aleatoire() informations['numero'] = i if liste[1] != 'aléatoire' : informations['nb_etage'] = liste[1] else : informations['nb_etage'] = rd.randint(1,5) #info porte if liste[2] != 'aléatoire' : informations['pos_porte'] = liste[2] else : informations['pos_porte'] = rd.randint(0,2) informations['couleur_porte'] = couleur_aleatoire_fonce() #info fenetre informations['type_fenetre'] = [] if liste[4] == 2 : for _ in range(int(informations['nb_etage'])*3) : informations['type_fenetre'].append(2) # 0 -> normal, 1 -> balcon, 2 -> carreaux elif liste[4] == 1 : for _ in range(int(informations['nb_etage'])*3) : informations['type_fenetre'].append(1) # 0 -> normal, 1 -> balcon, 2 -> carreaux elif liste[4] == 0 : for _ in range(int(informations['nb_etage'])*3) : informations['type_fenetre'].append(0) # 0 -> normal, 1 -> balcon, 2 -> carreaux else : for _ in range(int(informations['nb_etage'])*3) : informations['type_fenetre'].append(rd.randint(0,2)) # 0 -> normal, 1 -> balcon, 2 -> carreaux #info toit if liste[3] != 'aléatoire' : informations['type_toit'] = liste[3] # False -> rectangle, True -> triangle else : informations['type_toit'] = bool(rd.randint(0,1)) rue.append(informations) return rue dessiner_rue_decrite(lire_rue())