You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
5.2 KiB

"""
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())